123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- /* SPDX-License-Identifier: GPL-2.0+ */
- /*
- * Copyright (C) 2017, STMicroelectronics - All Rights Reserved
- * Author(s): Vikas Manocha, <vikas.manocha@st.com> for STMicroelectronics.
- */
- #ifndef _ASM_ARMV7_MPU_H
- #define _ASM_ARMV7_MPU_H
- #ifndef __ASSEMBLY__
- #include <linux/bitops.h>
- #endif
- #ifdef CONFIG_CPU_V7M
- #define AP_SHIFT 24
- #define XN_SHIFT 28
- #define TEX_SHIFT 19
- #define S_SHIFT 18
- #define C_SHIFT 17
- #define B_SHIFT 16
- #else /* CONFIG_CPU_V7R */
- #define XN_SHIFT 12
- #define AP_SHIFT 8
- #define TEX_SHIFT 3
- #define S_SHIFT 2
- #define C_SHIFT 1
- #define B_SHIFT 0
- #endif /* CONFIG_CPU_V7R */
- #define CACHEABLE BIT(C_SHIFT)
- #define BUFFERABLE BIT(B_SHIFT)
- #define SHAREABLE BIT(S_SHIFT)
- #define REGION_SIZE_SHIFT 1
- #define ENABLE_REGION BIT(0)
- #define DISABLE_REGION 0
- enum region_number {
- REGION_0 = 0,
- REGION_1,
- REGION_2,
- REGION_3,
- REGION_4,
- REGION_5,
- REGION_6,
- REGION_7,
- };
- enum ap {
- NO_ACCESS = 0,
- PRIV_RW_USR_NO,
- PRIV_RW_USR_RO,
- PRIV_RW_USR_RW,
- UNPREDICTABLE,
- PRIV_RO_USR_NO,
- PRIV_RO_USR_RO,
- };
- enum mr_attr {
- STRONG_ORDER = 0,
- SHARED_WRITE_BUFFERED,
- O_I_WT_NO_WR_ALLOC,
- O_I_WB_NO_WR_ALLOC,
- O_I_NON_CACHEABLE,
- O_I_WB_RD_WR_ALLOC,
- DEVICE_NON_SHARED,
- };
- enum size {
- REGION_8MB = 22,
- REGION_16MB,
- REGION_32MB,
- REGION_64MB,
- REGION_128MB,
- REGION_256MB,
- REGION_512MB,
- REGION_1GB,
- REGION_2GB,
- REGION_4GB,
- };
- enum xn {
- XN_DIS = 0,
- XN_EN,
- };
- struct mpu_region_config {
- uint32_t start_addr;
- enum region_number region_no;
- enum xn xn;
- enum ap ap;
- enum mr_attr mr_attr;
- enum size reg_size;
- };
- void disable_mpu(void);
- void enable_mpu(void);
- int mpu_enabled(void);
- void mpu_config(struct mpu_region_config *reg_config);
- void setup_mpu_regions(struct mpu_region_config *rgns, u32 num_rgns);
- static inline u32 get_attr_encoding(u32 mr_attr)
- {
- u32 attr;
- switch (mr_attr) {
- case STRONG_ORDER:
- attr = SHAREABLE;
- break;
- case SHARED_WRITE_BUFFERED:
- attr = BUFFERABLE;
- break;
- case O_I_WT_NO_WR_ALLOC:
- attr = CACHEABLE;
- break;
- case O_I_WB_NO_WR_ALLOC:
- attr = CACHEABLE | BUFFERABLE;
- break;
- case O_I_NON_CACHEABLE:
- attr = 1 << TEX_SHIFT;
- break;
- case O_I_WB_RD_WR_ALLOC:
- attr = (1 << TEX_SHIFT) | CACHEABLE | BUFFERABLE;
- break;
- case DEVICE_NON_SHARED:
- attr = (2 << TEX_SHIFT) | BUFFERABLE;
- break;
- default:
- attr = 0; /* strongly ordered */
- break;
- };
- return attr;
- }
- #endif /* _ASM_ARMV7_MPU_H */
|