Thread (1 message) 1 message, 1 author, 2009-04-13

Re: [v1 PATCH 1/1] Fix 64bit Maple Host Bridge Address and Size Nodes

From: Tiejun Chen <hidden>
Date: 2009-04-13 02:27:37

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


quoted hunk
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 <redacted>
---
 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 = "/hostbridge@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 = "/ht@0/isa@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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help