Re: NEW_PCIB? pcib1: failed to allocate initial I/O port window: 0x4000-0x4fff

From: John Baldwin <jhb_at_freebsd.org>
Date: Mon, 6 Jun 2011 10:51:30 -0400
On Sunday, June 05, 2011 8:23:53 pm John wrote:
> Hi Folks,
> 
>    I just attempted to update an HP385G0 system from current as of
> 4-15-2011 to 6-2-2011. The new system will not boot, and shows the
> following message when it hangs:
> 
> pcib1:<ACPI PCI-PCI bridge> at device 3.0 on pci0
> pcib1: failed to allocate initial I/O port window: 0x4000-0x4fff
> 
>    From a booting system, device 3.0 shows the following in dmesg:
> 
> pcib1: <ACPI PCI-PCI bridge> at device 3.0 on pci0
> vgapci0: <VGA-compatible display> port 0x4400-0x44ff mem 
0xf6000000-0xf6ffffff,0xf5ff0000-0xf5ff0fff at device 3.0 on pci1
> 
>    From reading other msgs that seem related to this problem, I've
> attached the dmesg, devinfo -ur, and devinfo -rv below.
> 
>    Thanks for any help solving this.

Please try this patch:

Index: dev/acpica/acpi_pcib_pci.c
===================================================================
--- dev/acpica/acpi_pcib_pci.c	(revision 222747)
+++ dev/acpica/acpi_pcib_pci.c	(working copy)
_at__at_ -114,13 +114,16 _at__at_
 acpi_pcib_pci_attach(device_t dev)
 {
     struct acpi_pcib_softc *sc;
+    int error;
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
     pcib_attach_common(dev);
     sc = device_get_softc(dev);
     sc->ap_handle = acpi_get_handle(dev);
-    return (acpi_pcib_attach(dev, &sc->ap_prt, sc->ap_pcibsc.secbus));
+    error = acpi_pcib_attach(dev, &sc->ap_prt, sc->ap_pcibsc.secbus);
+    pcib_attach_final(dev);
+    return (error);
 }
 
 static int
Index: dev/pci/pci_pci.c
===================================================================
--- dev/pci/pci_pci.c	(revision 222747)
+++ dev/pci/pci_pci.c	(working copy)
_at__at_ -162,8 +162,13 _at__at_
 {
 	device_t dev;
 	uint32_t val;
+	uint16_t cmd;
 
 	dev = sc->dev;
+	cmd = pci_read_config(dev, PCIR_COMMAND, 2);
+	if (cmd & (PCIM_CMD_PORTEN | PCIM_CMD_MEMEN))
+		pci_write_config(dev, PCIR_COMMAND,
+		    cmd & ~(PCIM_CMD_PORTEN | PCIM_CMD_MEMEN), 2);
 	if (sc->io.valid && mask & WIN_IO) {
 		val = pci_read_config(dev, PCIR_IOBASEL_1, 1);
 		if ((val & PCIM_BRIO_MASK) == PCIM_BRIO_32) {
_at__at_ -192,6 +197,8 _at__at_
 		pci_write_config(dev, PCIR_PMBASEL_1, sc->pmem.base >> 16, 2);
 		pci_write_config(dev, PCIR_PMLIMITL_1, sc->pmem.limit >> 16, 2);
 	}
+	if (cmd & (PCIM_CMD_PORTEN | PCIM_CMD_MEMEN))
+		pci_write_config(dev, PCIR_COMMAND, cmd, 2);
 }
 
 static void
_at__at_ -231,7 +238,7 _at__at_
 		    w->name, (uintmax_t)w->base, (uintmax_t)w->limit);
 		w->base = max_address;
 		w->limit = 0;
-		pcib_write_windows(sc, w->mask);
+		sc->win_deferred |= w->mask;
 		return;
 	}
 	pcib_activate_window(sc, type);
_at__at_ -690,22 +697,33 _at__at_
      */
 }
 
