mpu.h (9cfb541a4ad45168925078f7d1fe3a7363ba27e2) mpu.h (046835b4aa22b9ab6aa0bb274e3b71047c4b887d)
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ARM_MPU_H
3#define __ARM_MPU_H
4
5/* MPUIR layout */
6#define MPUIR_nU 1
7#define MPUIR_DREGION 8
8#define MPUIR_IREGION 16
9#define MPUIR_DREGION_SZMASK (0xFF << MPUIR_DREGION)
10#define MPUIR_IREGION_SZMASK (0xFF << MPUIR_IREGION)
11
12/* ID_MMFR0 data relevant to MPU */
13#define MMFR0_PMSA (0xF << 4)
14#define MMFR0_PMSAv7 (3 << 4)
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __ARM_MPU_H
3#define __ARM_MPU_H
4
5/* MPUIR layout */
6#define MPUIR_nU 1
7#define MPUIR_DREGION 8
8#define MPUIR_IREGION 16
9#define MPUIR_DREGION_SZMASK (0xFF << MPUIR_DREGION)
10#define MPUIR_IREGION_SZMASK (0xFF << MPUIR_IREGION)
11
12/* ID_MMFR0 data relevant to MPU */
13#define MMFR0_PMSA (0xF << 4)
14#define MMFR0_PMSAv7 (3 << 4)
15#define MMFR0_PMSAv8 (4 << 4)
15
16/* MPU D/I Size Register fields */
17#define PMSAv7_RSR_SZ 1
18#define PMSAv7_RSR_EN 0
19#define PMSAv7_RSR_SD 8
20
21/* Number of subregions (SD) */
22#define PMSAv7_NR_SUBREGS 8

--- 19 unchanged lines hidden (view full) ---

42#endif
43
44/* Access permission bits of ACR (only define those that we use)*/
45#define PMSAv7_AP_PL1RO_PL0NA (0x5 << 8)
46#define PMSAv7_AP_PL1RW_PL0RW (0x3 << 8)
47#define PMSAv7_AP_PL1RW_PL0R0 (0x2 << 8)
48#define PMSAv7_AP_PL1RW_PL0NA (0x1 << 8)
49
16
17/* MPU D/I Size Register fields */
18#define PMSAv7_RSR_SZ 1
19#define PMSAv7_RSR_EN 0
20#define PMSAv7_RSR_SD 8
21
22/* Number of subregions (SD) */
23#define PMSAv7_NR_SUBREGS 8

--- 19 unchanged lines hidden (view full) ---

43#endif
44
45/* Access permission bits of ACR (only define those that we use)*/
46#define PMSAv7_AP_PL1RO_PL0NA (0x5 << 8)
47#define PMSAv7_AP_PL1RW_PL0RW (0x3 << 8)
48#define PMSAv7_AP_PL1RW_PL0R0 (0x2 << 8)
49#define PMSAv7_AP_PL1RW_PL0NA (0x1 << 8)
50
51#define PMSAv8_BAR_XN 1
52
53#define PMSAv8_LAR_EN 1
54#define PMSAv8_LAR_IDX(n) (((n) & 0x7) << 1)
55
56
57#define PMSAv8_AP_PL1RW_PL0NA (0 << 1)
58#define PMSAv8_AP_PL1RW_PL0RW (1 << 1)
59#define PMSAv8_AP_PL1RO_PL0RO (3 << 1)
60
61#ifdef CONFIG_SMP
62#define PMSAv8_RGN_SHARED (3 << 3) // inner sharable
63#else
64#define PMSAv8_RGN_SHARED (0 << 3)
65#endif
66
67#define PMSAv8_RGN_DEVICE_nGnRnE 0
68#define PMSAv8_RGN_NORMAL 1
69
70#define PMSAv8_MAIR(attr, mt) ((attr) << ((mt) * 8))
71
72#ifdef CONFIG_CPU_V7M
73#define PMSAv8_MINALIGN 32
74#else
75#define PMSAv8_MINALIGN 64
76#endif
77
50/* For minimal static MPU region configurations */
51#define PMSAv7_PROBE_REGION 0
52#define PMSAv7_BG_REGION 1
53#define PMSAv7_RAM_REGION 2
54#define PMSAv7_ROM_REGION 3
55
78/* For minimal static MPU region configurations */
79#define PMSAv7_PROBE_REGION 0
80#define PMSAv7_BG_REGION 1
81#define PMSAv7_RAM_REGION 2
82#define PMSAv7_ROM_REGION 3
83
84/* Fixed for PMSAv8 only */
85#define PMSAv8_XIP_REGION 0
86#define PMSAv8_KERNEL_REGION 1
87
56/* Maximum number of regions Linux is interested in */
57#define MPU_MAX_REGIONS 16
58
59#define PMSAv7_DATA_SIDE 0
60#define PMSAv7_INSTR_SIDE 1
61
62#ifndef __ASSEMBLY__
63
64struct mpu_rgn {
65 /* Assume same attributes for d/i-side */
88/* Maximum number of regions Linux is interested in */
89#define MPU_MAX_REGIONS 16
90
91#define PMSAv7_DATA_SIDE 0
92#define PMSAv7_INSTR_SIDE 1
93
94#ifndef __ASSEMBLY__
95
96struct mpu_rgn {
97 /* Assume same attributes for d/i-side */
66 u32 drbar;
67 u32 drsr;
68 u32 dracr;
98 union {
99 u32 drbar; /* PMSAv7 */
100 u32 prbar; /* PMSAv8 */
101 };
102 union {
103 u32 drsr; /* PMSAv7 */
104 u32 prlar; /* PMSAv8 */
105 };
106 union {
107 u32 dracr; /* PMSAv7 */
108 u32 unused; /* not used in PMSAv8 */
109 };
69};
70
71struct mpu_rgn_info {
72 unsigned int used;
73 struct mpu_rgn rgns[MPU_MAX_REGIONS];
74};
75extern struct mpu_rgn_info mpu_rgn_info;
76
77#ifdef CONFIG_ARM_MPU
78extern void __init pmsav7_adjust_lowmem_bounds(void);
110};
111
112struct mpu_rgn_info {
113 unsigned int used;
114 struct mpu_rgn rgns[MPU_MAX_REGIONS];
115};
116extern struct mpu_rgn_info mpu_rgn_info;
117
118#ifdef CONFIG_ARM_MPU
119extern void __init pmsav7_adjust_lowmem_bounds(void);
120extern void __init pmsav8_adjust_lowmem_bounds(void);
121
79extern void __init pmsav7_setup(void);
122extern void __init pmsav7_setup(void);
123extern void __init pmsav8_setup(void);
80#else
81static inline void pmsav7_adjust_lowmem_bounds(void) {};
124#else
125static inline void pmsav7_adjust_lowmem_bounds(void) {};
126static inline void pmsav8_adjust_lowmem_bounds(void) {};
82static inline void pmsav7_setup(void) {};
127static inline void pmsav7_setup(void) {};
128static inline void pmsav8_setup(void) {};
83#endif
84
85#endif /* __ASSEMBLY__ */
86
87#endif
129#endif
130
131#endif /* __ASSEMBLY__ */
132
133#endif