Author: jhb
Date: Fri Apr 15 03:42:12 2016
New Revision: 298029
URL: https://svnweb.freebsd.org/changeset/base/298029

Log:
  Add a new PCI bus interface method to alloc the ivars (dinfo) for a device.
  
  The ACPI and OFW PCI bus drivers as well as CardBus override this to
  allocate the larger ivars to hold additional info beyond the stock PCI ivars.
  
  This removes the need to pass the size to functions like pci_add_iov_child()
  and pci_read_device() simplifying IOV and bus rescanning implementations.
  
  As a result of this and earlier changes, the ACPI PCI bus driver no longer
  needs its own device_attach and pci_create_iov_child methods but can use
  the methods in the stock PCI bus driver instead.
  
  Differential Revision:        https://reviews.freebsd.org/D5891

Modified:
  head/sys/dev/acpica/acpi_pci.c
  head/sys/dev/cardbus/cardbus.c
  head/sys/dev/pci/pci.c
  head/sys/dev/pci/pci_if.m
  head/sys/dev/pci/pci_iov.c
  head/sys/dev/pci/pci_private.h
  head/sys/dev/pci/pcivar.h
  head/sys/mips/nlm/xlp_pci.c
  head/sys/powerpc/ofw/ofw_pcibus.c
  head/sys/sparc64/pci/ofw_pcibus.c

