diff options
| author | Hollis Blanchard <hollisb@us.ibm.com> | 2008-11-26 11:19:26 -0500 |
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2008-12-28 17:53:14 -0500 |
| commit | 6ca4f7494bde078b2b730e28e4ea1dc36a772f70 (patch) | |
| tree | 431b008ef1b85983e6ecd10e61e7ce145f8f31f7 /arch | |
| parent | f8f50b1bddd49eb171398cfc543c957884dc6e35 (diff) | |
powerpc: Force memory size to be a multiple of PAGE_SIZE
Ensure that total memory size is page-aligned, because otherwise
mark_bootmem() gets upset.
This error case was triggered by using 64 KiB pages in the kernel
while arch/powerpc/boot/4xx.c arbitrarily reduced the amount of memory
by 4096 (to work around a chip bug that affects the last 256 bytes of
physical memory).
Signed-off-by: Hollis Blanchard <hollisb@us.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/powerpc/kernel/prom.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index d8266dd61dda..6f73c739f1e2 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
| @@ -1160,6 +1160,8 @@ static inline void __init phyp_dump_reserve_mem(void) {} | |||
| 1160 | 1160 | ||
| 1161 | void __init early_init_devtree(void *params) | 1161 | void __init early_init_devtree(void *params) |
| 1162 | { | 1162 | { |
| 1163 | unsigned long limit; | ||
| 1164 | |||
| 1163 | DBG(" -> early_init_devtree(%p)\n", params); | 1165 | DBG(" -> early_init_devtree(%p)\n", params); |
| 1164 | 1166 | ||
| 1165 | /* Setup flat device-tree pointer */ | 1167 | /* Setup flat device-tree pointer */ |
| @@ -1200,7 +1202,19 @@ void __init early_init_devtree(void *params) | |||
| 1200 | early_reserve_mem(); | 1202 | early_reserve_mem(); |
| 1201 | phyp_dump_reserve_mem(); | 1203 | phyp_dump_reserve_mem(); |
| 1202 | 1204 | ||
| 1203 | lmb_enforce_memory_limit(memory_limit); | 1205 | limit = memory_limit; |
| 1206 | if (! limit) { | ||
| 1207 | unsigned long memsize; | ||
| 1208 | |||
| 1209 | /* Ensure that total memory size is page-aligned, because | ||
| 1210 | * otherwise mark_bootmem() gets upset. */ | ||
| 1211 | lmb_analyze(); | ||
| 1212 | memsize = lmb_phys_mem_size(); | ||
| 1213 | if ((memsize & PAGE_MASK) != memsize) | ||
| 1214 | limit = memsize & PAGE_MASK; | ||
| 1215 | } | ||
| 1216 | lmb_enforce_memory_limit(limit); | ||
| 1217 | |||
| 1204 | lmb_analyze(); | 1218 | lmb_analyze(); |
| 1205 | 1219 | ||
| 1206 | DBG("Phys. mem: %lx\n", lmb_phys_mem_size()); | 1220 | DBG("Phys. mem: %lx\n", lmb_phys_mem_size()); |
