UPSTREAM: fdtdec: Support parsing multiple /memory nodes
It is legal to have multiple /memory nodes in a device tree . Currently, fdtdec_setup_memory_size() only supports parsing the first node . This patch extends the function such that if a particular /memory node does no longer have further "reg" entries and CONFIG_NR_DRAM_BANKS still allows for more DRAM banks, the code moves on to the next memory node and checks it's "reg"s. This makes it possible to handle both systems with single memory node with multiple entries and systems with multiple memory nodes with single entry. Change-Id: Idc8b4bebc916b6a6bc0d2deb3c4008921d268d1e Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com> Cc: Tom Rini <trini@konsulko.com> Cc: Simon Glass <sjg@chromium.org> Signed-off-by: Kever Yang <kever.yang@rock-chips.com> (cherry picked from commit 942ee0933e881ff500aae7e42309bf6abbc495d4)
This commit is contained in:
parent
1b48bbdd20
commit
acda6ec11c
24
lib/fdtdec.c
24
lib/fdtdec.c
|
|
@ -1175,21 +1175,33 @@ int fdtdec_setup_memory_size(void)
|
|||
#if defined(CONFIG_NR_DRAM_BANKS)
|
||||
int fdtdec_setup_memory_banksize(void)
|
||||
{
|
||||
int bank, ret, mem;
|
||||
int bank, ret, mem, reg = 0;
|
||||
struct fdt_resource res;
|
||||
|
||||
mem = fdt_path_offset(gd->fdt_blob, "/memory");
|
||||
mem = fdt_node_offset_by_prop_value(gd->fdt_blob, -1, "device_type",
|
||||
"memory", 7);
|
||||
if (mem < 0) {
|
||||
debug("%s: Missing /memory node\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
|
||||
ret = fdt_get_resource(gd->fdt_blob, mem, "reg", bank, &res);
|
||||
if (ret == -FDT_ERR_NOTFOUND)
|
||||
break;
|
||||
if (ret != 0)
|
||||
ret = fdt_get_resource(gd->fdt_blob, mem, "reg", reg++, &res);
|
||||
if (ret == -FDT_ERR_NOTFOUND) {
|
||||
reg = 0;
|
||||
mem = fdt_node_offset_by_prop_value(gd->fdt_blob, mem,
|
||||
"device_type",
|
||||
"memory", 7);
|
||||
if (mem == -FDT_ERR_NOTFOUND)
|
||||
break;
|
||||
|
||||
ret = fdt_get_resource(gd->fdt_blob, mem, "reg", reg++, &res);
|
||||
if (ret == -FDT_ERR_NOTFOUND)
|
||||
break;
|
||||
}
|
||||
if (ret != 0) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
gd->bd->bi_dram[bank].start = (phys_addr_t)res.start;
|
||||
gd->bd->bi_dram[bank].size =
|
||||
|
|
|
|||
Loading…
Reference in New Issue