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