Michael and Ben, If you are free please help me check this delayed patch.
For the original thread please filter email with the key words "Fix 64bit". Best Regards Tiejun > 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 > >
_______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev