From: Sam Day <[email protected]>

qcom_parse_memory is updated to handle varying address/size cell counts,
rather than assuming a count of 2 (64 bit). This means it can now parse
/memory nodes in both arm64 and arm32 devicetrees.

Signed-off-by: Sam Day <[email protected]>
---
 arch/arm/mach-snapdragon/board.c | 42 ++++++++++++++++++++++++++--------------
 1 file changed, 28 insertions(+), 14 deletions(-)

diff --git a/arch/arm/mach-snapdragon/board.c b/arch/arm/mach-snapdragon/board.c
index 829a0109ac7..56e943058ed 100644
--- a/arch/arm/mach-snapdragon/board.c
+++ b/arch/arm/mach-snapdragon/board.c
@@ -115,8 +115,9 @@ int dram_init_banksize(void)
 static int qcom_parse_memory(const void *fdt)
 {
        int offset;
-       const fdt64_t *memory;
+       const fdt32_t *memory;
        int memsize;
+       int parent, addr_cells, size_cells, entry_cells;
        phys_addr_t ram_end = 0;
        int i, j, banks;
 
@@ -124,33 +125,46 @@ static int qcom_parse_memory(const void *fdt)
        if (offset < 0)
                return -ENODATA;
 
+       parent = fdt_parent_offset(fdt, offset);
+       if (parent < 0)
+               return -ENODATA;
+
+       addr_cells = fdt_address_cells(fdt, parent);
+       size_cells = fdt_size_cells(fdt, parent);
+       entry_cells = addr_cells + size_cells;
+       if (addr_cells <= 0 || size_cells <= 0)
+               return -ENODATA;
+
        memory = fdt_getprop(fdt, offset, "reg", &memsize);
        if (!memory)
                return -ENODATA;
 
-       banks = min(memsize / (2 * sizeof(u64)), (ulong)CONFIG_NR_DRAM_BANKS);
-
-       if (memsize / sizeof(u64) > CONFIG_NR_DRAM_BANKS * 2)
-               log_err("Provided more than the max of %d memory banks\n", 
CONFIG_NR_DRAM_BANKS);
+       banks = min(memsize / (entry_cells * (int)sizeof(fdt32_t)),
+                   (int)CONFIG_NR_DRAM_BANKS);
 
        if (banks > CONFIG_NR_DRAM_BANKS)
                log_err("Provided more memory banks than we can handle\n");
 
-       for (i = 0, j = 0; i < banks * 2; i += 2, j++) {
-               prevbl_ddr_banks[j].start = get_unaligned_be64(&memory[i]);
-               prevbl_ddr_banks[j].size = get_unaligned_be64(&memory[i + 1]);
-               if (!prevbl_ddr_banks[j].size) {
-                       j--;
+       for (i = 0, j = 0; i < banks; i++) {
+               phys_addr_t start = fdt_read_number(memory, addr_cells);
+               phys_size_t size = fdt_read_number(memory + addr_cells,
+                                                  size_cells);
+
+               memory += entry_cells;
+               if (!size)
                        continue;
-               }
-               ram_end = max(ram_end, prevbl_ddr_banks[j].start + 
prevbl_ddr_banks[j].size);
+
+               prevbl_ddr_banks[j].start = start;
+               prevbl_ddr_banks[j].size = size;
+               ram_end = max(ram_end, start + size);
+               j++;
        }
 
-       if (!banks || !prevbl_ddr_banks[0].size)
+       if (!j)
                return -ENODATA;
 
        /* Sort our RAM banks -_- */
-       qsort(prevbl_ddr_banks, banks, sizeof(prevbl_ddr_banks[0]), 
ddr_bank_cmp);
+       qsort(prevbl_ddr_banks, j, sizeof(prevbl_ddr_banks[0]), ddr_bank_cmp);
 
        gd->ram_base = prevbl_ddr_banks[0].start;
        gd->ram_size = ram_end - gd->ram_base;

-- 
2.54.0


Reply via email to