linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [RFC/PATCH] pci: Workaround invalid P2P bridge bus numbers
@ 2008-10-20 23:06 Benjamin Herrenschmidt
  2008-10-20 23:17 ` Jesse Barnes
  2008-10-21 14:36 ` Ayman El-Khashab
  0 siblings, 2 replies; 5+ messages in thread
From: Benjamin Herrenschmidt @ 2008-10-20 23:06 UTC (permalink / raw)
  To: Jesse Barnes; +Cc: linux-pci, AymanE, linuxppc-dev

Some firmware fail to properly configure P2P bridges, leaving them
with invalid bus numbers. In some cases, this happens on some embedded
4xx boards as the result of the kernel allocating different bus space
than the firmware does to host bridges while not setting
pcibios_assign_all_busses() for various reasons. In other cases, it can
just be bogus firmware.

This adds some sanity checking to the PCI probing code. If a bridge is
found whose primary bus number doesn't match the bus it's sitting on,
or whose secondary bus number not strictly above it's primary bus
number, then the bridge bus numbers are deconfigured in the first pass
of pci_scan_bridge() to be re-assigned in the second pass.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---

Ayman, can you double check that this variant of the patch still
fixes your problem ? Thanks !

Jesse, if it works for Ayman and you have no objection, can this
still go into 2.6.28 ? The root cause of the problem on PPC 4xx is
a bit more tricky and will be fixed later but I believe that this
added robustness to our code won't harm (and will work around the
problem until I have fixed the root cause).

 drivers/pci/probe.c |   12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

--- linux-work.orig/drivers/pci/probe.c	2008-10-21 09:47:41.000000000 +1100
+++ linux-work/drivers/pci/probe.c	2008-10-21 09:56:50.000000000 +1100
@@ -480,19 +480,27 @@ int __devinit pci_scan_bridge(struct pci
 	int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS);
 	u32 buses, i, j = 0;
 	u16 bctl;
+	int broken = 0;
 
 	pci_read_config_dword(dev, PCI_PRIMARY_BUS, &buses);
 
 	dev_dbg(&dev->dev, "scanning behind bridge, config %06x, pass %d\n",
 		buses & 0xffffff, pass);
 
+	/* Check if setup is sensible at all */
+	if (!pass &&
+	    ((buses & 0xff) != bus->number || ((buses >> 8) & 0xff) <= bus->number)) {
+		dev_dbg(&dev->dev, "bus configuration invalid, reconfiguring\n");
+		broken = 1;
+	}
+
 	/* Disable MasterAbortMode during probing to avoid reporting
 	   of bus errors (in some architectures) */ 
 	pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &bctl);
 	pci_write_config_word(dev, PCI_BRIDGE_CONTROL,
 			      bctl & ~PCI_BRIDGE_CTL_MASTER_ABORT);
 
