When memory mapped I/O isn't enabled, we disable the associated windows. Do the same for "port" I/O. Otherwise we will (incorrectly) advertise that I/O space is available to devices downstream from the bridge.
ok? Index: dev/pci/ppb.c =================================================================== RCS file: /cvs/src/sys/dev/pci/ppb.c,v retrieving revision 1.65 diff -u -p -r1.65 ppb.c --- dev/pci/ppb.c 1 Dec 2015 21:02:04 -0000 1.65 +++ dev/pci/ppb.c 6 Apr 2018 09:07:24 -0000 @@ -620,14 +620,18 @@ ppb_alloc_resources(struct ppb_softc *sc csr = pci_conf_read(pc, sc->sc_tag, PCI_COMMAND_STATUS_REG); /* - * Get the bridge in a consistent state. If memory mapped I/O - * is disabled, disabled the associated windows as well. + * Get the bridge in a consistent state. If memory mapped I/O or + * port I/O is disabled, disabled the associated windows as well. */ if ((csr & PCI_COMMAND_MEM_ENABLE) == 0) { pci_conf_write(pc, sc->sc_tag, PPB_REG_MEM, 0x0000ffff); pci_conf_write(pc, sc->sc_tag, PPB_REG_PREFMEM, 0x0000ffff); pci_conf_write(pc, sc->sc_tag, PPB_REG_PREFBASE_HI32, 0); pci_conf_write(pc, sc->sc_tag, PPB_REG_PREFLIM_HI32, 0); + } + if ((csr & PCI_COMMAND_IO_ENABLE) == 0) { + pci_conf_write(pc, sc->sc_tag, PPB_REG_IOSTATUS, 0x000000ff); + pci_conf_write(pc, sc->sc_tag, PPB_REG_IO_HI, 0x0000ffff); } /* Allocate I/O address space if necessary. */