We need to handle 64-bit BARs ourselves to avoid that the

PCI infrastructure instantiates a non-existent resource.
This has BARs suddenly show up with pciconf(8) under
VMware as well.  Now that we read the BAR ourselves, ask
for the correct resource type.
This commit is contained in:
Marcel Moolenaar 2015-06-12 12:27:10 +00:00
parent 093c7f396d
commit 00f73819c2

View File

@ -82,6 +82,7 @@ proto_pci_attach(device_t dev)
{
struct proto_softc *sc;
struct resource *res;
uint32_t val;
int bar, rid, type;
sc = device_get_softc(dev);
@ -91,15 +92,17 @@ proto_pci_attach(device_t dev)
for (bar = 0; bar < PCIR_MAX_BAR_0; bar++) {
rid = PCIR_BAR(bar);
type = SYS_RES_MEMORY;
val = pci_read_config(dev, rid, 4);
type = (PCI_BAR_IO(val)) ? SYS_RES_IOPORT : SYS_RES_MEMORY;
res = bus_alloc_resource_any(dev, type, &rid, RF_ACTIVE);
if (res == NULL) {
type = SYS_RES_IOPORT;
res = bus_alloc_resource_any(dev, type, &rid,
RF_ACTIVE);
}
if (res != NULL)
proto_add_resource(sc, type, rid, res);
if (res == NULL)
continue;
proto_add_resource(sc, type, rid, res);
if (type == SYS_RES_IOPORT)
continue;
/* Skip over adjacent BAR for 64-bit memory BARs. */
if ((val & PCIM_BAR_MEM_TYPE) == PCIM_BAR_MEM_64)
bar++;
}
rid = 0;