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