Author: marcel
Date: Fri Jun 12 12:27:10 2015
New Revision: 284315
URL: https://svnweb.freebsd.org/changeset/base/284315

Log:
  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.

Modified:
  head/sys/dev/proto/proto_bus_pci.c

Modified: head/sys/dev/proto/proto_bus_pci.c
==============================================================================
--- head/sys/dev/proto/proto_bus_pci.c  Fri Jun 12 11:52:32 2015        
(r284314)
+++ head/sys/dev/proto/proto_bus_pci.c  Fri Jun 12 12:27:10 2015        
(r284315)
@@ -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;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to