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 BaldwinReceived 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