pci_host_generic: Use SYS_RES_MEMORY for the parent of I/O resource ranges

When a SYS_RES_IOPORT resource crosses a pci_host_generic bridge, it
is translated into a memory access for an associated range, so use
SYS_RES_MEMORY for the resource allocated from the parent.

Tested by:	markj
Differential Revision:	https://reviews.freebsd.org/D44207

(cherry picked from commit c19f1ad1c252f434146c7210155d805b2ed0ff95)
This commit is contained in:
John Baldwin 2025-01-21 10:51:53 -05:00
parent 34f9dca191
commit cbaa32c28a

View file

@ -91,7 +91,7 @@ pci_host_generic_core_attach(device_t dev)
const char *range_descr;
char buf[64];
int domain, error;
int flags, rid, tuple, type;
int flags, rid, tuple;
sc = device_get_softc(dev);
sc->dev = dev;
@ -187,19 +187,16 @@ pci_host_generic_core_attach(device_t dev)
sc->has_pmem = true;
range_descr = "prefetch";
flags = RF_PREFETCHABLE;
type = SYS_RES_MEMORY;
rm = &sc->pmem_rman;
break;
case FLAG_TYPE_MEM:
range_descr = "memory";
flags = 0;
type = SYS_RES_MEMORY;
rm = &sc->mem_rman;
break;
case FLAG_TYPE_IO:
range_descr = "I/O port";
flags = 0;
type = SYS_RES_IOPORT;
rm = &sc->io_rman;
break;
default:
@ -209,7 +206,8 @@ pci_host_generic_core_attach(device_t dev)
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);
error = bus_set_resource(dev, SYS_RES_MEMORY, rid, phys_base,
size);
if (error != 0) {
device_printf(dev,
"failed to set resource for range %d: %d\n", tuple,
@ -217,8 +215,8 @@ pci_host_generic_core_attach(device_t dev)
continue;
}
sc->ranges[tuple].rid = rid;
sc->ranges[tuple].res = bus_alloc_resource_any(dev, type, &rid,
RF_ACTIVE | RF_UNMAPPED | flags);
sc->ranges[tuple].res = bus_alloc_resource_any(dev,
SYS_RES_MEMORY, &rid, RF_ACTIVE | RF_UNMAPPED | flags);
if (sc->ranges[tuple].res == NULL) {
device_printf(dev,
"failed to allocate resource for range %d\n", tuple);
@ -253,7 +251,7 @@ int
pci_host_generic_core_detach(device_t dev)
{
struct generic_pcie_core_softc *sc;
int error, rid, tuple, type;
int error, rid, tuple;
sc = device_get_softc(dev);
@ -272,18 +270,15 @@ pci_host_generic_core_detach(device_t dev)
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, rid,
bus_release_resource(dev, SYS_RES_MEMORY, rid,
sc->ranges[tuple].res);
bus_delete_resource(dev, type, rid);
bus_delete_resource(dev, SYS_RES_MEMORY, rid);
}
rman_fini(&sc->io_rman);
rman_fini(&sc->mem_rman);