+void
+pcib_attach_final(device_t dev)
+{
+#ifdef NEW_PCIB
+    struct pcib_softc	*sc;
+
+    sc = device_get_softc(dev);
+    if (sc->win_deferred) {
+	    pcib_write_windows(sc, sc->win_deferred);
+	    sc->win_deferred = 0;
+    }
+#endif
+}
+
 int
 pcib_attach(device_t dev)
 {
     struct pcib_softc	*sc;
-    device_t		child;
+    int error;
 
     pcib_attach_common(dev);
     sc = device_get_softc(dev);
-    if (sc->secbus != 0) {
-	child = device_add_child(dev, "pci", sc->secbus);
-	if (child != NULL)
-	    return(bus_generic_attach(dev));
-    }
-
-    /* no secondary bus; we should have fixed this */
-    return(0);
+    if (sc->secbus != 0)
+	device_add_child(dev, "pci", sc->secbus);
+    error = bus_generic_attach(dev);
+    pcib_attach_final(dev);
+    return (error);
 }
 
 int
_at__at_ -1020,7 +1038,8 _at__at_
 	    ("start address is not aligned"));
 	KASSERT((w->limit & ((1ul << w->step) - 1)) == (1ul << w->step) - 1,
 	    ("end address is not aligned"));
-	pcib_write_windows(sc, w->mask);
+	if (!(sc->win_deferred & w->mask))
+		pcib_write_windows(sc, w->mask);
 	return (0);
 }
 
Index: dev/pci/pcib_private.h
===================================================================
--- dev/pci/pcib_private.h	(revision 222747)
+++ dev/pci/pcib_private.h	(working copy)
_at__at_ -75,6 +75,7 _at__at_
     struct pcib_window io;	/* I/O port window */
     struct pcib_window mem;	/* memory window */
     struct pcib_window pmem;	/* prefetchable memory window */
+    u_int	win_deferred;
 #else
     pci_addr_t	pmembase;	/* base address of prefetchable memory */
     pci_addr_t	pmemlimit;	/* topmost address of prefetchable memory */
_at__at_ -94,6 +95,7 _at__at_
     int slot, int func, uint8_t *busnum);
 int		pcib_attach(device_t dev);
 void		pcib_attach_common(device_t dev);
+void		pcib_attach_final(device_t dev);
 int		pcib_read_ivar(device_t dev, device_t child, int which, uintptr_t 
*result);
 int		pcib_write_ivar(device_t dev, device_t child, int which, uintptr_t 
value);
 struct resource *pcib_alloc_resource(device_t dev, device_t child, int type, 
int *rid, 
Index: powerpc/ofw/ofw_pcib_pci.c
===================================================================
--- powerpc/ofw/ofw_pcib_pci.c	(revision 222747)
+++ powerpc/ofw/ofw_pcib_pci.c	(working copy)
_at__at_ -126,6 +126,7 _at__at_
 ofw_pcib_pci_attach(device_t dev)
 {
 	struct ofw_pcib_softc *sc;
+	int error;
 
 	sc = device_get_softc(dev);
 	sc->ops_pcib_sc.dev = dev;
_at__at_ -138,7 +139,9 _at__at_
 
 	device_add_child(dev, "pci", -1);
 
-	return (bus_generic_attach(dev));
+	error = bus_generic_attach(dev);
+	pcib_attach_final(dev);
+	return (error);
 }
 
 static phandle_t
Index: sparc64/pci/ofw_pcib.c
===================================================================
--- sparc64/pci/ofw_pcib.c	(revision 222747)
+++ sparc64/pci/ofw_pcib.c	(working copy)
_at__at_ -116,6 +116,7 _at__at_
 ofw_pcib_attach(device_t dev)
 {
 	struct ofw_pcib_gen_softc *sc;
+	int error;
 
 	sc = device_get_softc(dev);
 
_at__at_ -135,5 +136,7 _at__at_
 	ofw_pcib_gen_setup(dev);
 	pcib_attach_common(dev);
 	device_add_child(dev, "pci", -1);
-	return (bus_generic_attach(dev));
+	error = bus_generic_attach(dev);
+	pcib_attach_final(dev);
+	return (error);
 }

-- 
John Baldwin
Received on Mon Jun 06 2011 - 12:51:32 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:14 UTC