aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/prom.c
diff options
context:
space:
mode:
authorKumar Gala <galak@gate.crashing.org>2006-01-11 18:57:13 -0500
committerPaul Mackerras <paulus@samba.org>2006-01-12 04:09:29 -0500
commitcbbcf3401173f11f7e4c03c7ec8955ea29cd83b5 (patch)
tree3728682606776f026ac120fee00db7d8ddbaa108 /arch/powerpc/kernel/prom.c
parentea183a957abea8e05530a4536a9c2db16e9fdd85 (diff)
[PATCH] powerpc: Fixed memory reserve map layout
powerpc: Fixed memory reserve map layout The memory reserve map is suppose to be a pair of 64-bit integers to represent each region. On ppc32 the code was treating the pair as two 32-bit integers. Additional the prom_init code was producing the wrong layout on ppc32. Added a simple check to try to provide backwards compatibility. Signed-off-by: Kumar Gala <galak@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/kernel/prom.c')
-rw-r--r--arch/powerpc/kernel/prom.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
index 34ab0daec3a7..02e2115323e4 100644
--- a/arch/powerpc/kernel/prom.c
+++ b/arch/powerpc/kernel/prom.c
@@ -1100,17 +1100,37 @@ static int __init early_init_dt_scan_memory(unsigned long node,
1100 1100
1101static void __init early_reserve_mem(void) 1101static void __init early_reserve_mem(void)
1102{ 1102{
1103 unsigned long base, size; 1103 u64 base, size;
1104 unsigned long *reserve_map; 1104 u64 *reserve_map;
1105 1105
1106 reserve_map = (unsigned long *)(((unsigned long)initial_boot_params) + 1106 reserve_map = (u64 *)(((unsigned long)initial_boot_params) +
1107 initial_boot_params->off_mem_rsvmap); 1107 initial_boot_params->off_mem_rsvmap);
1108#ifdef CONFIG_PPC32
1109 /*
1110 * Handle the case where we might be booting from an old kexec
1111 * image that setup the mem_rsvmap as pairs of 32-bit values
1112 */
1113 if (*reserve_map > 0xffffffffull) {
1114 u32 base_32, size_32;
1115 u32 *reserve_map_32 = (u32 *)reserve_map;
1116
1117 while (1) {
1118 base_32 = *(reserve_map_32++);
1119 size_32 = *(reserve_map_32++);
1120 if (size_32 == 0)
1121 break;
1122 DBG("reserving: %lx -> %lx\n", base_32, size_32);
1123 lmb_reserve(base_32, size_32);
1124 }
1125 return;
1126 }
1127#endif
1108 while (1) { 1128 while (1) {
1109 base = *(reserve_map++); 1129 base = *(reserve_map++);
1110 size = *(reserve_map++); 1130 size = *(reserve_map++);
1111 if (size == 0) 1131 if (size == 0)
1112 break; 1132 break;
1113 DBG("reserving: %lx -> %lx\n", base, size); 1133 DBG("reserving: %llx -> %llx\n", base, size);
1114 lmb_reserve(base, size); 1134 lmb_reserve(base, size);
1115 } 1135 }
1116 1136