In the DTB tree created by firmware on some Maple 64bit targets, such as ATCA6101, these two properties, address&size, should be 2. But the actual corresponding values of host bridge node are set 1 incorrectly by the firmware, we have to provide one fixup function to fix that.
Signed-off-by: Tiejun Chen <tiejun.ch...@gmail.com> --- arch/powerpc/kernel/prom_init.c | 51 ++++++++++++++++++++++++++++++++++++++- 1 files changed, 50 insertions(+), 1 deletions(-) diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 2445945..7848b45 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c @@ -1907,14 +1907,63 @@ static void __init flatten_device_tree(void) } #ifdef CONFIG_PPC_MAPLE +/* On ATCA6101 64bit target host bridge parent node has specified address and + * size properties to be 2. But the actual "cell" value for host bridge node + * is 1 since early MOTLoad internal bug. */ +static void __init fixup_device_tree_atca6101(void) +{ + phandle hb; + u32 hb_ranges[4]; + u32 size_cell, addr_cell; + struct prom_t *_prom = &RELOC(prom); + char *name; + + name = "/hostbri...@f8000000"; + hb = call_prom("finddevice", 1, 1, ADDR(name)); + if (!PHANDLE_VALID(hb)) + return; + + if (prom_getproplen(hb, "reg") != 8) + return; + + if (prom_getprop(hb, "reg", hb_ranges, (sizeof(hb_ranges))/2) + == PROM_ERROR) + return; + + prom_getprop(_prom->root, "#address-cells", &addr_cell, sizeof(addr_cell)); + prom_getprop(_prom->root, "#size-cells", &size_cell, sizeof(size_cell)); + + if ((addr_cell != 2) || (size_cell != 2) || + (hb_ranges[0] != 0xf8000000)) + return; + + prom_printf("Fixing up bogus HOSTBRIDGE reg on ATCA6101...\n"); + + hb_ranges[3] = hb_ranges[1]; + hb_ranges[1] = hb_ranges[0]; + hb_ranges[0] = hb_ranges[2] = 0; + prom_setprop(hb, name, "reg", + hb_ranges, sizeof(hb_ranges)); +} /* PIBS Version 1.05.0000 04/26/2005 has an incorrect /ht/isa/ranges property. - * The values are bad, and it doesn't even have the right number of cells. */ + * The values are bad, and it doesn't even have the right number of cells. + * Additionally, the early MOTLoad generate incorrect address&size cells on + * some Maple platform such as ATCA6101. */ static void __init fixup_device_tree_maple(void) { phandle isa; u32 rloc = 0x01002000; /* IO space; PCI device = 4 */ u32 isa_ranges[6]; char *name; + u32 node; + char prop[64]; + int model; + + /* FIXME: This may be used for more Maple targets not only ATCA6101. */ + node = call_prom("finddevice", 1, 1, ADDR("/")); + model = prom_getprop(node, "model", prop, sizeof(prop)); + if (model != PROM_ERROR && (strcmp(prop, "Motorola,ATCA-6101") == 0)) + fixup_device_tree_atca6101(); name = "/h...@0/i...@4"; isa = call_prom("finddevice", 1, 1, ADDR(name)); -- 1.5.6 _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev