cuboot-pq2: PCI fixes
PATCH RESEND 1/1 cuboot-pq2: PCI fixes
1. Detect (and bail out on) more conditions that violate the assumptions of the setup code -- we assume in such cases that the device tree is correct and reflects what the firmware did.
2. The inbound memory mask calculation was wrong.
Signed-off-by Scott Wood <[email protected]>
--- arch/powerpc/boot/cuboot-pq2.c | 27 +++++++++++++++++++-------- 1 files changed, 19 insertions(+), 8 deletions(-)
arch/powerpc/boot/cuboot-pq2.c +19 -8
@@ -128,7 +128,7 @@ static void fixup_pci(void)u8 *soc_regs;int i, len;void *node, *parent_node; -u32 naddr, nsize, mem_log2; +u32 naddr, nsize, mem_pow2, mem_mask; node =finddevice ("/pci" );if (!node || !dt_is_compatible (node,"fsl,pq2-pci" ))
@@ -141,7 +141,7 @@ static void fixup_pci(void) soc_regs = (u8 *)fsl_get_immr ();if (!soc_regs) - goto err; + goto unhandled;dt_get_reg_format (node, &naddr, &nsize);if (naddr !=3 || nsize !=2 )
@@ -153,7 +153,7 @@ static void fixup_pci(void)dt_get_reg_format (parent_node, &naddr, &nsize);if (naddr !=1 || nsize !=1 ) - goto err; + goto unhandled; len =getprop (node,"ranges" , pci_ranges_buf,sizeof (pci_ranges_buf));
@@ -170,14 +170,20 @@ static void fixup_pci(void) }if (!mem || !mmio || !io) - goto err; + goto unhandled; +if (mem->size[1 ] != mmio->size[1 ]) + goto unhandled; +if (mem->size[1 ] & (mem->size[1 ] -1 )) + goto unhandled; +if (io->size[1 ] & (io->size[1 ] -1 )) + goto unhandled;if (mem->phys_addr + mem->size[1 ] == mmio->phys_addr) mem_base = mem;else if (mmio->phys_addr + mmio->size[1 ] == mem->phys_addr) mem_base = mmio;else - goto err; + goto unhandled;out_be32 (&pci_regs[1 ][0 ], mem_base->phys_addr |1 );out_be32 (&pci_regs[2 ][0 ], ~(mem->size[1 ] + mmio->size[1 ] -1 ));
@@ -201,8 +207,9 @@ static void fixup_pci(void)out_le32 (&pci_regs[0 ][58 ],0 );out_le32 (&pci_regs[0 ][60 ],0 ); - mem_log2 =1 << (__ilog2_u32 (bd.bi_memsize -1 ) +1 ); -out_le32 (&pci_regs[0 ][62 ],0xa0000000 | ~((1 << (mem_log2 -12 )) -1 )); + mem_pow2 =1 << (__ilog2_u32 (bd.bi_memsize -1 ) +1 ); + mem_mask = ~(mem_pow2 -1 ) >>12 ; +out_le32 (&pci_regs[0 ][62 ],0xa0000000 | mem_mask);/* If PCI is disabled, drive RST high to enable. */ if (!(in_le32 (&pci_regs[0 ][32 ]) &1 )) {
@@ -228,7 +235,11 @@ static void fixup_pci(void)return ; err: -printf ("Bad PCI node\r\n" ); +printf ("Bad PCI node -- using existing firmware setup.\r\n" ); +return ; + +unhandled: +printf ("Unsupported PCI node -- using existing firmware setup.\r\n" ); }static void pq2_platform_fixups (void )
Signature · 1 line
1.5.3.8
Kumar Gala
AppliedQuoted 10 lines · Scott Wood
1. Detect (and bail out on) more conditions that violate the assumptions of the setup code -- we assume in such cases that the device tree is correct and reflects what the firmware did.
2. The inbound memory mask calculation was wrong.
Signed-off-by Scott Wood <[email protected]>---
arch/powerpc/boot/cuboot-pq2.c| 27 +++++++++++++++++++--------1 files changed, 19 insertions(+), 8 deletions(-)
applied.
- k