diff options
author | Becky Bruce <bgill@freescale.com> | 2008-02-15 13:17:14 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2008-02-19 21:33:37 -0500 |
commit | abe768858a54e96f0b2c0585db397107ed1bd213 (patch) | |
tree | dd3fb2855fb546572f4b4a85da6dc34cccfd43a7 /arch | |
parent | 66200ea2228da6aaf317d21e67b1157aae7168e7 (diff) |
[POWERPC] Fix dt_mem_next_cell() to read the full address
dt_mem_next_cell() currently does of_read_ulong(). This does not
allow for the case where #size-cells and/or #address-cells = 2 on a
32-bit system, as it will end up reading 32 bits instead of the
expected 64. Change it to use of_read_number instead and always
return a u64.
Signed-off-by: Becky Bruce <becky.bruce at freescale.com>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/kernel/prom.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 8b5efbce8d90..eac97f48b9b8 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -865,12 +865,12 @@ static int __init early_init_dt_scan_root(unsigned long node, | |||
865 | return 1; | 865 | return 1; |
866 | } | 866 | } |
867 | 867 | ||
868 | static unsigned long __init dt_mem_next_cell(int s, cell_t **cellp) | 868 | static u64 __init dt_mem_next_cell(int s, cell_t **cellp) |
869 | { | 869 | { |
870 | cell_t *p = *cellp; | 870 | cell_t *p = *cellp; |
871 | 871 | ||
872 | *cellp = p + s; | 872 | *cellp = p + s; |
873 | return of_read_ulong(p, s); | 873 | return of_read_number(p, s); |
874 | } | 874 | } |
875 | 875 | ||
876 | #ifdef CONFIG_PPC_PSERIES | 876 | #ifdef CONFIG_PPC_PSERIES |
@@ -883,8 +883,8 @@ static unsigned long __init dt_mem_next_cell(int s, cell_t **cellp) | |||
883 | static int __init early_init_dt_scan_drconf_memory(unsigned long node) | 883 | static int __init early_init_dt_scan_drconf_memory(unsigned long node) |
884 | { | 884 | { |
885 | cell_t *dm, *ls; | 885 | cell_t *dm, *ls; |
886 | unsigned long l, n; | 886 | unsigned long l, n, flags; |
887 | unsigned long base, size, lmb_size, flags; | 887 | u64 base, size, lmb_size; |
888 | 888 | ||
889 | ls = (cell_t *)of_get_flat_dt_prop(node, "ibm,lmb-size", &l); | 889 | ls = (cell_t *)of_get_flat_dt_prop(node, "ibm,lmb-size", &l); |
890 | if (ls == NULL || l < dt_root_size_cells * sizeof(cell_t)) | 890 | if (ls == NULL || l < dt_root_size_cells * sizeof(cell_t)) |
@@ -959,14 +959,15 @@ static int __init early_init_dt_scan_memory(unsigned long node, | |||
959 | uname, l, reg[0], reg[1], reg[2], reg[3]); | 959 | uname, l, reg[0], reg[1], reg[2], reg[3]); |
960 | 960 | ||
961 | while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) { | 961 | while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) { |
962 | unsigned long base, size; | 962 | u64 base, size; |
963 | 963 | ||
964 | base = dt_mem_next_cell(dt_root_addr_cells, ®); | 964 | base = dt_mem_next_cell(dt_root_addr_cells, ®); |
965 | size = dt_mem_next_cell(dt_root_size_cells, ®); | 965 | size = dt_mem_next_cell(dt_root_size_cells, ®); |
966 | 966 | ||
967 | if (size == 0) | 967 | if (size == 0) |
968 | continue; | 968 | continue; |
969 | DBG(" - %lx , %lx\n", base, size); | 969 | DBG(" - %llx , %llx\n", (unsigned long long)base, |
970 | (unsigned long long)size); | ||
970 | #ifdef CONFIG_PPC64 | 971 | #ifdef CONFIG_PPC64 |
971 | if (iommu_is_off) { | 972 | if (iommu_is_off) { |
972 | if (base >= 0x80000000ul) | 973 | if (base >= 0x80000000ul) |