diff --git a/sys/dev/pci/pci_host_generic.c b/sys/dev/pci/pci_host_generic.c --- a/sys/dev/pci/pci_host_generic.c +++ b/sys/dev/pci/pci_host_generic.c @@ -80,6 +80,7 @@ struct resource_map map; #endif struct generic_pcie_core_softc *sc; + struct rman *rm; uint64_t phys_base; uint64_t pci_base; uint64_t size; @@ -183,75 +184,51 @@ range_descr = "prefetch"; flags = RF_PREFETCHABLE; type = SYS_RES_MEMORY; - error = rman_manage_region(&sc->pmem_rman, - pci_base, pci_base + size - 1); + rm = &sc->pmem_rman; break; case FLAG_TYPE_MEM: range_descr = "memory"; flags = 0; type = SYS_RES_MEMORY; - error = rman_manage_region(&sc->mem_rman, - pci_base, pci_base + size - 1); + rm = &sc->mem_rman; break; case FLAG_TYPE_IO: range_descr = "I/O port"; flags = 0; type = SYS_RES_IOPORT; - error = rman_manage_region(&sc->io_rman, - pci_base, pci_base + size - 1); + rm = &sc->io_rman; break; default: continue; } - if (error) { - device_printf(dev, "rman_manage_region() failed." - "error = %d\n", error); - goto err_rman_manage; - } + if (bootverbose) + device_printf(dev, + "PCI addr: 0x%jx, CPU addr: 0x%jx, Size: 0x%jx, Type: %s\n", + pci_base, phys_base, size, range_descr); error = bus_set_resource(dev, type, rid, phys_base, size); if (error != 0) { device_printf(dev, "failed to set resource for range %d: %d\n", tuple, error); - goto err_rman_manage; + continue; } sc->ranges[tuple].res = bus_alloc_resource_any(dev, type, &rid, RF_ACTIVE | RF_UNMAPPED | flags); if (sc->ranges[tuple].res == NULL) { device_printf(dev, "failed to allocate resource for range %d\n", tuple); - error = ENXIO; - goto err_rman_manage; + continue; + } + error = rman_manage_region(rm, pci_base, pci_base + size - 1); + if (error) { + device_printf(dev, "rman_manage_region() failed." + "error = %d\n", error); + continue; } - if (bootverbose) - device_printf(dev, - "PCI addr: 0x%jx, CPU addr: 0x%jx, Size: 0x%jx, Type: %s\n", - pci_base, phys_base, size, range_descr); } return (0); -err_rman_manage: - for (tuple = 0; tuple < MAX_RANGES_TUPLES; tuple++) { - if (sc->ranges[tuple].size == 0) - continue; /* empty range element */ - switch (FLAG_TYPE(sc->ranges[tuple].flags)) { - case FLAG_TYPE_PMEM: - case FLAG_TYPE_MEM: - type = SYS_RES_MEMORY; - break; - case FLAG_TYPE_IO: - type = SYS_RES_IOPORT; - break; - default: - continue; - } - if (sc->ranges[tuple].res != NULL) - bus_release_resource(dev, type, tuple + 1, - sc->ranges[tuple].res); - bus_delete_resource(dev, type, tuple + 1); - } - rman_fini(&sc->io_rman); err_io_rman: rman_fini(&sc->mem_rman); err_mem_rman: