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