[PATCH 1/1] Fix 64bit Mapple Host Bridge Address and Size Nodes

Tiejun Chen tiejun.china at gmail.com
Thu Feb 26 21:08:04 EST 2009


In the DTB tree created by firmware on Maple 64bit target, host bridge
parent
node has specified both of these two properties to be 2. However, the actual
"cell" value for host bridge node is 1. we have to provide one fixup
function.

Signed-off-by: Tiejun Chen <tiejun.china at gmail.com>
---
 arch/powerpc/kernel/prom_init.c |   42
+++++++++++++++++++++++++++++++++++++++
 1 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/kernel/prom_init.c
b/arch/powerpc/kernel/prom_init.c
index 2445945..9cd23b6 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -1948,8 +1948,49 @@ static void __init fixup_device_tree_maple(void)
       prom_setprop(isa, name, "ranges",
                       isa_ranges, sizeof(isa_ranges));
 }
+
+/* On Maple 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_maple_hb(void)
+{
+       phandle hb;
+       u32 hb_ranges[4];
+       u32 size_cell, addr_cell;
+       struct prom_t *_prom = &RELOC(prom);
+       char *name;
+
+       name = "/hostbridge at 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 Maple/Apache...\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));
+}
+
 #else
 #define fixup_device_tree_maple()
+#define fixup_device_tree_maple_hb()
 #endif

 #ifdef CONFIG_PPC_CHRP
@@ -2190,6 +2231,7 @@ static void __init fixup_device_tree_efika(void)
 static void __init fixup_device_tree(void)
 {
       fixup_device_tree_maple();
+       fixup_device_tree_maple_hb();
       fixup_device_tree_chrp();
       fixup_device_tree_pmac();
       fixup_device_tree_efika();
--
1.5.6
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20090226/e3665d47/attachment.htm>


More information about the Linuxppc-dev mailing list