xref: /linux/arch/arm/include/asm/mpu.h (revision a2b45b0da8bbb98cb2f062cf16c6fdebab4243a1)
1*a2b45b0dSJonathan Austin #ifndef __ARM_MPU_H
2*a2b45b0dSJonathan Austin #define __ARM_MPU_H
3*a2b45b0dSJonathan Austin 
4*a2b45b0dSJonathan Austin #ifdef CONFIG_ARM_MPU
5*a2b45b0dSJonathan Austin 
6*a2b45b0dSJonathan Austin /* MPUIR layout */
7*a2b45b0dSJonathan Austin #define MPUIR_nU		1
8*a2b45b0dSJonathan Austin #define MPUIR_DREGION		8
9*a2b45b0dSJonathan Austin #define MPUIR_IREGION		16
10*a2b45b0dSJonathan Austin #define MPUIR_DREGION_SZMASK	(0xFF << MPUIR_DREGION)
11*a2b45b0dSJonathan Austin #define MPUIR_IREGION_SZMASK	(0xFF << MPUIR_IREGION)
12*a2b45b0dSJonathan Austin 
13*a2b45b0dSJonathan Austin /* ID_MMFR0 data relevant to MPU */
14*a2b45b0dSJonathan Austin #define MMFR0_PMSA		(0xF << 4)
15*a2b45b0dSJonathan Austin #define MMFR0_PMSAv7		(3 << 4)
16*a2b45b0dSJonathan Austin 
17*a2b45b0dSJonathan Austin /* MPU D/I Size Register fields */
18*a2b45b0dSJonathan Austin #define MPU_RSR_SZ		1
19*a2b45b0dSJonathan Austin #define MPU_RSR_EN		0
20*a2b45b0dSJonathan Austin 
21*a2b45b0dSJonathan Austin /* The D/I RSR value for an enabled region spanning the whole of memory */
22*a2b45b0dSJonathan Austin #define MPU_RSR_ALL_MEM		63
23*a2b45b0dSJonathan Austin 
24*a2b45b0dSJonathan Austin /* Individual bits in the DR/IR ACR */
25*a2b45b0dSJonathan Austin #define MPU_ACR_XN		(1 << 12)
26*a2b45b0dSJonathan Austin #define MPU_ACR_SHARED		(1 << 2)
27*a2b45b0dSJonathan Austin 
28*a2b45b0dSJonathan Austin /* C, B and TEX[2:0] bits only have semantic meanings when grouped */
29*a2b45b0dSJonathan Austin #define MPU_RGN_CACHEABLE	0xB
30*a2b45b0dSJonathan Austin #define MPU_RGN_SHARED_CACHEABLE (MPU_RGN_CACHEABLE | MPU_ACR_SHARED)
31*a2b45b0dSJonathan Austin #define MPU_RGN_STRONGLY_ORDERED 0
32*a2b45b0dSJonathan Austin 
33*a2b45b0dSJonathan Austin /* Main region should only be shared for SMP */
34*a2b45b0dSJonathan Austin #ifdef CONFIG_SMP
35*a2b45b0dSJonathan Austin #define MPU_RGN_NORMAL		(MPU_RGN_CACHEABLE | MPU_ACR_SHARED)
36*a2b45b0dSJonathan Austin #else
37*a2b45b0dSJonathan Austin #define MPU_RGN_NORMAL		MPU_RGN_CACHEABLE
38*a2b45b0dSJonathan Austin #endif
39*a2b45b0dSJonathan Austin 
40*a2b45b0dSJonathan Austin /* Access permission bits of ACR (only define those that we use)*/
41*a2b45b0dSJonathan Austin #define MPU_AP_PL1RW_PL0RW	(0x3 << 8)
42*a2b45b0dSJonathan Austin #define MPU_AP_PL1RW_PL0R0	(0x2 << 8)
43*a2b45b0dSJonathan Austin #define MPU_AP_PL1RW_PL0NA	(0x1 << 8)
44*a2b45b0dSJonathan Austin 
45*a2b45b0dSJonathan Austin /* For minimal static MPU region configurations */
46*a2b45b0dSJonathan Austin #define MPU_PROBE_REGION	0
47*a2b45b0dSJonathan Austin #define MPU_BG_REGION		1
48*a2b45b0dSJonathan Austin #define MPU_RAM_REGION		2
49*a2b45b0dSJonathan Austin 
50*a2b45b0dSJonathan Austin /* Maximum number of regions Linux is interested in */
51*a2b45b0dSJonathan Austin #define MPU_MAX_REGIONS		16
52*a2b45b0dSJonathan Austin 
53*a2b45b0dSJonathan Austin #ifndef __ASSEMBLY__
54*a2b45b0dSJonathan Austin 
55*a2b45b0dSJonathan Austin struct mpu_rgn {
56*a2b45b0dSJonathan Austin 	/* Assume same attributes for d/i-side  */
57*a2b45b0dSJonathan Austin 	u32 drbar;
58*a2b45b0dSJonathan Austin 	u32 drsr;
59*a2b45b0dSJonathan Austin 	u32 dracr;
60*a2b45b0dSJonathan Austin };
61*a2b45b0dSJonathan Austin 
62*a2b45b0dSJonathan Austin struct mpu_rgn_info {
63*a2b45b0dSJonathan Austin 	u32 mpuir;
64*a2b45b0dSJonathan Austin 	struct mpu_rgn rgns[MPU_MAX_REGIONS];
65*a2b45b0dSJonathan Austin };
66*a2b45b0dSJonathan Austin extern struct mpu_rgn_info mpu_rgn_info;
67*a2b45b0dSJonathan Austin 
68*a2b45b0dSJonathan Austin #endif /* __ASSEMBLY__ */
69*a2b45b0dSJonathan Austin 
70*a2b45b0dSJonathan Austin #endif /* CONFIG_ARM_MPU */
71*a2b45b0dSJonathan Austin 
72*a2b45b0dSJonathan Austin #endif
73