aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Murzin <vladimir.murzin@arm.com>2017-10-16 07:53:18 -0400
committerRussell King <rmk+kernel@armlinux.org.uk>2017-10-23 11:58:52 -0400
commite8b47e12d6c72f26a8ce85974f98a4050ac7ca24 (patch)
tree319cee7289dfbde0ab0703eac01a3dd5402c2457
parent877ec119dbbf9576953efc457ede5243621ad6eb (diff)
ARM: 8707/1: NOMMU: Update MPU accessors to use cp15 helpers
Currently, inline assembly for accessing to MPU's cp15 lacks volatile keyword which opens possibility to compiler to optimise such accesses as soon as we start using them more intensively. Rather than fixing inline asm, lets move MPU accessors to use cp15 helpers which do the right thing. Tested-by: Szemző András <sza@esh.hu> Tested-by: Alexandre TORGUE <alexandre.torgue@st.com> Tested-by: Benjamin Gaignard <benjamin.gaignard@linaro.org> Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-rw-r--r--arch/arm/mm/pmsa-v7.c48
1 files changed, 26 insertions, 22 deletions
diff --git a/arch/arm/mm/pmsa-v7.c b/arch/arm/mm/pmsa-v7.c
index cc987715457d..484f5aa51090 100644
--- a/arch/arm/mm/pmsa-v7.c
+++ b/arch/arm/mm/pmsa-v7.c
@@ -12,63 +12,67 @@
12 12
13#include "mm.h" 13#include "mm.h"
14 14
15#define DRBAR __ACCESS_CP15(c6, 0, c1, 0)
16#define IRBAR __ACCESS_CP15(c6, 0, c1, 1)
17#define DRSR __ACCESS_CP15(c6, 0, c1, 2)
18#define IRSR __ACCESS_CP15(c6, 0, c1, 3)
19#define DRACR __ACCESS_CP15(c6, 0, c1, 4)
20#define IRACR __ACCESS_CP15(c6, 0, c1, 5)
21#define RNGNR __ACCESS_CP15(c6, 0, c2, 0)
22
15/* Region number */ 23/* Region number */
16static void rgnr_write(u32 v) 24static inline void rgnr_write(u32 v)
17{ 25{
18 asm("mcr p15, 0, %0, c6, c2, 0" : : "r" (v)); 26 write_sysreg(v, RNGNR);
19} 27}
20 28
21/* Data-side / unified region attributes */ 29/* Data-side / unified region attributes */
22 30
23/* Region access control register */ 31/* Region access control register */
24static void dracr_write(u32 v) 32static inline void dracr_write(u32 v)
25{ 33{
26 asm("mcr p15, 0, %0, c6, c1, 4" : : "r" (v)); 34 write_sysreg(v, DRACR);
27} 35}
28 36
29/* Region size register */ 37/* Region size register */
30static void drsr_write(u32 v) 38static inline void drsr_write(u32 v)
31{ 39{
32 asm("mcr p15, 0, %0, c6, c1, 2" : : "r" (v)); 40 write_sysreg(v, DRSR);
33} 41}
34 42
35/* Region base address register */ 43/* Region base address register */
36static void drbar_write(u32 v) 44static inline void drbar_write(u32 v)
37{ 45{
38 asm("mcr p15, 0, %0, c6, c1, 0" : : "r" (v)); 46 write_sysreg(v, DRBAR);
39} 47}
40 48
41static u32 drbar_read(void) 49static inline u32 drbar_read(void)
42{ 50{
43 u32 v; 51 return read_sysreg(DRBAR);
44 asm("mrc p15, 0, %0, c6, c1, 0" : "=r" (v));
45 return v;
46} 52}
47/* Optional instruction-side region attributes */ 53/* Optional instruction-side region attributes */
48 54
49/* I-side Region access control register */ 55/* I-side Region access control register */
50static void iracr_write(u32 v) 56static inline void iracr_write(u32 v)
51{ 57{
52 asm("mcr p15, 0, %0, c6, c1, 5" : : "r" (v)); 58 write_sysreg(v, IRACR);
53} 59}
54 60
55/* I-side Region size register */ 61/* I-side Region size register */
56static void irsr_write(u32 v) 62static inline void irsr_write(u32 v)
57{ 63{
58 asm("mcr p15, 0, %0, c6, c1, 3" : : "r" (v)); 64 write_sysreg(v, IRSR);
59} 65}
60 66
61/* I-side Region base address register */ 67/* I-side Region base address register */
62static void irbar_write(u32 v) 68static inline void irbar_write(u32 v)
63{ 69{
64 asm("mcr p15, 0, %0, c6, c1, 1" : : "r" (v)); 70 write_sysreg(v, IRBAR);
65} 71}
66 72
67static unsigned long irbar_read(void) 73static inline u32 irbar_read(void)
68{ 74{
69 unsigned long v; 75 return read_sysreg(IRBAR);
70 asm("mrc p15, 0, %0, c6, c1, 1" : "=r" (v));
71 return v;
72} 76}
73 77
74/* MPU initialisation functions */ 78/* MPU initialisation functions */