aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Brucker <jean-philippe.brucker@arm.com>2016-05-04 05:37:22 -0400
committerRussell King <rmk+kernel@armlinux.org.uk>2016-05-05 14:03:01 -0400
commit695665b0c5237bee8a3d0099ea856282d5d8f25b (patch)
tree219eb0f8229ded4af09f7eefd38f9c59f4ef6105
parentac36a881b72a1e9831f1c59abf935868c90685cf (diff)
ARM: 8571/1: nommu: fix PMSAv7 setup
Commit 1c2f87c (ARM: 8025/1: Get rid of meminfo) broke the support for MPU on ARMv7-R. This patch adapts the code inside CONFIG_ARM_MPU to use memblocks appropriately. MPU initialisation only uses the first memory region, and removes all subsequent ones. Because looping over all regions that need removal is inefficient, and memblock_remove already handles memory ranges, we can flatten the 'for_each_memblock' part. Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com> Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--arch/arm/mm/nommu.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c
index 1dd10936d68d..4d113fcceb4a 100644
--- a/arch/arm/mm/nommu.c
+++ b/arch/arm/mm/nommu.c
@@ -87,7 +87,6 @@ static unsigned long irbar_read(void)
87/* MPU initialisation functions */ 87/* MPU initialisation functions */
88void __init sanity_check_meminfo_mpu(void) 88void __init sanity_check_meminfo_mpu(void)
89{ 89{
90 int i;
91 phys_addr_t phys_offset = PHYS_OFFSET; 90 phys_addr_t phys_offset = PHYS_OFFSET;
92 phys_addr_t aligned_region_size, specified_mem_size, rounded_mem_size; 91 phys_addr_t aligned_region_size, specified_mem_size, rounded_mem_size;
93 struct memblock_region *reg; 92 struct memblock_region *reg;
@@ -110,11 +109,13 @@ void __init sanity_check_meminfo_mpu(void)
110 } else { 109 } else {
111 /* 110 /*
112 * memblock auto merges contiguous blocks, remove 111 * memblock auto merges contiguous blocks, remove
113 * all blocks afterwards 112 * all blocks afterwards in one go (we can't remove
113 * blocks separately while iterating)
114 */ 114 */
115 pr_notice("Ignoring RAM after %pa, memory at %pa ignored\n", 115 pr_notice("Ignoring RAM after %pa, memory at %pa ignored\n",
116 &mem_start, &reg->base); 116 &mem_end, &reg->base);
117 memblock_remove(reg->base, reg->size); 117 memblock_remove(reg->base, 0 - reg->base);
118 break;
118 } 119 }
119 } 120 }
120 121
@@ -144,7 +145,7 @@ void __init sanity_check_meminfo_mpu(void)
144 pr_warn("Truncating memory from %pa to %pa (MPU region constraints)", 145 pr_warn("Truncating memory from %pa to %pa (MPU region constraints)",
145 &specified_mem_size, &aligned_region_size); 146 &specified_mem_size, &aligned_region_size);
146 memblock_remove(mem_start + aligned_region_size, 147 memblock_remove(mem_start + aligned_region_size,
147 specified_mem_size - aligned_round_size); 148 specified_mem_size - aligned_region_size);
148 149
149 mem_end = mem_start + aligned_region_size; 150 mem_end = mem_start + aligned_region_size;
150 } 151 }
@@ -261,7 +262,7 @@ void __init mpu_setup(void)
261 return; 262 return;
262 263
263 region_err = mpu_setup_region(MPU_RAM_REGION, PHYS_OFFSET, 264 region_err = mpu_setup_region(MPU_RAM_REGION, PHYS_OFFSET,
264 ilog2(meminfo.bank[0].size), 265 ilog2(memblock.memory.regions[0].size),
265 MPU_AP_PL1RW_PL0RW | MPU_RGN_NORMAL); 266 MPU_AP_PL1RW_PL0RW | MPU_RGN_NORMAL);
266 if (region_err) { 267 if (region_err) {
267 panic("MPU region initialization failure! %d", region_err); 268 panic("MPU region initialization failure! %d", region_err);