summaryrefslogtreecommitdiff
path: root/arch/arm/cpu/armv7m
diff options
context:
space:
mode:
authorLokesh Vutla <lokeshvutla@ti.com>2018-04-26 18:21:30 +0530
committerTom Rini <trini@konsulko.com>2018-05-07 15:53:29 -0400
commitf2ef204312480bfba7700f47c8ce9fb975c26557 (patch)
tree3fd338e772be2cbec3c1a6b4a847d7d6ae673eae /arch/arm/cpu/armv7m
parent4bbd6b1d946ab6165bff8aeae6f252faa07ce85a (diff)
downloadu-boot-f2ef204312480bfba7700f47c8ce9fb975c26557.tar.gz
arm: v7R: Add support for MPU
The Memory Protection Unit(MPU) allows to partition memory into regions and set individual protection attributes for each region. In absence of MPU a default map[1] will take effect. Add support for configuring MPU on Cortex-R, by reusing the existing support for Cortex-M processor. [1] http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0460d/I1002400.html Tested-by: Michal Simek <michal.simek@xilinx.com> Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com> Reviewed-by: Tom Rini <trini@konsulko.com>
Diffstat (limited to 'arch/arm/cpu/armv7m')
-rw-r--r--arch/arm/cpu/armv7m/Makefile3
-rw-r--r--arch/arm/cpu/armv7m/mpu.c43
2 files changed, 4 insertions, 42 deletions
diff --git a/arch/arm/cpu/armv7m/Makefile b/arch/arm/cpu/armv7m/Makefile
index 6c78d29ac4..baeac9343d 100644
--- a/arch/arm/cpu/armv7m/Makefile
+++ b/arch/arm/cpu/armv7m/Makefile
@@ -4,5 +4,6 @@
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
extra-y := start.o
-obj-y += cpu.o cache.o mpu.o
+obj-y += cpu.o cache.o
+obj-$(CONFIG_SYS_ARM_MPU) += mpu.o
obj-$(CONFIG_SYS_ARCH_TIMER) += systick-timer.o
diff --git a/arch/arm/cpu/armv7m/mpu.c b/arch/arm/cpu/armv7m/mpu.c
index d89d9f2f39..81e7492f1c 100644
--- a/arch/arm/cpu/armv7m/mpu.c
+++ b/arch/arm/cpu/armv7m/mpu.c
@@ -6,7 +6,7 @@
#include <linux/bitops.h>
#include <asm/armv7m.h>
-#include <asm/armv7m_mpu.h>
+#include <asm/armv7_mpu.h>
#include <asm/io.h>
#define V7M_MPU_CTRL_ENABLE BIT(0)
@@ -15,20 +15,6 @@
#define V7M_MPU_CTRL_PRIVDEFENA BIT(2)
#define VALID_REGION BIT(4)
-#define ENABLE_REGION BIT(0)
-
-#define AP_SHIFT 24
-#define XN_SHIFT 28
-#define TEX_SHIFT 19
-#define S_SHIFT 18
-#define C_SHIFT 17
-#define B_SHIFT 16
-#define REGION_SIZE_SHIFT 1
-
-#define CACHEABLE (1 << C_SHIFT)
-#define BUFFERABLE (1 << B_SHIFT)
-#define SHAREABLE (1 << S_SHIFT)
-
void disable_mpu(void)
{
writel(0, &V7M_MPU->ctrl);
@@ -47,32 +33,7 @@ void mpu_config(struct mpu_region_config *reg_config)
{
uint32_t attr;
- switch (reg_config->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;
- };
+ attr = get_attr_encoding(reg_config->mr_attr);
writel(reg_config->start_addr | VALID_REGION | reg_config->region_no,
&V7M_MPU->rbar);