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