1 /* SPDX-License-Identifier: GPL-2.0+ */ 2 /* 3 * Copyright (C) 2017, STMicroelectronics - All Rights Reserved 4 * Author(s): Vikas Manocha, <vikas.manocha (at) st.com> for STMicroelectronics. 5 */ 6 7 #ifndef _ASM_ARMV7_MPU_H 8 #define _ASM_ARMV7_MPU_H 9 10 #ifdef CONFIG_CPU_V7M 11 #define AP_SHIFT 24 12 #define XN_SHIFT 28 13 #define TEX_SHIFT 19 14 #define S_SHIFT 18 15 #define C_SHIFT 17 16 #define B_SHIFT 16 17 #else /* CONFIG_CPU_V7R */ 18 #define XN_SHIFT 12 19 #define AP_SHIFT 8 20 #define TEX_SHIFT 3 21 #define S_SHIFT 2 22 #define C_SHIFT 1 23 #define B_SHIFT 0 24 #endif /* CONFIG_CPU_V7R */ 25 26 #define CACHEABLE BIT(C_SHIFT) 27 #define BUFFERABLE BIT(B_SHIFT) 28 #define SHAREABLE BIT(S_SHIFT) 29 #define REGION_SIZE_SHIFT 1 30 #define ENABLE_REGION BIT(0) 31 #define DISABLE_REGION 0 32 33 enum region_number { 34 REGION_0 = 0, 35 REGION_1, 36 REGION_2, 37 REGION_3, 38 REGION_4, 39 REGION_5, 40 REGION_6, 41 REGION_7, 42 }; 43 44 enum ap { 45 NO_ACCESS = 0, 46 PRIV_RW_USR_NO, 47 PRIV_RW_USR_RO, 48 PRIV_RW_USR_RW, 49 UNPREDICTABLE, 50 PRIV_RO_USR_NO, 51 PRIV_RO_USR_RO, 52 }; 53 54 enum mr_attr { 55 STRONG_ORDER = 0, 56 SHARED_WRITE_BUFFERED, 57 O_I_WT_NO_WR_ALLOC, 58 O_I_WB_NO_WR_ALLOC, 59 O_I_NON_CACHEABLE, 60 O_I_WB_RD_WR_ALLOC, 61 DEVICE_NON_SHARED, 62 }; 63 enum size { 64 REGION_8MB = 22, 65 REGION_16MB, 66 REGION_32MB, 67 REGION_64MB, 68 REGION_128MB, 69 REGION_256MB, 70 REGION_512MB, 71 REGION_1GB, 72 REGION_2GB, 73 REGION_4GB, 74 }; 75 76 enum xn { 77 XN_DIS = 0, 78 XN_EN, 79 }; 80 81 struct mpu_region_config { 82 uint32_t start_addr; 83 enum region_number region_no; 84 enum xn xn; 85 enum ap ap; 86 enum mr_attr mr_attr; 87 enum size reg_size; 88 }; 89 90 void disable_mpu(void); 91 void enable_mpu(void); 92 int mpu_enabled(void); 93 void mpu_config(struct mpu_region_config *reg_config); 94 void setup_mpu_regions(struct mpu_region_config *rgns, u32 num_rgns); 95 96 static inline u32 get_attr_encoding(u32 mr_attr) 97 { 98 u32 attr; 99 100 switch (mr_attr) { 101 case STRONG_ORDER: 102 attr = SHAREABLE; 103 break; 104 case SHARED_WRITE_BUFFERED: 105 attr = BUFFERABLE; 106 break; 107 case O_I_WT_NO_WR_ALLOC: 108 attr = CACHEABLE; 109 break; 110 case O_I_WB_NO_WR_ALLOC: 111 attr = CACHEABLE | BUFFERABLE; 112 break; 113 case O_I_NON_CACHEABLE: 114 attr = 1 << TEX_SHIFT; 115 break; 116 case O_I_WB_RD_WR_ALLOC: 117 attr = (1 << TEX_SHIFT) | CACHEABLE | BUFFERABLE; 118 break; 119 case DEVICE_NON_SHARED: 120 attr = (2 << TEX_SHIFT) | BUFFERABLE; 121 break; 122 default: 123 attr = 0; /* strongly ordered */ 124 break; 125 }; 126 127 return attr; 128 } 129 130 #endif /* _ASM_ARMV7_MPU_H */ 131