-	if ((buses & 0xffff00) && !pcibios_assign_all_busses() && !is_cardbus) {
+	if ((buses & 0xffff00) && !pcibios_assign_all_busses() && !is_cardbus && !broken) {
 		unsigned int cmax, busnr;
 		/*
 		 * Bus already configured by firmware, process it in the first
@@ -530,7 +538,7 @@ int __devinit pci_scan_bridge(struct pci
 		 * do in the second pass.
 		 */
 		if (!pass) {
-			if (pcibios_assign_all_busses())
+			if (pcibios_assign_all_busses() || broken)
 				/* Temporarily disable forwarding of the
 				   configuration cycles on all bridges in
 				   this bus segment to avoid possible

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC/PATCH] pci: Workaround invalid P2P bridge bus numbers
  2008-10-20 23:06 [RFC/PATCH] pci: Workaround invalid P2P bridge bus numbers Benjamin Herrenschmidt
@ 2008-10-20 23:17 ` Jesse Barnes
  2008-10-21 14:36 ` Ayman El-Khashab
  1 sibling, 0 replies; 5+ messages in thread
From: Jesse Barnes @ 2008-10-20 23:17 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: linux-pci, AymanE, linuxppc-dev

On Monday, October 20, 2008 4:06 pm Benjamin Herrenschmidt wrote:
> Some firmware fail to properly configure P2P bridges, leaving them
> with invalid bus numbers. In some cases, this happens on some embedded
> 4xx boards as the result of the kernel allocating different bus space
> than the firmware does to host bridges while not setting
> pcibios_assign_all_busses() for various reasons. In other cases, it can
> just be bogus firmware.
>
> This adds some sanity checking to the PCI probing code. If a bridge is
> found whose primary bus number doesn't match the bus it's sitting on,
> or whose secondary bus number not strictly above it's primary bus
> number, then the bridge bus numbers are deconfigured in the first pass
> of pci_scan_bridge() to be re-assigned in the second pass.
>
> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> ---
>
> Ayman, can you double check that this variant of the patch still
> fixes your problem ? Thanks !

Sure, seems straightforward enough, I'll wait for Ayman's "Tested-by" before 
pushing.

Thanks,
Jesse

^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: [RFC/PATCH] pci: Workaround invalid P2P bridge bus numbers
  2008-10-20 23:06 [RFC/PATCH] pci: Workaround invalid P2P bridge bus numbers Benjamin Herrenschmidt
  2008-10-20 23:17 ` Jesse Barnes
@ 2008-10-21 14:36 ` Ayman El-Khashab
  2008-10-21 22:33   ` Benjamin Herrenschmidt
  1 sibling, 1 reply; 5+ messages in thread
From: Ayman El-Khashab @ 2008-10-21 14:36 UTC (permalink / raw)
  To: linuxppc-dev; +Cc: linux-pci

Benjamin Herrenschmidt wrote:

>=20
> Ayman, can you double check that this variant of the patch still
> fixes your problem ? Thanks !
>=20

I've tried it out and it is working correctly with my devices.  The
subordinate bus numbers on all the ports are correct.

Best Regards,
Ayman

^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: [RFC/PATCH] pci: Workaround invalid P2P bridge bus numbers
  2008-10-21 14:36 ` Ayman El-Khashab
@ 2008-10-21 22:33   ` Benjamin Herrenschmidt
  2008-10-21 22:58     ` Jesse Barnes
  0 siblings, 1 reply; 5+ messages in thread
From: Benjamin Herrenschmidt @ 2008-10-21 22:33 UTC (permalink / raw)
  To: Ayman El-Khashab; +Cc: linuxppc-dev, linux-pci

On Tue, 2008-10-21 at 09:36 -0500, Ayman El-Khashab wrote:
> > Ayman, can you double check that this variant of the patch still
> > fixes your problem ? Thanks !
> > 
> 
> I've tried it out and it is working correctly with my devices.  The
> subordinate bus numbers on all the ports are correct.

Thanks !

Cheers,
Ben.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC/PATCH] pci: Workaround invalid P2P bridge bus numbers
  2008-10-21 22:33   ` Benjamin Herrenschmidt
@ 2008-10-21 22:58     ` Jesse Barnes
  0 siblings, 0 replies; 5+ messages in thread
From: Jesse Barnes @ 2008-10-21 22:58 UTC (permalink / raw)
  To: benh; +Cc: Ayman El-Khashab, linux-pci, linuxppc-dev

On Tuesday, October 21, 2008 3:33 pm Benjamin Herrenschmidt wrote:
> On Tue, 2008-10-21 at 09:36 -0500, Ayman El-Khashab wrote:
> > > Ayman, can you double check that this variant of the patch still
> > > fixes your problem ? Thanks !
> >
> > I've tried it out and it is working correctly with my devices.  The
> > subordinate bus numbers on all the ports are correct.
>
> Thanks !

Great, pushed to linux-next.

Thanks,
Jesse

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2008-10-21 22:58 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-20 23:06 [RFC/PATCH] pci: Workaround invalid P2P bridge bus numbers Benjamin Herrenschmidt
2008-10-20 23:17 ` Jesse Barnes
2008-10-21 14:36 ` Ayman El-Khashab
2008-10-21 22:33   ` Benjamin Herrenschmidt
2008-10-21 22:58     ` Jesse Barnes

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).