| /* |
| * Copyright (c) 2017 Linaro Limited. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| #ifndef _ARM_MPU_H_ |
| #define _ARM_MPU_H_ |
| |
| #include <arch/arm/cortex_m/mpu/arm_core_mpu_dev.h> |
| |
| struct arm_mpu { |
| /* 0xE000ED90 MPU Type Register */ |
| volatile u32_t type; |
| /* 0xE000ED94 MPU Control Register */ |
| volatile u32_t ctrl; |
| /* 0xE000ED98 MPU Region Number Register */ |
| volatile u32_t rnr; |
| /* 0xE000ED9C MPU Region Base Address Register */ |
| volatile u32_t rbar; |
| /* 0xE000EDA0 MPU Region Attribute and Size Register */ |
| volatile u32_t rasr; |
| /* 0xE000EDA4 Alias of RBAR */ |
| volatile u32_t rbar_a1; |
| /* 0xE000EDA8 Alias of RASR */ |
| volatile u32_t rasr_a1; |
| /* 0xE000EDAC Alias of RBAR */ |
| volatile u32_t rbar_a2; |
| /* 0xE000EDB0 Alias of RASR */ |
| volatile u32_t rasr_a2; |
| /* 0xE000EDB4 Alias of RBAR */ |
| volatile u32_t rbar_a3; |
| /* 0xE000EDB8 Alias of RASR */ |
| volatile u32_t rasr_a3; |
| }; |
| |
| #define ARM_MPU_BASE 0xE000ED90 |
| |
| /* ARM MPU CTRL Register */ |
| /* Enable MPU */ |
| #define ARM_MPU_ENABLE (1 << 0) |
| /* Enable MPU during hard fault, NMI, and FAULTMASK handlers */ |
| #define ARM_MPU_HFNMIENA (1 << 1) |
| /* Enable privileged software access to the default memory map */ |
| #define ARM_MPU_PRIVDEFENA (1 << 2) |
| |
| #define REGION_VALID (1 << 4) |
| /* ARM MPU RBAR Register */ |
| /* Region base address mask */ |
| #define REGION_BASE_ADDR_MASK 0xFFFFFFE0 |
| |
| /* ARM MPU RASR Register */ |
| /* Region enable bit offset */ |
| #define REGION_ENABLE_OFFSET (0) |
| /* Region enable bit mask */ |
| #define REGION_ENABLE_MASK (0x1 << REGION_ENABLE_OFFSET) |
| /* Region size bit offset */ |
| #define REGION_SIZE_OFFSET (1) |
| /* Region size bit mask */ |
| #define REGION_SIZE_MASK (0x1F << REGION_SIZE_OFFSET) |
| /* Access permissions bit offset */ |
| #define ACCESS_PERMS_OFFSET (24) |
| /* Access permissions bit mask */ |
| #define ACCESS_PERMS_MASK (0x7 << ACCESS_PERMS_OFFSET) |
| |
| |
| /* eXecute Never */ |
| #define NOT_EXEC (0x1 << 28) |
| |
| /* Privileged No Access, Unprivileged No Access */ |
| #define NO_ACCESS (0x0 << 24) |
| /* Privileged No Access, Unprivileged No Access */ |
| #define P_NA_U_NA (0x0 << 24) |
| /* Privileged Read Write, Unprivileged No Access */ |
| #define P_RW_U_NA (0x1 << 24) |
| /* Privileged Read Write, Unprivileged Read Only */ |
| #define P_RW_U_RO (0x2 << 24) |
| /* Privileged Read Write, Unprivileged Read Write */ |
| #define P_RW_U_RW (0x3 << 24) |
| /* Privileged Read Write, Unprivileged Read Write */ |
| #define FULL_ACCESS (0x3 << 24) |
| /* Privileged Read Only, Unprivileged No Access */ |
| #define P_RO_U_NA (0x5 << 24) |
| /* Privileged Read Only, Unprivileged Read Only */ |
| #define P_RO_U_RO (0x6 << 24) |
| /* Privileged Read Only, Unprivileged Read Only */ |
| #define RO (0x7 << 24) |
| |
| #define STRONGLY_ORDERED_SHAREABLE (1 << 18) |
| #define DEVICE_SHAREABLE ((1 << 16) | (1 << 18)) |
| #define NORMAL_OUTER_INNER_WRITE_THROUGH_SHAREABLE ((1 << 17) | (1 << 18)) |
| #define NORMAL_OUTER_INNER_WRITE_THROUGH_NON_SHAREABLE (1 << 17) |
| #define NORMAL_OUTER_INNER_WRITE_BACK_SHAREABLE \ |
| ((1 << 17) | (1 << 16) | (1 << 18)) |
| #define NORMAL_OUTER_INNER_WRITE_BACK_NON_SHAREABLE ((1 << 17) | (1 << 16)) |
| #define NORMAL_OUTER_INNER_NON_CACHEABLE_SHAREABLE ((1 << 19) | (1 << 18)) |
| #define NORMAL_OUTER_INNER_NON_CACHEABLE_NON_SHAREABLE (1 << 19) |
| #define NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_SHAREABLE \ |
| ((1 << 19) | (1 << 17) | (1 << 16) | (1 << 18)) |
| #define NORMAL_OUTER_INNER_WRITE_BACK_WRITE_READ_ALLOCATE_NONSHAREABLE \ |
| ((1 << 19) | (1 << 17) | (1 << 18)) |
| #define DEVICE_NON_SHAREABLE (2 << 19) |
| |
| /* Some helper defines for common regions */ |
| #define REGION_USER_RAM_ATTR(size) \ |
| (NORMAL_OUTER_INNER_NON_CACHEABLE_NON_SHAREABLE | \ |
| NOT_EXEC | size | FULL_ACCESS) |
| #define REGION_RAM_ATTR(size) \ |
| (NORMAL_OUTER_INNER_NON_CACHEABLE_NON_SHAREABLE | \ |
| NOT_EXEC | size | P_RW_U_NA) |
| #if defined(CONFIG_MPU_ALLOW_FLASH_WRITE) |
| #define REGION_FLASH_ATTR(size) \ |
| (NORMAL_OUTER_INNER_NON_CACHEABLE_NON_SHAREABLE | size | \ |
| P_RW_U_RO) |
| #else |
| #define REGION_FLASH_ATTR(size) \ |
| (NORMAL_OUTER_INNER_NON_CACHEABLE_NON_SHAREABLE | size | RO) |
| #endif |
| #define REGION_PPB_ATTR(size) (STRONGLY_ORDERED_SHAREABLE | size | FULL_ACCESS) |
| #define REGION_IO_ATTR(size) (DEVICE_NON_SHAREABLE | size | FULL_ACCESS) |
| |
| #define SUB_REGION_0_DISABLED (0x01 << 8) |
| #define SUB_REGION_1_DISABLED (0x02 << 8) |
| #define SUB_REGION_2_DISABLED (0x04 << 8) |
| #define SUB_REGION_3_DISABLED (0x08 << 8) |
| #define SUB_REGION_4_DISABLED (0x10 << 8) |
| #define SUB_REGION_5_DISABLED (0x20 << 8) |
| #define SUB_REGION_6_DISABLED (0x40 << 8) |
| #define SUB_REGION_7_DISABLED (0x80 << 8) |
| |
| #define REGION_32B (0x04 << 1) |
| #define REGION_64B (0x05 << 1) |
| #define REGION_128B (0x06 << 1) |
| #define REGION_256B (0x07 << 1) |
| #define REGION_512B (0x08 << 1) |
| #define REGION_1K (0x09 << 1) |
| #define REGION_2K (0x0A << 1) |
| #define REGION_4K (0x0B << 1) |
| #define REGION_8K (0x0C << 1) |
| #define REGION_16K (0x0D << 1) |
| #define REGION_32K (0x0E << 1) |
| #define REGION_64K (0x0F << 1) |
| #define REGION_128K (0x10 << 1) |
| #define REGION_256K (0x11 << 1) |
| #define REGION_512K (0x12 << 1) |
| #define REGION_1M (0x13 << 1) |
| #define REGION_2M (0x14 << 1) |
| #define REGION_4M (0x15 << 1) |
| #define REGION_8M (0x16 << 1) |
| #define REGION_16M (0x17 << 1) |
| #define REGION_32M (0x18 << 1) |
| #define REGION_64M (0x19 << 1) |
| #define REGION_128M (0x1A << 1) |
| #define REGION_256M (0x1B << 1) |
| #define REGION_512M (0x1C << 1) |
| #define REGION_1G (0x1D << 1) |
| #define REGION_2G (0x1E << 1) |
| #define REGION_4G (0x1F << 1) |
| |
| #define REGION_ENABLE (1 << 0) |
| |
| /* Region definition data structure */ |
| struct arm_mpu_region { |
| /* Region Base Address */ |
| u32_t base; |
| /* Region Name */ |
| const char *name; |
| /* Region Attributes */ |
| u32_t attr; |
| }; |
| |
| #define MPU_REGION_ENTRY(_name, _base, _attr) \ |
| {\ |
| .name = _name, \ |
| .base = _base, \ |
| .attr = _attr, \ |
| } |
| |
| /* MPU configuration data structure */ |
| struct arm_mpu_config { |
| /* Number of regions */ |
| u32_t num_regions; |
| /* Regions */ |
| struct arm_mpu_region *mpu_regions; |
| }; |
| |
| /* Reference to the MPU configuration */ |
| extern struct arm_mpu_config mpu_config; |
| |
| #endif /* _ARM_MPU_H_ */ |