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

login
register
mail settings
Submitter Tiejun Chen
Date Feb. 26, 2009, 10:08 a.m.
Message ID <7a800c8d0902260208g4a65b07fi1bb287910c51b342@mail.gmail.com>
Download mbox | patch
Permalink /patch/23769/
State Changes Requested, archived
Headers show

Comments

Tiejun Chen - Feb. 26, 2009, 10:08 a.m.
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@gmail.com>
---
 arch/powerpc/kernel/prom_init.c |   42
+++++++++++++++++++++++++++++++++++++++
 1 files changed, 42 insertions(+), 0 deletions(-)

 #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
Benjamin Herrenschmidt - Feb. 26, 2009, 8:28 p.m.
On Thu, 2009-02-26 at 18:08 +0800, Tiejun Chen wrote:
> 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.

Hi !

Thanks for the patch. A couple of things tho: Can you make it a bit
more robust by properly checking the board type first ?

Also, what is this "hostbridge" node ? ie, what does it represent ?

Can you send me a full dump of /proc/device-tree from the machine ?
(ie tar it up)

Finally, it looks like your patch was whitespace damaged by your mailer.

Cheers,
Ben.


> Signed-off-by: Tiejun Chen <tiejun.china@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@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
> 
> 
>
Tiejun Chen - Feb. 27, 2009, 1:55 a.m.
2009/2/27 Benjamin Herrenschmidt <benh@kernel.crashing.org>

> On Thu, 2009-02-26 at 18:08 +0800, Tiejun Chen wrote:
> > 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.
>
> Hi !
>
> Thanks for the patch. A couple of things tho: Can you make it a bit
> more robust by properly checking the board type first ?


That is ATCA 6101 and the following is from the MOTLoad firmware.
------
Copyright Motorola Inc. 1999-2006, All Rights Reserved
MOTLoad RTOS Version 2.0,  PAL Version 1.1 RM01
Built on Tue Jun 13 10:31:56 EDT 2006 by q3316c
bbs 2.0 build 38

Part Number          =01-W3930F04A
Serial Number        =0000001

MPU-Type             =PPC970FX DD3.1
MPU-Int Clock Speed  =1800MHz
Memory Speed         =333MHz

PCI bus instance 1   =64 bit, 100 MHz, PCI-X
PCI bus instance 2   =64 bit, 100 MHz, PCI-X
PCI bus instance 3   =64 bit, 100 MHz, PCI-X
PCI bus instance 4   =64 bit, 100 MHz, PCI-X
PCI bus instance 5   =32 bit, 33 MHz, PCI

HT Link instance 1   =16 bit, 400 MHz
HT Link instance 2   = 8 bit, 600 MHz
HT Link instance 3   = 8 bit, 200 MHz

MOTLoad FLASH Image  =FLASH Bank A

Local Memory Found   =080000000 (&2147483648)
User Download Buffer =0611A5000:0613A4FFF
------

Here is some board information I can know:
------
Board revision: 01
Boot loader version: 2.0
Silicon revision: 3.1 (pvr 003c 0301)
------


>
> Also, what is this "hostbridge" node ? ie, what does it represent ?


 That means IBM CPC925 system controller resided on the ATCA 6101.


>
> Can you send me a full dump of /proc/device-tree from the machine ?
> (ie tar it up)
>

See the attachment.


>
> Finally, it looks like your patch was whitespace damaged by your mailer.
>

After you confirm others is ok I will send v2 improved patch.

Thanks & Best Regards
Tiejun


>
> Cheers,
> Ben.
>
>
> > Signed-off-by: Tiejun Chen <tiejun.china@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@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
> >
> >
> >
>
>
Benjamin Herrenschmidt - March 3, 2009, 5:31 a.m.
Thanks.

Now, is there any reason you can't fold the fix inside the existing
fixup_device_tree_maple() fixup ?  IE. Does it apply to any Maple board
or only this ATCA6101 ?

If not (if it does only apply to this specific board), then give the
function a better name, such as fixup_device_tree_atca6101() and make it
check for the /model property of the device-tree to make sure you only
hit that board and nothing else.

Cheers,
Ben.
 
On Fri, 2009-02-27 at 09:55 +0800, Tiejun Chen wrote:
> 
> 
> 2009/2/27 Benjamin Herrenschmidt <benh@kernel.crashing.org>
>         On Thu, 2009-02-26 at 18:08 +0800, Tiejun Chen wrote:
>         > 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.
>         
>         
>         Hi !
>         
>         Thanks for the patch. A couple of things tho: Can you make it
>         a bit
>         more robust by properly checking the board type first ?
> 
> That is ATCA 6101 and the following is from the MOTLoad firmware.
> ------
> Copyright Motorola Inc. 1999-2006, All Rights Reserved
> MOTLoad RTOS Version 2.0,  PAL Version 1.1 RM01
> Built on Tue Jun 13 10:31:56 EDT 2006 by q3316c
> bbs 2.0 build 38
> 
> Part Number          =01-W3930F04A
> Serial Number        =0000001
> 
> MPU-Type             =PPC970FX DD3.1
> MPU-Int Clock Speed  =1800MHz
> Memory Speed         =333MHz
> 
> PCI bus instance 1   =64 bit, 100 MHz, PCI-X
> PCI bus instance 2   =64 bit, 100 MHz, PCI-X
> PCI bus instance 3   =64 bit, 100 MHz, PCI-X
> PCI bus instance 4   =64 bit, 100 MHz, PCI-X
> PCI bus instance 5   =32 bit, 33 MHz, PCI
> 
> HT Link instance 1   =16 bit, 400 MHz
> HT Link instance 2   = 8 bit, 600 MHz
> HT Link instance 3   = 8 bit, 200 MHz
> 
> MOTLoad FLASH Image  =FLASH Bank A
> 
> Local Memory Found   =080000000 (&2147483648)
> User Download Buffer =0611A5000:0613A4FFF
> ------
> 
> Here is some board information I can know:
> ------
> Board revision: 01
> Boot loader version: 2.0
> Silicon revision: 3.1 (pvr 003c 0301) 
> ------
> 
> 
>         
>         
>         Also, what is this "hostbridge" node ? ie, what does it
>         represent ?
> 
>  That means IBM CPC925 system controller resided on the ATCA 6101.
> 
> 
>         
>         
>         Can you send me a full dump of /proc/device-tree from the
>         machine ?
>         (ie tar it up)
> 
> See the attachment.
>  
> 
>         
>         Finally, it looks like your patch was whitespace damaged by
>         your mailer.
> 
> After you confirm others is ok I will send v2 improved patch.
> 
> Thanks & Best Regards
> Tiejun
>  
>         
>         Cheers,
>         Ben.
>         
>         
>         
>         > Signed-off-by: Tiejun Chen <tiejun.china@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@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
>         >
>         >
>         >
>         
>         
>

Patch

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@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()