Modified: head/sys/dev/acpica/acpi_pci.c
==============================================================================
--- head/sys/dev/acpica/acpi_pci.c      Fri Apr 15 03:38:58 2016        
(r298028)
+++ head/sys/dev/acpica/acpi_pci.c      Fri Apr 15 03:42:12 2016        
(r298029)
@@ -70,7 +70,7 @@ CTASSERT(ACPI_STATE_D1 == PCI_POWERSTATE
 CTASSERT(ACPI_STATE_D2 == PCI_POWERSTATE_D2);
 CTASSERT(ACPI_STATE_D3 == PCI_POWERSTATE_D3);
 
-static int     acpi_pci_attach(device_t dev);
+static struct pci_devinfo *acpi_pci_alloc_devinfo(device_t dev);
 static void    acpi_pci_child_deleted(device_t dev, device_t child);
 static int     acpi_pci_child_location_str_method(device_t cbdev,
                    device_t child, char *buf, size_t buflen);
@@ -86,15 +86,9 @@ static int   acpi_pci_set_powerstate_metho
 static void    acpi_pci_update_device(ACPI_HANDLE handle, device_t pci_child);
 static bus_dma_tag_t acpi_pci_get_dma_tag(device_t bus, device_t child);
 
-#ifdef PCI_IOV
-static device_t        acpi_pci_create_iov_child(device_t bus, device_t pf,
-                   uint16_t rid, uint16_t vid, uint16_t did);
-#endif
-
 static device_method_t acpi_pci_methods[] = {
        /* Device interface */
        DEVMETHOD(device_probe,         acpi_pci_probe),
-       DEVMETHOD(device_attach,        acpi_pci_attach),
 
        /* Bus interface */
        DEVMETHOD(bus_read_ivar,        acpi_pci_read_ivar),
@@ -105,11 +99,9 @@ static device_method_t acpi_pci_methods[
        DEVMETHOD(bus_get_domain,       acpi_get_domain),
 
        /* PCI interface */
+       DEVMETHOD(pci_alloc_devinfo,    acpi_pci_alloc_devinfo),
        DEVMETHOD(pci_child_added,      acpi_pci_child_added),
        DEVMETHOD(pci_set_powerstate,   acpi_pci_set_powerstate_method),
-#ifdef PCI_IOV
-       DEVMETHOD(pci_create_iov_child, acpi_pci_create_iov_child),
-#endif
 
        DEVMETHOD_END
 };
@@ -123,6 +115,15 @@ MODULE_DEPEND(acpi_pci, acpi, 1, 1, 1);
 MODULE_DEPEND(acpi_pci, pci, 1, 1, 1);
 MODULE_VERSION(acpi_pci, 1);
 
+static struct pci_devinfo *
+acpi_pci_alloc_devinfo(device_t dev)
+{
+       struct acpi_pci_devinfo *dinfo;
+
+       dinfo = malloc(sizeof(*dinfo), M_DEVBUF, M_WAITOK | M_ZERO);
+       return (&dinfo->ap_dinfo);
+}
+
 static int
 acpi_pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
 {
@@ -298,38 +299,6 @@ void
 acpi_pci_child_added(device_t dev, device_t child)
 {
 
-       AcpiWalkNamespace(ACPI_TYPE_DEVICE, acpi_get_handle(dev), 1,
-           acpi_pci_save_handle, NULL, child, NULL);
-}
-
-static int
-acpi_pci_probe(device_t dev)
-{
-
-       if (acpi_get_handle(dev) == NULL)
-               return (ENXIO);
-       device_set_desc(dev, "ACPI PCI bus");
-       return (BUS_PROBE_DEFAULT);
-}
-
-static int
-acpi_pci_attach(device_t dev)
-{
-       int busno, domain, error;
-
-       error = pci_attach_common(dev);
-       if (error)
-               return (error);
-
-       /*
-        * Since there can be multiple independantly numbered PCI
-        * busses on systems with multiple PCI domains, we can't use
-        * the unit number to decide which bus we are probing. We ask
-        * the parent pcib what our domain and bus numbers are.
-        */
-       domain = pcib_get_domain(dev);
-       busno = pcib_get_bus(dev);
-
        /*
         * PCI devices are added via the bus scan in the normal PCI
         * bus driver.  As each device is added, the
@@ -342,9 +311,18 @@ acpi_pci_attach(device_t dev)
         * pci_add_children() doesn't find.  We currently just ignore
         * these devices.
         */
-       pci_add_children(dev, domain, busno, sizeof(struct acpi_pci_devinfo));
+       AcpiWalkNamespace(ACPI_TYPE_DEVICE, acpi_get_handle(dev), 1,
+           acpi_pci_save_handle, NULL, child, NULL);
+}
+
+static int
+acpi_pci_probe(device_t dev)
+{
 
-       return (bus_generic_attach(dev));
+       if (acpi_get_handle(dev) == NULL)
+               return (ENXIO);
+       device_set_desc(dev, "ACPI PCI bus");
+       return (BUS_PROBE_DEFAULT);
 }
 
 #ifdef ACPI_DMAR
@@ -372,14 +350,3 @@ acpi_pci_get_dma_tag(device_t bus, devic
 }
 #endif
 
-#ifdef PCI_IOV
-static device_t
-acpi_pci_create_iov_child(device_t bus, device_t pf, uint16_t rid, uint16_t 
vid,
-    uint16_t did)
-{
-
-       return (pci_add_iov_child(bus, pf, sizeof(struct acpi_pci_devinfo), rid,
-           vid, did));
-}
-#endif
-

Modified: head/sys/dev/cardbus/cardbus.c
==============================================================================
--- head/sys/dev/cardbus/cardbus.c      Fri Apr 15 03:38:58 2016        
(r298028)
+++ head/sys/dev/cardbus/cardbus.c      Fri Apr 15 03:42:12 2016        
(r298029)
@@ -169,6 +169,15 @@ cardbus_device_setup_regs(pcicfgregs *cf
        pci_write_config(dev, PCIR_MAXLAT, 0x14, 1);
 }
 
+static struct pci_devinfo *
+cardbus_alloc_devinfo(device_t dev)
+{
+       struct cardbus_devinfo *dinfo;
+
+       dinfo = malloc(sizeof(*dinfo), M_DEVBUF, M_WAITOK | M_ZERO);
+       return (&dinfo->pci);
+}
+
 static int
 cardbus_attach_card(device_t cbdev)
 {
@@ -191,8 +200,7 @@ cardbus_attach_card(device_t cbdev)
                struct cardbus_devinfo *dinfo;
 
                dinfo = (struct cardbus_devinfo *)
-                   pci_read_device(brdev, domain, bus, slot, func,
-                       sizeof(struct cardbus_devinfo));
+                   pci_read_device(brdev, cbdev, domain, bus, slot, func);
                if (dinfo == NULL)
                        continue;
                if (dinfo->pci.cfg.mfdev)
@@ -343,6 +351,9 @@ static device_method_t cardbus_methods[]
        DEVMETHOD(card_attach_card,     cardbus_attach_card),
        DEVMETHOD(card_detach_card,     cardbus_detach_card),
 
+       /* PCI interface */
+       DEVMETHOD(pci_alloc_devinfo,    cardbus_alloc_devinfo),
+
        {0,0}
 };
 

Modified: head/sys/dev/pci/pci.c
==============================================================================
--- head/sys/dev/pci/pci.c      Fri Apr 15 03:38:58 2016        (r298028)
+++ head/sys/dev/pci/pci.c      Fri Apr 15 03:42:12 2016        (r298029)
@@ -126,8 +126,8 @@ static int          pci_remap_intr_method(device
 
 static uint16_t                pci_get_rid_method(device_t dev, device_t 
child);
 
-static struct pci_devinfo * pci_fill_devinfo(device_t pcib, int d, int b, int 
s,
-    int f, uint16_t vid, uint16_t did, size_t size);
+static struct pci_devinfo * pci_fill_devinfo(device_t pcib, device_t bus, int 
d,
+    int b, int s, int f, uint16_t vid, uint16_t did);
 
 static device_method_t pci_methods[] = {
        /* Device interface */
@@ -196,6 +196,7 @@ static device_method_t pci_methods[] = {
        DEVMETHOD(pci_msix_pba_bar,     pci_msix_pba_bar_method),
        DEVMETHOD(pci_msix_table_bar,   pci_msix_table_bar_method),
        DEVMETHOD(pci_get_rid,          pci_get_rid_method),
+       DEVMETHOD(pci_alloc_devinfo,    pci_alloc_devinfo_method),
        DEVMETHOD(pci_child_added,      pci_child_added_method),
 #ifdef PCI_IOV
        DEVMETHOD(pci_iov_attach,       pci_iov_attach_method),
@@ -619,7 +620,7 @@ pci_hdrtypedata(device_t pcib, int b, in
 
 /* read configuration header into pcicfgregs structure */
 struct pci_devinfo *
-pci_read_device(device_t pcib, int d, int b, int s, int f, size_t size)
+pci_read_device(device_t pcib, device_t bus, int d, int b, int s, int f)
 {
 #define        REG(n, w)       PCIB_READ_CONFIG(pcib, b, s, f, n, w)
        uint16_t vid, did;
@@ -627,19 +628,27 @@ pci_read_device(device_t pcib, int d, in
        vid = REG(PCIR_VENDOR, 2);
        did = REG(PCIR_DEVICE, 2);
        if (vid != 0xffff)
-               return (pci_fill_devinfo(pcib, d, b, s, f, vid, did, size));
+               return (pci_fill_devinfo(pcib, bus, d, b, s, f, vid, did));
 
        return (NULL);
 }
 
+struct pci_devinfo *
+pci_alloc_devinfo_method(device_t dev)
+{
+
+       return (malloc(sizeof(struct pci_devinfo), M_DEVBUF,
+           M_WAITOK | M_ZERO));
+}
+
 static struct pci_devinfo *
-pci_fill_devinfo(device_t pcib, int d, int b, int s, int f, uint16_t vid,
-    uint16_t did, size_t size)
+pci_fill_devinfo(device_t pcib, device_t bus, int d, int b, int s, int f,
+    uint16_t vid, uint16_t did)
 {
        struct pci_devinfo *devlist_entry;
        pcicfgregs *cfg;
 
-       devlist_entry = malloc(size, M_DEVBUF, M_WAITOK | M_ZERO);
+       devlist_entry = PCI_ALLOC_DEVINFO(bus);
 
        cfg = &devlist_entry->cfg;
 
@@ -665,7 +674,6 @@ pci_fill_devinfo(device_t pcib, int d, i
        cfg->hdrtype            &= ~PCIM_MFDEV;
        STAILQ_INIT(&cfg->maps);
 
-       cfg->devinfo_size       = size;
        cfg->iov                = NULL;
 
        pci_fixancient(cfg);
@@ -3854,11 +3862,11 @@ pci_add_resources(device_t bus, device_t
 
 static struct pci_devinfo *
 pci_identify_function(device_t pcib, device_t dev, int domain, int busno,
-    int slot, int func, size_t dinfo_size)
+    int slot, int func)
 {
        struct pci_devinfo *dinfo;
 
-       dinfo = pci_read_device(pcib, domain, busno, slot, func, dinfo_size);
+       dinfo = pci_read_device(pcib, dev, domain, busno, slot, func);
        if (dinfo != NULL)
                pci_add_child(dev, dinfo);
 
@@ -3866,7 +3874,7 @@ pci_identify_function(device_t pcib, dev
 }
 
 void
-pci_add_children(device_t dev, int domain, int busno, size_t dinfo_size)
+pci_add_children(device_t dev, int domain, int busno)
 {
 #define        REG(n, w)       PCIB_READ_CONFIG(pcib, busno, s, f, n, w)
        device_t pcib = device_get_parent(dev);
@@ -3882,8 +3890,7 @@ pci_add_children(device_t dev, int domai
         * functions on this bus as ARI changes the set of slots and functions
         * that are legal on this bus.
         */
-       dinfo = pci_identify_function(pcib, dev, domain, busno, 0, 0,
-           dinfo_size);
+       dinfo = pci_identify_function(pcib, dev, domain, busno, 0, 0);
        if (dinfo != NULL && pci_enable_ari)
                PCIB_TRY_ENABLE_ARI(pcib, dinfo->cfg.dev);
 
@@ -3893,8 +3900,6 @@ pci_add_children(device_t dev, int domai
         */
        first_func = 1;
 
-       KASSERT(dinfo_size >= sizeof(struct pci_devinfo),
-           ("dinfo_size too small"));
        maxslots = PCIB_MAXSLOTS(pcib);
        for (s = 0; s <= maxslots; s++, first_func = 0) {
                pcifunchigh = 0;
@@ -3906,16 +3911,15 @@ pci_add_children(device_t dev, int domai
                if (hdrtype & PCIM_MFDEV)
                        pcifunchigh = PCIB_MAXFUNCS(pcib);
                for (f = first_func; f <= pcifunchigh; f++)
-                       pci_identify_function(pcib, dev, domain, busno, s, f,
-                           dinfo_size);
+                       pci_identify_function(pcib, dev, domain, busno, s, f);
        }
 #undef REG
 }
 
 #ifdef PCI_IOV
 device_t
-pci_add_iov_child(device_t bus, device_t pf, size_t size, uint16_t rid,
-    uint16_t vid, uint16_t did)
+pci_add_iov_child(device_t bus, device_t pf, uint16_t rid, uint16_t vid,
+    uint16_t did)
 {
        struct pci_devinfo *pf_dinfo, *vf_dinfo;
        device_t pcib;
@@ -3923,23 +3927,12 @@ pci_add_iov_child(device_t bus, device_t
 
        pf_dinfo = device_get_ivars(pf);
 
-       /*
-        * Do a sanity check that we have been passed the correct size.  If this
-        * test fails then likely the pci subclass hasn't implemented the
-        * pci_create_iov_child method like it's supposed it.
-        */
-       if (size != pf_dinfo->cfg.devinfo_size) {
-               device_printf(pf,
-                   "PCI subclass does not properly implement PCI_IOV\n");
-               return (NULL);
-       }
-
        pcib = device_get_parent(bus);
 
        PCIB_DECODE_RID(pcib, rid, &busno, &slot, &func);
 
-       vf_dinfo = pci_fill_devinfo(pcib, pci_get_domain(pcib), busno, slot, 
func,
-           vid, did, size);
+       vf_dinfo = pci_fill_devinfo(pcib, bus, pci_get_domain(pcib), busno,
+           slot, func, vid, did);
 
        vf_dinfo->cfg.flags |= PCICFG_VF;
        pci_add_child(bus, vf_dinfo);
@@ -3952,8 +3945,7 @@ pci_create_iov_child_method(device_t bus
     uint16_t vid, uint16_t did)
 {
 
-       return (pci_add_iov_child(bus, pf, sizeof(struct pci_devinfo), rid, vid,
-           did));
+       return (pci_add_iov_child(bus, pf, rid, vid, did));
 }
 #endif
 
@@ -4050,7 +4042,7 @@ pci_attach(device_t dev)
         */
        domain = pcib_get_domain(dev);
        busno = pcib_get_bus(dev);
-       pci_add_children(dev, domain, busno, sizeof(struct pci_devinfo));
+       pci_add_children(dev, domain, busno);
        return (bus_generic_attach(dev));
 }
 

Modified: head/sys/dev/pci/pci_if.m
==============================================================================
--- head/sys/dev/pci/pci_if.m   Fri Apr 15 03:38:58 2016        (r298028)
+++ head/sys/dev/pci/pci_if.m   Fri Apr 15 03:42:12 2016        (r298029)
@@ -213,6 +213,10 @@ METHOD uint16_t get_rid {
        device_t        child;
 };
 
+METHOD struct pci_devinfo * alloc_devinfo {
+       device_t        dev;
+};
+
 METHOD void child_added {
        device_t        dev;
        device_t        child;

Modified: head/sys/dev/pci/pci_iov.c
==============================================================================
--- head/sys/dev/pci/pci_iov.c  Fri Apr 15 03:38:58 2016        (r298028)
+++ head/sys/dev/pci/pci_iov.c  Fri Apr 15 03:42:12 2016        (r298029)
@@ -600,14 +600,12 @@ pci_iov_enumerate_vfs(struct pci_devinfo
        device_t bus, dev, vf;
        struct pcicfg_iov *iov;
        struct pci_devinfo *vfinfo;
-       size_t size;
        int i, error;
        uint16_t vid, did, next_rid;
 
        iov = dinfo->cfg.iov;
        dev = dinfo->cfg.dev;
        bus = device_get_parent(dev);
-       size = dinfo->cfg.devinfo_size;
        next_rid = first_rid;
        vid = pci_get_vendor(dev);
        did = IOV_READ(dinfo, PCIR_SRIOV_VF_DID, 2);

Modified: head/sys/dev/pci/pci_private.h
==============================================================================
--- head/sys/dev/pci/pci_private.h      Fri Apr 15 03:38:58 2016        
(r298028)
+++ head/sys/dev/pci/pci_private.h      Fri Apr 15 03:42:12 2016        
(r298029)
@@ -48,14 +48,14 @@ struct pci_softc {
 extern int     pci_do_power_resume;
 extern int     pci_do_power_suspend;
 
-void           pci_add_children(device_t dev, int domain, int busno,
-                   size_t dinfo_size);
+void           pci_add_children(device_t dev, int domain, int busno);
 void           pci_add_child(device_t bus, struct pci_devinfo *dinfo);
-device_t       pci_add_iov_child(device_t bus, device_t pf, size_t dinfo_size,
-                   uint16_t rid, uint16_t vid, uint16_t did);
+device_t       pci_add_iov_child(device_t bus, device_t pf, uint16_t rid,
+                   uint16_t vid, uint16_t did);
 void           pci_add_resources(device_t bus, device_t dev, int force,
                    uint32_t prefetchmask);
 void           pci_add_resources_ea(device_t bus, device_t dev, int alloc_iov);
+struct pci_devinfo *pci_alloc_devinfo_method(device_t dev);
 int            pci_attach_common(device_t dev);
 void           pci_driver_added(device_t dev, driver_t *driver);
 int            pci_ea_is_enabled(device_t dev, int rid);
@@ -117,8 +117,8 @@ int         pci_deactivate_resource(device_t de
 void           pci_delete_resource(device_t dev, device_t child, 
                    int type, int rid);
 struct resource_list *pci_get_resource_list (device_t dev, device_t child);
-struct pci_devinfo *pci_read_device(device_t pcib, int d, int b, int s, int f,
-                   size_t size);
+struct pci_devinfo *pci_read_device(device_t pcib, device_t bus, int d, int b,
+                   int s, int f);
 void           pci_print_verbose(struct pci_devinfo *dinfo);
 int            pci_freecfg(struct pci_devinfo *dinfo);
 void           pci_child_deleted(device_t dev, device_t child);

Modified: head/sys/dev/pci/pcivar.h
==============================================================================
--- head/sys/dev/pci/pcivar.h   Fri Apr 15 03:38:58 2016        (r298028)
+++ head/sys/dev/pci/pcivar.h   Fri Apr 15 03:42:12 2016        (r298029)
@@ -209,7 +209,6 @@ typedef struct pcicfg {
     uint8_t    func;           /* config space function number */
 
     uint32_t   flags;          /* flags defined above */
-    size_t     devinfo_size;   /* Size of devinfo for this bus type. */
 
     struct pcicfg_bridge bridge; /* Bridges */
     struct pcicfg_pp pp;       /* Power management */

Modified: head/sys/mips/nlm/xlp_pci.c
==============================================================================
--- head/sys/mips/nlm/xlp_pci.c Fri Apr 15 03:38:58 2016        (r298028)
+++ head/sys/mips/nlm/xlp_pci.c Fri Apr 15 03:42:12 2016        (r298029)
@@ -125,8 +125,8 @@ xlp_pci_attach(device_t dev)
                                    XLP_PCI_DEVSCRATCH_REG0 << 2,
                                    (1 << 8) | irq, 4);
                        }
-                       dinfo = pci_read_device(pcib, pcib_get_domain(dev),
-                           busno, s, f, sizeof(*dinfo));
+                       dinfo = pci_read_device(pcib, dev, pcib_get_domain(dev),
+                           busno, s, f);
                        pci_add_child(dev, dinfo);
                }
        }

Modified: head/sys/powerpc/ofw/ofw_pcibus.c
==============================================================================
--- head/sys/powerpc/ofw/ofw_pcibus.c   Fri Apr 15 03:38:58 2016        
(r298028)
+++ head/sys/powerpc/ofw/ofw_pcibus.c   Fri Apr 15 03:42:12 2016        
(r298029)
@@ -59,6 +59,7 @@ typedef uint32_t ofw_pci_intr_t;
 /* Methods */
 static device_probe_t ofw_pcibus_probe;
 static device_attach_t ofw_pcibus_attach;
+static pci_alloc_devinfo_t ofw_pcibus_alloc_devinfo;
 static pci_assign_interrupt_t ofw_pcibus_assign_interrupt;
 static ofw_bus_get_devinfo_t ofw_pcibus_get_devinfo;
 static bus_child_deleted_t ofw_pcibus_child_deleted;
@@ -78,6 +79,7 @@ static device_method_t ofw_pcibus_method
        DEVMETHOD(bus_child_pnpinfo_str, ofw_pcibus_child_pnpinfo_str_method),
 
        /* PCI interface */
+       DEVMETHOD(pci_alloc_devinfo,    ofw_pcibus_alloc_devinfo),
        DEVMETHOD(pci_assign_interrupt, ofw_pcibus_assign_interrupt),
 
        /* ofw_bus interface */
@@ -144,6 +146,15 @@ ofw_pcibus_attach(device_t dev)
        return (bus_generic_attach(dev));
 }
 
+struct pci_devinfo *
+ofw_pcibus_alloc_devinfo(device_t dev)
+{
+       struct ofw_pcibus_devinfo *dinfo;
+
+       dinfo = malloc(sizeof(*dinfo), M_DEVBUF, M_WAITOK | M_ZERO);
+       return (&dinfo->opd_dinfo);
+}
+
 static void
 ofw_pcibus_enum_devtree(device_t dev, u_int domain, u_int busno)
 {
@@ -185,8 +196,8 @@ ofw_pcibus_enum_devtree(device_t dev, u_
                 * to the PCI bus.
                 */
 
-               dinfo = (struct ofw_pcibus_devinfo *)pci_read_device(pcib,
-                   domain, busno, slot, func, sizeof(*dinfo));
+               dinfo = (struct ofw_pcibus_devinfo *)pci_read_device(pcib, dev,
+                   domain, busno, slot, func);
                if (dinfo == NULL)
                        continue;
                if (ofw_bus_gen_setup_devinfo(&dinfo->opd_obdinfo, child) !=
@@ -244,7 +255,7 @@ ofw_pcibus_enum_bus(device_t dev, u_int 
                                continue;
 
                        dinfo = (struct ofw_pcibus_devinfo *)pci_read_device(
-                           pcib, domain, busno, s, f, sizeof(*dinfo));
+                           pcib, dev, domain, busno, s, f);
                        if (dinfo == NULL)
                                continue;
 

Modified: head/sys/sparc64/pci/ofw_pcibus.c
==============================================================================
--- head/sys/sparc64/pci/ofw_pcibus.c   Fri Apr 15 03:38:58 2016        
(r298028)
+++ head/sys/sparc64/pci/ofw_pcibus.c   Fri Apr 15 03:42:12 2016        
(r298029)
@@ -70,6 +70,7 @@ static bus_child_pnpinfo_str_t ofw_pcibu
 static device_attach_t ofw_pcibus_attach;
 static device_probe_t ofw_pcibus_probe;
 static ofw_bus_get_devinfo_t ofw_pcibus_get_devinfo;
+static pci_alloc_devinfo_t ofw_pcibus_alloc_devinfo;
 static pci_assign_interrupt_t ofw_pcibus_assign_interrupt;
 
 static device_method_t ofw_pcibus_methods[] = {
@@ -82,6 +83,7 @@ static device_method_t ofw_pcibus_method
        DEVMETHOD(bus_child_pnpinfo_str, ofw_pcibus_pnpinfo_str),
 
        /* PCI interface */
+       DEVMETHOD(pci_alloc_devinfo,    ofw_pcibus_alloc_devinfo),
        DEVMETHOD(pci_assign_interrupt, ofw_pcibus_assign_interrupt),
 
        /* ofw_bus interface */
@@ -250,8 +252,8 @@ ofw_pcibus_attach(device_t dev)
        if (strcmp(device_get_name(device_get_parent(pcib)), "nexus") == 0 &&
            ofw_bus_get_type(pcib) != NULL &&
            strcmp(ofw_bus_get_type(pcib), OFW_TYPE_PCIE) != 0 &&
-           (dinfo = (struct ofw_pcibus_devinfo *)pci_read_device(pcib,
-           domain, busno, 0, 0, sizeof(*dinfo))) != NULL) {
+           (dinfo = (struct ofw_pcibus_devinfo *)pci_read_device(pcib, dev,
+           domain, busno, 0, 0)) != NULL) {
                if (ofw_bus_gen_setup_devinfo(&dinfo->opd_obdinfo, node) != 0)
                        pci_freecfg((struct pci_devinfo *)dinfo);
                else
@@ -270,8 +272,8 @@ ofw_pcibus_attach(device_t dev)
                if (pci_find_dbsf(domain, busno, slot, func) != NULL)
                        continue;
                ofw_pcibus_setup_device(pcib, clock, busno, slot, func);
-               dinfo = (struct ofw_pcibus_devinfo *)pci_read_device(pcib,
-                   domain, busno, slot, func, sizeof(*dinfo));
+               dinfo = (struct ofw_pcibus_devinfo *)pci_read_device(pcib, dev,
+                   domain, busno, slot, func);
                if (dinfo == NULL)
                        continue;
                if (ofw_bus_gen_setup_devinfo(&dinfo->opd_obdinfo, child) !=
@@ -286,6 +288,15 @@ ofw_pcibus_attach(device_t dev)
        return (bus_generic_attach(dev));
 }
 
+struct pci_devinfo *
+ofw_pcibus_alloc_devinfo(device_t dev)
+{
+       struct ofw_pcibus_devinfo *dinfo;
+
+       dinfo = malloc(sizeof(*dinfo), M_DEVBUF, M_WAITOK | M_ZERO);
+       return (&dinfo->opd_dinfo);
+}
+
 static int
 ofw_pcibus_assign_interrupt(device_t dev, device_t child)
 {
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to