diff options
author | Jean-Philippe Brucker <jean-philippe.brucker@arm.com> | 2016-05-04 05:37:22 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@armlinux.org.uk> | 2016-05-05 14:03:01 -0400 |
commit | 695665b0c5237bee8a3d0099ea856282d5d8f25b (patch) | |
tree | 219eb0f8229ded4af09f7eefd38f9c59f4ef6105 | |
parent | ac36a881b72a1e9831f1c59abf935868c90685cf (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.c | 13 |
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 */ |
88 | void __init sanity_check_meminfo_mpu(void) | 88 | void __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, ®->base); | 116 | &mem_end, ®->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); |