Hello,

I am looking for a testers for a patch to import portions of the PowerPC
and Sparc64 OF PCI implementations. This extracts common code from
PPC's and Sparc64's ofw_pci and moves that to general dev/ofw_pci files.

It is currently building successfully on every architecture. I tested it on
my
arm machine and checked it worked. Unfortunately I do not have any powerpc
and sparc hardware to test it on. I tried to use it inside qemu, however I
could
not run the FBSD on Sparc64 and PPC (I used a "qemu recipes" from the
freebsd
wiki page).

I would like it if this could be tested on these platforms using this code
to
check if it does not break them. This is very essential patch for me,
because
it is blocking my other pending commits and I would be very grateful for
testing it.

Review of this code is here: https://reviews.freebsd.org/D4879

Any comments and feedback are welcome.

Thanks,
Marcin
diff --git a/sys/conf/files.arm b/sys/conf/files.arm
index 2407616..0770261 100644
--- a/sys/conf/files.arm
+++ b/sys/conf/files.arm
@@ -103,6 +103,7 @@ dev/hwpmc/hwpmc_arm.c               optional        hwpmc
 dev/hwpmc/hwpmc_armv7.c                optional        hwpmc armv6
 dev/iicbus/twsi/twsi.c         optional        twsi
 dev/ofw/ofw_cpu.c              optional        fdt
+dev/ofw/ofw_pci.c              optional        pci fdt
 dev/psci/psci.c                        optional        psci
 dev/psci/psci_arm.S            optional        psci
 dev/syscons/scgfbrndr.c                optional        sc
diff --git a/sys/conf/files.arm64 b/sys/conf/files.arm64
index 8f5f10a..a32f609 100644
--- a/sys/conf/files.arm64
+++ b/sys/conf/files.arm64
@@ -66,6 +66,7 @@ dev/hwpmc/hwpmc_arm64_md.c    optional        hwpmc
 dev/mmc/host/dwmmc.c           optional        dwmmc
 dev/mmc/host/dwmmc_hisi.c      optional        dwmmc soc_hisi_hi6220
 dev/ofw/ofw_cpu.c              optional        fdt
+dev/ofw/ofw_pci.c              optional        pci fdt
 dev/pci/pci_host_generic.c     optional        pci fdt
 dev/psci/psci.c                        optional        psci
 dev/psci/psci_arm64.S          optional        psci
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index b065165..57bbf57 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -285,6 +285,7 @@ dev/nvme/nvme_sysctl.c              optional nvme
 dev/nvme/nvme_test.c           optional nvme
 dev/nvme/nvme_util.c           optional nvme
 dev/nvram/nvram.c              optional nvram isa
+dev/ofw/ofw_pci.c              optional pci fdt
 dev/pcf/pcf_isa.c              optional pcf
 dev/random/ivy.c               optional rdrand_rng
 dev/random/nehemiah.c          optional padlock_rng
diff --git a/sys/conf/files.mips b/sys/conf/files.mips
index 91d53aa..6733080 100644
--- a/sys/conf/files.mips
+++ b/sys/conf/files.mips
@@ -92,3 +92,6 @@ dev/nvram2env/nvram2env.c             optional        
nvram2env
 dev/hwpmc/hwpmc_mips.c                 optional        hwpmc
 dev/hwpmc/hwpmc_mips24k.c              optional        hwpmc_mips24k
 dev/hwpmc/hwpmc_mips74k.c              optional        hwpmc_mips74k
+
+# ofw support
+dev/ofw/ofw_pci.c                      optional        pci fdt
diff --git a/sys/conf/files.powerpc b/sys/conf/files.powerpc
index 0a1e7c1..bde48a3 100644
--- a/sys/conf/files.powerpc
+++ b/sys/conf/files.powerpc
@@ -57,6 +57,7 @@ dev/ofw/ofw_console.c         optional        aim
 dev/ofw/ofw_disk.c             optional        ofwd aim
 dev/ofw/ofw_iicbus.c           optional        iicbus aim
 dev/ofw/ofwbus.c               optional        aim | fdt
+dev/ofw/ofw_pci.c              optional        pci fdt
 dev/ofw/ofw_standard.c         optional        aim powerpc
 dev/ofw/ofw_subr.c             optional        aim powerpc
 dev/powermac_nvram/powermac_nvram.c optional   powermac_nvram powermac
@@ -145,7 +146,6 @@ powerpc/mpc85xx/pci_mpc85xx.c       optional        pci 
mpc85xx | pci qoriq_dpaa
 powerpc/mpc85xx/pci_mpc85xx_pcib.c     optional        pci mpc85xx | pci 
qoriq_dpaa
 powerpc/mpc85xx/qoriq_gpio.c   optional        mpc85xx gpio | qoriq_dpaa gpio
 powerpc/ofw/ofw_machdep.c      standard
-powerpc/ofw/ofw_pci.c          optional        pci
 powerpc/ofw/ofw_pcibus.c       optional        pci
 powerpc/ofw/ofw_pcib_pci.c     optional        pci
 powerpc/ofw/ofw_real.c         optional        aim
diff --git a/sys/conf/files.sparc64 b/sys/conf/files.sparc64
index 84f23ff..c7c138a 100644
--- a/sys/conf/files.sparc64
+++ b/sys/conf/files.sparc64
@@ -47,6 +47,7 @@ dev/ofw/ofw_bus_if.m          standard
 dev/ofw/ofw_bus_subr.c         standard
 dev/ofw/ofw_console.c          optional        ofw_console
 dev/ofw/ofw_if.m               standard
+dev/ofw/ofw_pci.c              optional        pci
 dev/ofw/ofw_standard.c         standard
 dev/ofw/openfirm.c             standard
 dev/ofw/openfirmio.c           standard
@@ -82,7 +83,7 @@ sparc64/isa/isa_dma.c         optional        isa
 sparc64/isa/ofw_isa.c          optional        ebus | isa
 sparc64/pci/apb.c              optional        pci
 sparc64/pci/fire.c             optional        pci
-sparc64/pci/ofw_pci.c          optional        pci
+sparc64/pci/sparc64_ofw_pci.c  optional        pci
 sparc64/pci/ofw_pcib.c         optional        pci
 sparc64/pci/ofw_pcib_subr.c    optional        pci
 sparc64/pci/ofw_pcibus.c       optional        pci
diff --git a/sys/dev/ofw/ofw_pci.c b/sys/dev/ofw/ofw_pci.c
new file mode 100644
index 0000000..8852cd7
--- /dev/null
+++ b/sys/dev/ofw/ofw_pci.c
@@ -0,0 +1,635 @@
+/*-
+ * Copyright (c) 2011 Nathan Whitehorn
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/module.h>
+#include <sys/bus.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/rman.h>
+
+#include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
+
+#include <dev/pci/pcivar.h>
+#include <dev/pci/pcireg.h>
+
+#include <machine/bus.h>
+#include <machine/md_var.h>
+#include <machine/resource.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+#include "pcib_if.h"
+
+/*
+ * If it is necessary to set another value of this for
+ * some platforms it should be set at fdt.h file
+ */
+#ifndef PCI_MAP_INTR
+#define        PCI_MAP_INTR    4
+#endif
+
+#define        PCI_INTR_PINS   4
+
+/*
+ * bus interface.
+ */
+static int ofw_pci_activate_resource(device_t, device_t, int, int,
+    struct resource *);
+static int ofw_pci_release_resource(device_t, device_t, int, int,
+    struct resource *);
+static int ofw_pci_deactivate_resource(device_t, device_t, int, int,
+    struct resource *);
+
+#ifdef __powerpc__
+static bus_space_tag_t ofw_pci_bus_get_bus_tag(device_t, device_t);
+#endif
+
+/*
+ * pcib interface
+ */
+static int ofw_pci_maxslots(device_t);
+
+/*
+ * Driver methods.
+ */
+static device_method_t ofw_pci_methods[] = {
+
+       /* Device interface */
+       DEVMETHOD(device_attach,        ofw_pci_attach),
+
+       /* Bus interface */
+       DEVMETHOD(bus_print_child,      bus_generic_print_child),
+       DEVMETHOD(bus_read_ivar,        ofw_pci_read_ivar),
+       DEVMETHOD(bus_write_ivar,       ofw_pci_write_ivar),
+       DEVMETHOD(bus_setup_intr,       bus_generic_setup_intr),
+       DEVMETHOD(bus_teardown_intr,    bus_generic_teardown_intr),
+       DEVMETHOD(bus_alloc_resource,   ofw_pci_alloc_resource),
+       DEVMETHOD(bus_release_resource, ofw_pci_release_resource),
+       DEVMETHOD(bus_activate_resource,        ofw_pci_activate_resource),
+       DEVMETHOD(bus_deactivate_resource,      ofw_pci_deactivate_resource),
+       DEVMETHOD(bus_adjust_resource,  ofw_pci_adjust_resource),
+#ifdef __powerpc__
+       DEVMETHOD(bus_get_bus_tag,      ofw_pci_bus_get_bus_tag),
+#endif
+
+       /* pcib interface */
+       DEVMETHOD(pcib_maxslots,        ofw_pci_maxslots),
+       DEVMETHOD(pcib_route_interrupt, ofw_pci_route_interrupt),
+
+       /* ofw_bus interface */
+       DEVMETHOD(ofw_bus_get_node,     ofw_pci_get_node),
+
+       DEVMETHOD_END
+};
+
+DEFINE_CLASS_0(ofw_pci, ofw_pci_driver, ofw_pci_methods, sizeof(struct 
ofw_pci_softc));
+
+int
+ofw_pci_init(device_t dev)
+{
+       struct ofw_pci_softc *sc;
+       phandle_t node;
+       u_int32_t busrange[2];
+       struct ofw_pci_range *rp;
+       int error;
+       struct ofw_pci_cell_info *cell_info;
+
+       node = ofw_bus_get_node(dev);
+       sc = device_get_softc(dev);
+       sc->sc_initialized = 1;
+       sc->sc_range = NULL;
+
+       cell_info = (struct ofw_pci_cell_info *)malloc(sizeof(*cell_info),
+           M_DEVBUF, M_WAITOK | M_ZERO);
+
+       sc->sc_cell_info = cell_info;
+
+       if (OF_getencprop(node, "bus-range", busrange, sizeof(busrange)) != 8)
+               busrange[0] = 0;
+
+       sc->sc_dev = dev;
+       sc->sc_node = node;
+       sc->sc_bus = busrange[0];
+
+       if (sc->sc_quirks & OFW_PCI_QUIRK_RANGES_ON_CHILDREN) {
+               phandle_t c;
+               int n, i;
+
+               sc->sc_nrange = 0;
+               for (c = OF_child(node); c != 0; c = OF_peer(c)) {
+                       n = ofw_pci_nranges(c, cell_info);
+                       if (n > 0)
+                               sc->sc_nrange += n;
+               }
+               if (sc->sc_nrange == 0) {
+                       error = ENXIO;
+                       goto out;
+               }
+               sc->sc_range = malloc(sc->sc_nrange * sizeof(sc->sc_range[0]),
+                   M_DEVBUF, M_WAITOK);
+               i = 0;
+               for (c = OF_child(node); c != 0; c = OF_peer(c)) {
+                       n = ofw_pci_fill_ranges(c, &sc->sc_range[i]);
+                       if (n > 0)
+                               i += n;
+               }
+               KASSERT(i == sc->sc_nrange, ("range count mismatch"));
+       } else {
+               sc->sc_nrange = ofw_pci_nranges(node, cell_info);
+               if (sc->sc_nrange <= 0) {
+                       device_printf(dev, "could not getranges\n");
+                       error = ENXIO;
+                       goto out;
+               }
+               sc->sc_range = malloc(sc->sc_nrange * sizeof(sc->sc_range[0]),
+                   M_DEVBUF, M_WAITOK);
+               ofw_pci_fill_ranges(node, sc->sc_range);
+       }
+
+       sc->sc_io_rman.rm_type = RMAN_ARRAY;
+       sc->sc_io_rman.rm_descr = "PCI I/O Ports";
+       error = rman_init(&sc->sc_io_rman);
+       if (error) {
+               device_printf(dev, "rman_init() failed. error = %d\n", error);
+               goto out;
+       }
+
+       sc->sc_mem_rman.rm_type = RMAN_ARRAY;
+       sc->sc_mem_rman.rm_descr = "PCI Memory";
+       error = rman_init(&sc->sc_mem_rman);
+       if (error) {
+               device_printf(dev, "rman_init() failed. error = %d\n", error);
+               goto out;
+       }
+
+       for (rp = sc->sc_range; rp < sc->sc_range + sc->sc_nrange &&
+           rp->pci_hi != 0; rp++) {
+               error = 0;
+
+               switch (rp->pci_hi & OFW_PCI_PHYS_HI_SPACEMASK) {
+               case OFW_PCI_PHYS_HI_SPACE_CONFIG:
+                       break;
+               case OFW_PCI_PHYS_HI_SPACE_IO:
+                       error = rman_manage_region(&sc->sc_io_rman, rp->pci,
+                           rp->pci + rp->size - 1);
+                       break;
+               case OFW_PCI_PHYS_HI_SPACE_MEM32:
+               case OFW_PCI_PHYS_HI_SPACE_MEM64:
+                       error = rman_manage_region(&sc->sc_mem_rman, rp->pci,
+                           rp->pci + rp->size - 1);
+                       break;
+               }
+
+               if (error) {
+                       device_printf(dev,
+                           "rman_manage_region(%x, %#jx, %#jx) failed. "
+                           "error = %d\n", rp->pci_hi &
+                           OFW_PCI_PHYS_HI_SPACEMASK, rp->pci,
+                           rp->pci + rp->size - 1, error);
+                       goto out;
+               }
+       }
+
+       ofw_bus_setup_iinfo(node, &sc->sc_pci_iinfo, sizeof(cell_t));
+
+out:
+       free(cell_info, M_DEVBUF);
+       free(sc->sc_range, M_DEVBUF);
+       rman_fini(&sc->sc_io_rman);
+       rman_fini(&sc->sc_mem_rman);
+
+       return (error);
+}
+
+int
+ofw_pci_attach(device_t dev)
+{
+       struct ofw_pci_softc *sc;
+       int error;
+
+       sc = device_get_softc(dev);
+       if (!sc->sc_initialized) {
+               error = ofw_pci_init(dev);
+               if (error)
+                       return (error);
+       }
+
+       device_add_child(dev, "pci", -1);
+       return (bus_generic_attach(dev));
+}
+
+static int
+ofw_pci_maxslots(device_t dev)
+{
+
+       return (PCI_SLOTMAX);
+}
+
+int
+ofw_pci_route_interrupt(device_t bus, device_t dev, int pin)
+{
+       struct ofw_pci_softc *sc;
+       struct ofw_pci_register reg;
+       uint32_t pintr, mintr[PCI_MAP_INTR];
+       int intrcells;
+       phandle_t iparent;
+
+       sc = device_get_softc(bus);
+       pintr = pin;
+
+       /* Fabricate imap information in case this isn't an OFW device */
+       bzero(&reg, sizeof(reg));
+       reg.phys_hi = (pci_get_bus(dev) << OFW_PCI_PHYS_HI_BUSSHIFT) |
+           (pci_get_slot(dev) << OFW_PCI_PHYS_HI_DEVICESHIFT) |
+           (pci_get_function(dev) << OFW_PCI_PHYS_HI_FUNCTIONSHIFT);
+
+       intrcells = ofw_bus_lookup_imap(ofw_bus_get_node(dev),
+           &sc->sc_pci_iinfo, &reg, sizeof(reg), &pintr, sizeof(pintr),
+           mintr, sizeof(mintr), &iparent);
+       if (intrcells != 0) {
+               pintr = ofw_bus_map_intr(dev, iparent, intrcells, mintr);
+               return (pintr);
+       }
+
+       /*
+        * Maybe it's a real interrupt, not an intpin
+        */
+       if (pin > PCI_INTR_PINS)
+               return (pin);
+
+       device_printf(bus, "could not route pin %d for device %d.%d\n",
+           pin, pci_get_slot(dev), pci_get_function(dev));
+       return (PCI_INVALID_IRQ);
+}
+
+int
+ofw_pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
+{
+       struct ofw_pci_softc *sc;
+
+       sc = device_get_softc(dev);
+
+       switch (which) {
+       case PCIB_IVAR_DOMAIN:
+               *result = device_get_unit(dev);
+               return (0);
+       case PCIB_IVAR_BUS:
+               *result = sc->sc_bus;
+               return (0);
+       default:
+               break;
+       }
+
+       return (ENOENT);
+}
+
+int
+ofw_pci_write_ivar(device_t dev, device_t child, int which, uintptr_t value)
+{
+       struct ofw_pci_softc *sc;
+
+       sc = device_get_softc(dev);
+
+       switch (which) {
+       case PCIB_IVAR_BUS:
+               sc->sc_bus = value;
+               return (0);
+       default:
+               break;
+       }
+
+       return (ENOENT);
+}
+
+int
+ofw_pci_nranges(phandle_t node, struct ofw_pci_cell_info *info)
+{
+       ssize_t nbase_ranges;
+
+       if (info == NULL)
+               return (-1);
+
+       info->host_address_cells = 1;
+       info->size_cells = 2;
+       info->pci_address_cell = 3;
+
+       OF_getencprop(OF_parent(node), "#address-cells",
+           &(info->host_address_cells), sizeof(info->host_address_cells));
+       OF_getencprop(node, "#address-cells",
+           &(info->pci_address_cell), sizeof(info->pci_address_cell));
+       OF_getencprop(node, "#size-cells", &(info->size_cells),
+           sizeof(info->size_cells));
+
+       nbase_ranges = OF_getproplen(node, "ranges");
+       if (nbase_ranges <= 0)
+               return (-1);
+
+       return (nbase_ranges / sizeof(cell_t) /
+           (info->pci_address_cell + info->host_address_cells +
+           info->size_cells));
+}
+
+struct resource *
+ofw_pci_alloc_resource(device_t bus, device_t child, int type, int *rid,
+    rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
+{
+       struct ofw_pci_softc *sc;
+       struct resource *rv;
+       struct rman *rm;
+       int needactivate;
+
+       needactivate = flags & RF_ACTIVE;
+       flags &= ~RF_ACTIVE;
+
+       sc = device_get_softc(bus);
+
+       switch (type) {
+       case SYS_RES_MEMORY:
+               rm = &sc->sc_mem_rman;
+               break;
+
+       case SYS_RES_IOPORT:
+               rm = &sc->sc_io_rman;
+               break;
+
+       case SYS_RES_IRQ:
+
+#ifdef __sparc64__
+               if (start != end)
+                       panic("%s: XXX: interrupt range", __func__);
+               return (bus_generic_alloc_resource(bus, child, type, rid, start,
+                   end, count, flags));
+#else
+               return (bus_alloc_resource(bus, type, rid, start, end, count,
+                   flags));
+#endif
+
+       default:
+               device_printf(bus, "unknown resource request from %s\n",
+                   device_get_nameunit(child));
+               return (NULL);
+       }
+
+       rv = rman_reserve_resource(rm, start, end, count, flags, child);
+       if (rv == NULL) {
+               device_printf(bus, "failed to reserve resource for %s\n",
+                   device_get_nameunit(child));
+               return (NULL);
+       }
+
+       rman_set_rid(rv, *rid);
+
+       if (needactivate) {
+               if (bus_activate_resource(child, type, *rid, rv) != 0) {
+                       device_printf(bus,
+                           "failed to activate resource for %s\n",
+                           device_get_nameunit(child));
+                       rman_release_resource(rv);
+                       return (NULL);
+               }
+       }
+
+       return (rv);
+}
+
+static int
+ofw_pci_release_resource(device_t bus, device_t child, int type, int rid,
+    struct resource *res)
+{
+
+       if (rman_get_flags(res) & RF_ACTIVE) {
+               int error = bus_deactivate_resource(child, type, rid, res);
+               if (error)
+                       return error;
+       }
+
+       return (rman_release_resource(res));
+}
+
+static int
+ofw_pci_activate_resource(device_t bus, device_t child, int type, int rid,
+    struct resource *res)
+{
+       struct ofw_pci_softc *sc;
+       bus_space_handle_t handle;
+       bus_space_tag_t tag;
+       int rv;
+
+       sc = device_get_softc(bus);
+
+       if (type == SYS_RES_IRQ) {
+               return (bus_activate_resource(bus, type, rid, res));
+       }
+       if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) {
+               struct ofw_pci_range *rp;
+               vm_offset_t start;
+               int space;
+
+               start = (vm_offset_t)rman_get_start(res);
+
+               /*
+                * Map this through the ranges list
+                */
+               for (rp = sc->sc_range; rp < sc->sc_range + sc->sc_nrange &&
+                   rp->pci_hi != 0; rp++) {
+                       if (start < rp->pci || start >= rp->pci + rp->size)
+                               continue;
+
+                       switch (rp->pci_hi & OFW_PCI_PHYS_HI_SPACEMASK) {
+                       case OFW_PCI_PHYS_HI_SPACE_IO:
+                               space = SYS_RES_IOPORT;
+                               break;
+                       case OFW_PCI_PHYS_HI_SPACE_MEM32:
+                       case OFW_PCI_PHYS_HI_SPACE_MEM64:
+                               space = SYS_RES_MEMORY;
+                               break;
+                       default:
+                               space = -1;
+                       }
+
+                       if (type == space) {
+                               start += (rp->host - rp->pci);
+                               break;
+                       }
+               }
+
+               if (bootverbose)
+                       printf("ofw_pci mapdev: start %zx, len %ld\n", start,
+                           rman_get_size(res));
+
+               tag = BUS_GET_BUS_TAG(child, child);
+               if (tag == NULL)
+                       return (ENOMEM);
+
+               rman_set_bustag(res, tag);
+               rv = bus_space_map(tag, start,
+                   rman_get_size(res), 0, &handle);
+               if (rv != 0)
+                       return (ENOMEM);
+
+               rman_set_bushandle(res, handle);
+               rman_set_virtual(res, (void *)handle); /* XXX  for powerpc only 
? */
+       }
+
+       return (rman_activate_resource(res));
+}
+
+#ifdef __powerpc__
+static bus_space_tag_t
+ofw_pci_bus_get_bus_tag(device_t bus, device_t child)
+{
+
+       return (&bs_le_tag);
+}
+#endif
+
+static int
+ofw_pci_deactivate_resource(device_t bus, device_t child, int type, int rid,
+    struct resource *res)
+{
+
+       /*
+        * If this is a memory resource, unmap it.
+        */
+       if ((type == SYS_RES_MEMORY) || (type == SYS_RES_IOPORT)) {
+               u_int32_t psize;
+
+               psize = rman_get_size(res);
+
+               /*
+                * XXX: The implementation is machine-dependent and
+                * sparc64 uses a different function signature as well.
+                */
+#ifndef __sparc64__
+               pmap_unmapdev((vm_offset_t)rman_get_virtual(res), psize);
+#endif
+       }
+
+       return (rman_deactivate_resource(res));
+}
+
+int
+ofw_pci_adjust_resource(device_t bus, device_t child, int type,
+    struct resource *res, rman_res_t start, rman_res_t end)
+{
+       struct rman *rm = NULL;
+       struct ofw_pci_softc *sc = device_get_softc(bus);
+
+       KASSERT(!(rman_get_flags(res) & RF_ACTIVE),
+           ("active resources cannot be adjusted"));
+       if (rman_get_flags(res) & RF_ACTIVE)
+               return (EINVAL);
+
+       switch (type) {
+       case SYS_RES_MEMORY:
+               rm = &sc->sc_mem_rman;
+               break;
+       case SYS_RES_IOPORT:
+               rm = &sc->sc_io_rman;
+               break;
+       case SYS_RES_IRQ:
+               return (bus_generic_adjust_resource(bus, child, type, res,
+                   start, end));
+       default:
+               return (ENXIO);
+       }
+
+       if (!rman_is_region_manager(res, rm))
+               return (EINVAL);
+
+       return (rman_adjust_resource(res, start, end));
+}
+
+phandle_t
+ofw_pci_get_node(device_t bus, device_t dev)
+{
+       struct ofw_pci_softc *sc;
+
+       sc = device_get_softc(bus);
+       /* We only have one child, the PCI bus, which needs our own node. */
+
+       return (sc->sc_node);
+}
+
+bus_dma_tag_t
+ofw_pci_get_dma_tag(device_t bus, device_t child __unused)
+{
+       struct ofw_pci_softc *sc;
+
+       sc = device_get_softc(bus);
+       return (sc->sc_dmat);
+}
+
+int
+ofw_pci_fill_ranges(phandle_t node, struct ofw_pci_range *ranges)
+{
+       struct ofw_pci_cell_info *cell_info;
+       pcell_t *base_ranges;
+       ssize_t nbase_ranges;
+       int nranges;
+       int i, j, k;
+
+       cell_info = (struct ofw_pci_cell_info *)malloc(sizeof(*cell_info),
+           M_DEVBUF, M_WAITOK | M_ZERO);
+
+       nranges = ofw_pci_nranges(node, cell_info);
+
+       nbase_ranges = OF_getproplen(node, "ranges");
+       if (nbase_ranges <= 0)
+               return (-1);
+       base_ranges = malloc(nbase_ranges, M_DEVBUF, M_WAITOK);
+       OF_getencprop(node, "ranges", base_ranges, nbase_ranges);
+
+       for (i = 0, j = 0; i < nranges; i++) {
+               ranges[i].pci_hi = base_ranges[j++];
+               ranges[i].pci = 0;
+               for (k = 0; k < cell_info->pci_address_cell - 1; k++) {
+                       ranges[i].pci <<= 32;
+                       ranges[i].pci |= base_ranges[j++];
+               }
+               ranges[i].host = 0;
+               for (k = 0; k < cell_info->host_address_cells; k++) {
+                       ranges[i].host <<= 32;
+                       ranges[i].host |= base_ranges[j++];
+               }
+               ranges[i].size = 0;
+               for (k = 0; k < cell_info->size_cells; k++) {
+                       ranges[i].size <<= 32;
+                       ranges[i].size |= base_ranges[j++];
+               }
+       }
+
+       free(base_ranges, M_DEVBUF);
+       return (nranges);
+}
diff --git a/sys/dev/ofw/ofw_pci.h b/sys/dev/ofw/ofw_pci.h
index eb60c5b..74355d2 100644
--- a/sys/dev/ofw/ofw_pci.h
+++ b/sys/dev/ofw/ofw_pci.h
@@ -89,6 +89,47 @@
 #define OFW_PCI_PHYS_HI_FUNCTION(hi) \
        (((hi) & OFW_PCI_PHYS_HI_FUNCTIONMASK) >> OFW_PCI_PHYS_HI_FUNCTIONSHIFT)
 
+#define        OFW_PCI_SPACE_NUM               4
+
+/*
+ * Export class definition for inheritance purposes
+ */
+DECLARE_CLASS(ofw_pci_driver);
+
+typedef uint32_t ofw_pci_intr_t;
+
+/* OFW device types */
+#define        OFW_TYPE_PCI            "pci"
+#define        OFW_TYPE_PCIE           "pciex"
+
+struct ofw_pci_msi_addr_ranges {
+       uint32_t        addr32_hi;
+       uint32_t        addr32_lo;
+       uint32_t        addr32_sz;
+       uint32_t        addr64_hi;
+       uint32_t        addr64_lo;
+       uint32_t        addr64_sz;
+};
+
+#define        OFW_PCI_MSI_ADDR_RANGE_32(r) \
+       (((uint64_t)(r)->addr32_hi << 32) | (uint64_t)(r)->addr32_lo)
+#define        OFW_PCI_MSI_ADDR_RANGE_64(r) \
+       (((uint64_t)(r)->addr64_hi << 32) | (uint64_t)(r)->addr64_lo)
+
+struct ofw_pci_msi_eq_to_devino {
+       uint32_t        eq_first;
+       uint32_t        eq_count;
+       uint32_t        devino_first;
+};
+
+struct ofw_pci_msi_ranges {
+       uint32_t        first;
+       uint32_t        count;
+};
+
+/* default values */
+#define        OFW_PCI_LATENCY 64
+
 /*
  * This has the 3 32bit cell values, plus 2 more to make up a 64-bit size.
  */
@@ -100,4 +141,87 @@ struct ofw_pci_register {
        u_int32_t       size_lo;
 };
 
+struct ofw_pci_cell_info {
+       pcell_t host_address_cells;
+       pcell_t pci_address_cell;
+       pcell_t size_cells;
+ };
+
+struct ofw_pci_range {
+       uint32_t        pci_hi;
+       uint64_t        pci;
+       uint64_t        host;
+       uint64_t        size;
+};
+
+/*
+ * Quirks for some adapters
+ */
+enum {
+       OFW_PCI_QUIRK_RANGES_ON_CHILDREN = 1,
+};
+
+/*
+ * Index into the sc_bh[] array, it is
+ * corresponding to the PCI space ranges type
+ */
+enum ofw_pci_ranges_type {
+       OFW_PCI_CONFIG = 0,
+       OFW_PCI_IO,
+       OFW_PCI_MEM32,
+       OFW_PCI_MEM64
+};
+
+struct ofw_pci_softc {
+       device_t        sc_dev;
+       phandle_t       sc_node;
+       int             sc_bus;
+       int             sc_initialized;
+       int             sc_quirks;
+       uint8_t         sc_secbus;
+       uint8_t         sc_subbus;
+
+       struct ofw_pci_range            *sc_range;
+       int                             sc_nrange;
+       struct ofw_pci_cell_info        *sc_cell_info;
+
+       struct rman                     sc_io_rman;
+       struct rman                     sc_mem_rman;
+       bus_space_tag_t                 sc_memt;
+       bus_space_tag_t                 sc_cfgt;
+       bus_space_tag_t                 sc_iot;
+       bus_dma_tag_t                   sc_dmat;
+       bus_space_handle_t              sc_bh[OFW_PCI_SPACE_NUM];
+
+       struct ofw_bus_iinfo            sc_pci_iinfo;
+};
+
+int ofw_pci_init(device_t);
+int ofw_pci_attach(device_t);
+int ofw_pci_read_ivar(device_t, device_t, int, uintptr_t *);
+int ofw_pci_write_ivar(device_t, device_t, int, uintptr_t);
+int ofw_pci_route_interrupt(device_t, device_t, int);
+int ofw_pci_nranges(phandle_t, struct ofw_pci_cell_info *);
+int ofw_pci_fill_ranges(phandle_t, struct ofw_pci_range *);
+
+int ofw_pci_adjust_resource(device_t, device_t, int,
+    struct resource *, u_long, u_long);
+struct resource * ofw_pci_alloc_resource(device_t, device_t,
+    int, int *, u_long, u_long, u_long, u_int);
+int sparc64_ofw_pci_activate_resource(device_t, device_t, int, int,
+    struct resource *);
+int sparc64_ofw_pci_deactivate_resource(device_t, device_t, int, int,
+    struct resource *);
+
+int ofw_pci_attach_common(device_t, bus_dma_tag_t, u_long, u_long);
+uint32_t ofw_pci_read_config_common(device_t, u_int, u_long, u_int, u_int,
+    u_int, u_int, int);
+void ofw_pci_write_config_common(device_t, u_int, u_long, u_int, u_int,
+    u_int, u_int, uint32_t, int);
+ofw_pci_intr_t ofw_pci_route_interrupt_common(device_t, device_t, int);
+void ofw_pci_dmamap_sync_stst_order_common(void);
+
+ofw_bus_get_node_t ofw_pci_get_node;
+bus_get_dma_tag_t ofw_pci_get_dma_tag;
+
 #endif /* _DEV_OFW_OFW_PCI_H_ */
diff --git a/sys/dev/ofw/ofw_subr.c b/sys/dev/ofw/ofw_subr.c
index 4d14db7..e9b66c2 100644
--- a/sys/dev/ofw/ofw_subr.c
+++ b/sys/dev/ofw/ofw_subr.c
@@ -39,8 +39,9 @@ __FBSDID("$FreeBSD$");
 #include <machine/bus.h>
 
 #include <dev/ofw/openfirm.h>
-#include <dev/ofw/ofw_pci.h>
 #include <dev/ofw/ofw_subr.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 
 static void
 get_addr_props(phandle_t node, uint32_t *addrp, uint32_t *sizep, int *pcip)
diff --git a/sys/dev/vt/hw/ofwfb/ofwfb.c b/sys/dev/vt/hw/ofwfb/ofwfb.c
index 0776a8e..ff467fa 100644
--- a/sys/dev/vt/hw/ofwfb/ofwfb.c
+++ b/sys/dev/vt/hw/ofwfb/ofwfb.c
@@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 #include <sys/systm.h>
 #include <sys/fbio.h>
+#include <sys/rman.h>
 
 #include <dev/vt/vt.h>
 #include <dev/vt/hw/fb/vt_fb.h>
@@ -46,6 +47,7 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/ofw/openfirm.h>
 #include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
 #include <dev/ofw/ofw_pci.h>
 
 struct ofwfb_softc {
diff --git a/sys/powerpc/mpc85xx/pci_mpc85xx.c 
b/sys/powerpc/mpc85xx/pci_mpc85xx.c
index 4397ac0..de55afc 100644
--- a/sys/powerpc/mpc85xx/pci_mpc85xx.c
+++ b/sys/powerpc/mpc85xx/pci_mpc85xx.c
@@ -55,15 +55,13 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm.h>
 #include <vm/pmap.h>
 
-#include <dev/ofw/ofw_pci.h>
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcib_private.h>
 
-#include <powerpc/ofw/ofw_pci.h>
-
 #include "ofw_bus_if.h"
 #include "pcib_if.h"
 
diff --git a/sys/powerpc/ofw/ofw_machdep.c b/sys/powerpc/ofw/ofw_machdep.c
index 3051eb3..4092288 100644
--- a/sys/powerpc/ofw/ofw_machdep.c
+++ b/sys/powerpc/ofw/ofw_machdep.c
@@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/fdt/fdt_common.h>
 #include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus_subr.h>
 #include <dev/ofw/ofw_pci.h>
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_subr.h>
diff --git a/sys/powerpc/ofw/ofw_pci.c b/sys/powerpc/ofw/ofw_pci.c
deleted file mode 100644
index 0ca5bc0..0000000
--- a/sys/powerpc/ofw/ofw_pci.c
+++ /dev/null
@@ -1,558 +0,0 @@
-/*-
- * Copyright (c) 2011 Nathan Whitehorn
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/module.h>
-#include <sys/bus.h>
-#include <sys/conf.h>
-#include <sys/kernel.h>
-
-#include <dev/ofw/openfirm.h>
-#include <dev/ofw/ofw_pci.h>
-#include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_bus_subr.h>
-
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-
-#include <machine/bus.h>
-#include <machine/intr_machdep.h>
-#include <machine/md_var.h>
-#include <machine/pio.h>
-#include <machine/resource.h>
-
-#include <sys/rman.h>
-
-#include <vm/vm.h>
-#include <vm/pmap.h>
-
-#include <powerpc/ofw/ofw_pci.h>
-
-#include "pcib_if.h"
-
-/*
- * Bus interface.
- */
-static int             ofw_pci_read_ivar(device_t, device_t, int,
-                           uintptr_t *);
-static struct          resource * ofw_pci_alloc_resource(device_t bus,
-                           device_t child, int type, int *rid, rman_res_t 
start,
-                           rman_res_t end, rman_res_t count, u_int flags);
-static int             ofw_pci_release_resource(device_t bus, device_t child,
-                           int type, int rid, struct resource *res);
-static int             ofw_pci_activate_resource(device_t bus, device_t child,
-                           int type, int rid, struct resource *res);
-static int             ofw_pci_deactivate_resource(device_t bus,
-                           device_t child, int type, int rid,
-                           struct resource *res);
-static int             ofw_pci_adjust_resource(device_t bus, device_t child,
-                           int type, struct resource *res, rman_res_t start,
-                           rman_res_t end);
-
-/*
- * pcib interface.
- */
-static int             ofw_pci_maxslots(device_t);
-static int             ofw_pci_route_interrupt(device_t, device_t, int);
-
-/*
- * ofw_bus interface
- */
-static phandle_t ofw_pci_get_node(device_t bus, device_t dev);
-
-/*
- * local methods
- */
-
-static int ofw_pci_nranges(phandle_t node);
-static int ofw_pci_fill_ranges(phandle_t node, struct ofw_pci_range *ranges);
-
-/*
- * Driver methods.
- */
-static device_method_t ofw_pci_methods[] = {
-       /* Device interface */
-       DEVMETHOD(device_attach,        ofw_pci_attach),
-
-       /* Bus interface */
-       DEVMETHOD(bus_print_child,      bus_generic_print_child),
-       DEVMETHOD(bus_read_ivar,        ofw_pci_read_ivar),
-       DEVMETHOD(bus_setup_intr,       bus_generic_setup_intr),
-       DEVMETHOD(bus_teardown_intr,    bus_generic_teardown_intr),
-       DEVMETHOD(bus_alloc_resource,   ofw_pci_alloc_resource),
-       DEVMETHOD(bus_release_resource, ofw_pci_release_resource),
-       DEVMETHOD(bus_activate_resource,        ofw_pci_activate_resource),
-       DEVMETHOD(bus_deactivate_resource,      ofw_pci_deactivate_resource),
-       DEVMETHOD(bus_adjust_resource,  ofw_pci_adjust_resource),
-
-       /* pcib interface */
-       DEVMETHOD(pcib_maxslots,        ofw_pci_maxslots),
-       DEVMETHOD(pcib_route_interrupt, ofw_pci_route_interrupt),
-
-       /* ofw_bus interface */
-       DEVMETHOD(ofw_bus_get_node,     ofw_pci_get_node),
-
-       DEVMETHOD_END
-};
-
-DEFINE_CLASS_0(ofw_pci, ofw_pci_driver, ofw_pci_methods, 0);
-
-int
-ofw_pci_init(device_t dev)
-{
-       struct          ofw_pci_softc *sc;
-       phandle_t       node;
-       u_int32_t       busrange[2];
-       struct          ofw_pci_range *rp;
-       int             error;
-
-       node = ofw_bus_get_node(dev);
-       sc = device_get_softc(dev);
-       sc->sc_initialized = 1;
-
-       if (OF_getencprop(node, "bus-range", busrange, sizeof(busrange)) != 8)
-               busrange[0] = 0;
-
-       sc->sc_dev = dev;
-       sc->sc_node = node;
-       sc->sc_bus = busrange[0];
-
-       if (sc->sc_quirks & OFW_PCI_QUIRK_RANGES_ON_CHILDREN) {
-               phandle_t c;
-               int n, i;
-               
-               sc->sc_nrange = 0;
-               for (c = OF_child(node); c != 0; c = OF_peer(c)) {
-                       n = ofw_pci_nranges(c);
-                       if (n > 0)
-                               sc->sc_nrange += n;
-               }
-               if (sc->sc_nrange == 0)
-                       return (ENXIO);
-               sc->sc_range = malloc(sc->sc_nrange * sizeof(sc->sc_range[0]),
-                   M_DEVBUF, M_WAITOK);
-               i = 0;
-               for (c = OF_child(node); c != 0; c = OF_peer(c)) {
-                       n = ofw_pci_fill_ranges(c, &sc->sc_range[i]);
-                       if (n > 0)
-                               i += n;
-               }
-               KASSERT(i == sc->sc_nrange, ("range count mismatch"));
-       } else {
-               sc->sc_nrange = ofw_pci_nranges(node);
-               if (sc->sc_nrange <= 0) {
-                       device_printf(dev, "could not get ranges\n");
-                       return (ENXIO);
-               }
-               sc->sc_range = malloc(sc->sc_nrange * sizeof(sc->sc_range[0]),
-                   M_DEVBUF, M_WAITOK);
-               ofw_pci_fill_ranges(node, sc->sc_range);
-       }
-               
-       sc->sc_io_rman.rm_type = RMAN_ARRAY;
-       sc->sc_io_rman.rm_descr = "PCI I/O Ports";
-       error = rman_init(&sc->sc_io_rman);
-       if (error) {
-               device_printf(dev, "rman_init() failed. error = %d\n", error);
-               return (error);
-       }
-
-       sc->sc_mem_rman.rm_type = RMAN_ARRAY;
-       sc->sc_mem_rman.rm_descr = "PCI Memory";
-       error = rman_init(&sc->sc_mem_rman);
-       if (error) {
-               device_printf(dev, "rman_init() failed. error = %d\n", error);
-               return (error);
-       }
-
-       for (rp = sc->sc_range; rp < sc->sc_range + sc->sc_nrange &&
-              rp->pci_hi != 0; rp++) {
-               error = 0;
-
-               switch (rp->pci_hi & OFW_PCI_PHYS_HI_SPACEMASK) {
-               case OFW_PCI_PHYS_HI_SPACE_CONFIG:
-                       break;
-               case OFW_PCI_PHYS_HI_SPACE_IO:
-                       error = rman_manage_region(&sc->sc_io_rman, rp->pci,
-                           rp->pci + rp->size - 1);
-                       break;
-               case OFW_PCI_PHYS_HI_SPACE_MEM32:
-               case OFW_PCI_PHYS_HI_SPACE_MEM64:
-                       error = rman_manage_region(&sc->sc_mem_rman, rp->pci,
-                           rp->pci + rp->size - 1);
-                       break;
-               }
-
-               if (error) {
-                       device_printf(dev, 
-                           "rman_manage_region(%x, %#jx, %#jx) failed. "
-                           "error = %d\n", rp->pci_hi &
-                           OFW_PCI_PHYS_HI_SPACEMASK, rp->pci,
-                           rp->pci + rp->size - 1, error);
-                       return (error);
-               }
-       }
-
-       ofw_bus_setup_iinfo(node, &sc->sc_pci_iinfo, sizeof(cell_t));
-
-       return (error);
-}
-
-int
-ofw_pci_attach(device_t dev)
-{
-       struct ofw_pci_softc *sc;
-       int error;
-
-       sc = device_get_softc(dev);
-       if (!sc->sc_initialized) {
-               error = ofw_pci_init(dev);
-               if (error)
-                       return (error);
-       }
-
-       device_add_child(dev, "pci", -1);
-       return (bus_generic_attach(dev));
-}
-
-static int
-ofw_pci_maxslots(device_t dev)
-{
-
-       return (PCI_SLOTMAX);
-}
-
-static int
-ofw_pci_route_interrupt(device_t bus, device_t dev, int pin)
-{
-       struct ofw_pci_softc *sc;
-       struct ofw_pci_register reg;
-       uint32_t pintr, mintr[2];
-       int intrcells;
-       phandle_t iparent;
-
-       sc = device_get_softc(bus);
-       pintr = pin;
-
-       /* Fabricate imap information in case this isn't an OFW device */
-       bzero(&reg, sizeof(reg));
-       reg.phys_hi = (pci_get_bus(dev) << OFW_PCI_PHYS_HI_BUSSHIFT) |
-           (pci_get_slot(dev) << OFW_PCI_PHYS_HI_DEVICESHIFT) |
-           (pci_get_function(dev) << OFW_PCI_PHYS_HI_FUNCTIONSHIFT);
-
-       intrcells = ofw_bus_lookup_imap(ofw_bus_get_node(dev),
-           &sc->sc_pci_iinfo, &reg, sizeof(reg), &pintr, sizeof(pintr),
-           mintr, sizeof(mintr), &iparent);
-       if (intrcells) {
-               pintr = ofw_bus_map_intr(dev, iparent, intrcells, mintr);
-               return (pintr);
-       }
-
-       /* Maybe it's a real interrupt, not an intpin */
-       if (pin > 4)
-               return (pin);
-
-       device_printf(bus, "could not route pin %d for device %d.%d\n",
-           pin, pci_get_slot(dev), pci_get_function(dev));
-       return (PCI_INVALID_IRQ);
-}
-
-static int
-ofw_pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
-{
-       struct  ofw_pci_softc *sc;
-
-       sc = device_get_softc(dev);
-
-       switch (which) {
-       case PCIB_IVAR_DOMAIN:
-               *result = device_get_unit(dev);
-               return (0);
-       case PCIB_IVAR_BUS:
-               *result = sc->sc_bus;
-               return (0);
-       }
-
-       return (ENOENT);
-}
-
-static struct resource *
-ofw_pci_alloc_resource(device_t bus, device_t child, int type, int *rid,
-    rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
-{
-       struct                  ofw_pci_softc *sc;
-       struct                  resource *rv;
-       struct                  rman *rm;
-       int                     needactivate;
-
-       needactivate = flags & RF_ACTIVE;
-       flags &= ~RF_ACTIVE;
-
-       sc = device_get_softc(bus);
-
-       switch (type) {
-       case SYS_RES_MEMORY:
-               rm = &sc->sc_mem_rman;
-               break;
-
-       case SYS_RES_IOPORT:
-               rm = &sc->sc_io_rman;
-               break;
-
-       case SYS_RES_IRQ:
-               return (bus_alloc_resource(bus, type, rid, start, end, count,
-                   flags));
-
-       default:
-               device_printf(bus, "unknown resource request from %s\n",
-                   device_get_nameunit(child));
-               return (NULL);
-       }
-
-       rv = rman_reserve_resource(rm, start, end, count, flags, child);
-       if (rv == NULL) {
-               device_printf(bus, "failed to reserve resource for %s\n",
-                   device_get_nameunit(child));
-               return (NULL);
-       }
-
-       rman_set_rid(rv, *rid);
-
-       if (needactivate) {
-               if (bus_activate_resource(child, type, *rid, rv) != 0) {
-                       device_printf(bus,
-                           "failed to activate resource for %s\n",
-                           device_get_nameunit(child));
-                       rman_release_resource(rv);
-                       return (NULL);
-               }
-       }
-
-       return (rv);
-}
-
-static int
-ofw_pci_release_resource(device_t bus, device_t child, int type, int rid,
-    struct resource *res)
-{
-       if (rman_get_flags(res) & RF_ACTIVE) {
-               int error = bus_deactivate_resource(child, type, rid, res);
-               if (error)
-                       return error;
-       }
-
-       return (rman_release_resource(res));
-}
-
-static int
-ofw_pci_activate_resource(device_t bus, device_t child, int type, int rid,
-    struct resource *res)
-{
-       struct ofw_pci_softc *sc;
-       void    *p;
-
-       sc = device_get_softc(bus);
-
-       if (type == SYS_RES_IRQ) {
-               return (bus_activate_resource(bus, type, rid, res));
-       }
-       if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) {
-               struct ofw_pci_range *rp;
-               vm_offset_t start;
-               int space;
-
-               start = (vm_offset_t)rman_get_start(res);
-
-               /*
-                * Map this through the ranges list
-                */
-               for (rp = sc->sc_range; rp < sc->sc_range + sc->sc_nrange &&
-                      rp->pci_hi != 0; rp++) {
-                       if (start < rp->pci || start >= rp->pci + rp->size)
-                               continue;
-
-                       switch (rp->pci_hi & OFW_PCI_PHYS_HI_SPACEMASK) {
-                       case OFW_PCI_PHYS_HI_SPACE_IO:
-                               space = SYS_RES_IOPORT;
-                               break;
-                       case OFW_PCI_PHYS_HI_SPACE_MEM32:
-                       case OFW_PCI_PHYS_HI_SPACE_MEM64:
-                               space = SYS_RES_MEMORY;
-                               break;
-                       default:
-                               space = -1;
-                       }
-
-                       if (type == space) {
-                               start += (rp->host - rp->pci);
-                               break;
-                       }
-               }
-
-               if (bootverbose)
-                       printf("ofw_pci mapdev: start %zx, len %ld\n", start,
-                           rman_get_size(res));
-
-               p = pmap_mapdev(start, (vm_size_t)rman_get_size(res));
-               if (p == NULL)
-                       return (ENOMEM);
-
-               rman_set_virtual(res, p);
-               rman_set_bustag(res, &bs_le_tag);
-               rman_set_bushandle(res, (u_long)p);
-       }
-
-       return (rman_activate_resource(res));
-}
-
-static int
-ofw_pci_deactivate_resource(device_t bus, device_t child, int type, int rid,
-    struct resource *res)
-{
-       /*
-        * If this is a memory resource, unmap it.
-        */
-       if ((type == SYS_RES_MEMORY) || (type == SYS_RES_IOPORT)) {
-               u_int32_t psize;
-
-               psize = rman_get_size(res);
-               pmap_unmapdev((vm_offset_t)rman_get_virtual(res), psize);
-       }
-
-       return (rman_deactivate_resource(res));
-}
-
-static int
-ofw_pci_adjust_resource(device_t bus, device_t child, int type,
-    struct resource *res, rman_res_t start, rman_res_t end)
-{
-       struct rman *rm = NULL;
-       struct ofw_pci_softc *sc = device_get_softc(bus);
-
-       KASSERT(!(rman_get_flags(res) & RF_ACTIVE),
-           ("active resources cannot be adjusted"));
-       if (rman_get_flags(res) & RF_ACTIVE)
-               return (EINVAL);
-
-       switch (type) {
-       case SYS_RES_MEMORY:
-               rm = &sc->sc_mem_rman;
-               break;
-       case SYS_RES_IOPORT:
-               rm = &sc->sc_io_rman;
-               break;
-       default:
-               return (ENXIO);
-       }
-
-       if (!rman_is_region_manager(res, rm))
-               return (EINVAL);
-
-       return (rman_adjust_resource(res, start, end));
-}
-       
-
-static phandle_t
-ofw_pci_get_node(device_t bus, device_t dev)
-{
-       struct ofw_pci_softc *sc;
-
-       sc = device_get_softc(bus);
-       /* We only have one child, the PCI bus, which needs our own node. */
-
-       return (sc->sc_node);
-}
-
-static int
-ofw_pci_nranges(phandle_t node)
-{
-       int host_address_cells = 1, pci_address_cells = 3, size_cells = 2;
-       ssize_t nbase_ranges;
-
-       OF_getencprop(OF_parent(node), "#address-cells", &host_address_cells,
-           sizeof(host_address_cells));
-       OF_getencprop(node, "#address-cells", &pci_address_cells,
-           sizeof(pci_address_cells));
-       OF_getencprop(node, "#size-cells", &size_cells, sizeof(size_cells));
-
-       nbase_ranges = OF_getproplen(node, "ranges");
-       if (nbase_ranges <= 0)
-               return (-1);
-
-       return (nbase_ranges / sizeof(cell_t) /
-           (pci_address_cells + host_address_cells + size_cells));
-}
-
-static int
-ofw_pci_fill_ranges(phandle_t node, struct ofw_pci_range *ranges)
-{
-       int host_address_cells = 1, pci_address_cells = 3, size_cells = 2;
-       cell_t *base_ranges;
-       ssize_t nbase_ranges;
-       int nranges;
-       int i, j, k;
-
-       OF_getencprop(OF_parent(node), "#address-cells", &host_address_cells,
-           sizeof(host_address_cells));
-       OF_getencprop(node, "#address-cells", &pci_address_cells,
-           sizeof(pci_address_cells));
-       OF_getencprop(node, "#size-cells", &size_cells, sizeof(size_cells));
-
-       nbase_ranges = OF_getproplen(node, "ranges");
-       if (nbase_ranges <= 0)
-               return (-1);
-       nranges = nbase_ranges / sizeof(cell_t) /
-           (pci_address_cells + host_address_cells + size_cells);
-
-       base_ranges = malloc(nbase_ranges, M_DEVBUF, M_WAITOK);
-       OF_getencprop(node, "ranges", base_ranges, nbase_ranges);
-
-       for (i = 0, j = 0; i < nranges; i++) {
-               ranges[i].pci_hi = base_ranges[j++];
-               ranges[i].pci = 0;
-               for (k = 0; k < pci_address_cells - 1; k++) {
-                       ranges[i].pci <<= 32;
-                       ranges[i].pci |= base_ranges[j++];
-               }
-               ranges[i].host = 0;
-               for (k = 0; k < host_address_cells; k++) {
-                       ranges[i].host <<= 32;
-                       ranges[i].host |= base_ranges[j++];
-               }
-               ranges[i].size = 0;
-               for (k = 0; k < size_cells; k++) {
-                       ranges[i].size <<= 32;
-                       ranges[i].size |= base_ranges[j++];
-               }
-       }
-
-       free(base_ranges, M_DEVBUF);
-       return (nranges);
-}
-
diff --git a/sys/powerpc/ofw/ofw_pci.h b/sys/powerpc/ofw/ofw_pci.h
deleted file mode 100644
index db883d4..0000000
--- a/sys/powerpc/ofw/ofw_pci.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*-
- * Copyright (c) 2011 Nathan Whitehorn
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef POWERPC_OFW_OFW_PCI_H
-#define POWERPC_OFW_OFW_PCI_H
-
-/*
- * Export class definition for inheritance purposes
- */
-DECLARE_CLASS(ofw_pci_driver);
-
-struct ofw_pci_range {
-       uint32_t        pci_hi;
-       uint64_t        pci;
-       uint64_t        host;
-       uint64_t        size;
-};
-
-/*
- * Quirks for some adapters
- */
-enum {
-       OFW_PCI_QUIRK_RANGES_ON_CHILDREN = 1,
-};
-
-struct ofw_pci_softc {
-       device_t                sc_dev;
-       phandle_t               sc_node;
-       int                     sc_bus;
-       int                     sc_initialized;
-
-       int                     sc_quirks;
-
-       struct ofw_pci_range    *sc_range;
-       int                     sc_nrange;
-
-       struct rman             sc_io_rman;
-       struct rman             sc_mem_rman;
-       bus_space_tag_t         sc_memt;
-       bus_dma_tag_t           sc_dmat;
-
-       struct ofw_bus_iinfo    sc_pci_iinfo;
-};
-
-int ofw_pci_init(device_t dev);
-int ofw_pci_attach(device_t dev);
-
-#endif // POWERPC_OFW_OFW_PCI_H
-
diff --git a/sys/powerpc/ofw/ofw_pcib_pci.c b/sys/powerpc/ofw/ofw_pcib_pci.c
index 823f7c9..1c105fb 100644
--- a/sys/powerpc/ofw/ofw_pcib_pci.c
+++ b/sys/powerpc/ofw/ofw_pcib_pci.c
@@ -36,9 +36,9 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 
 #include <dev/ofw/openfirm.h>
-#include <dev/ofw/ofw_pci.h>
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcireg.h>
diff --git a/sys/powerpc/ofw/ofw_pcibus.c b/sys/powerpc/ofw/ofw_pcibus.c
index cde3c74..12aa224 100644
--- a/sys/powerpc/ofw/ofw_pcibus.c
+++ b/sys/powerpc/ofw/ofw_pcibus.c
@@ -54,8 +54,6 @@ __FBSDID("$FreeBSD$");
 #include "pcib_if.h"
 #include "pci_if.h"
 
-typedef uint32_t ofw_pci_intr_t;
-
 /* Methods */
 static device_probe_t ofw_pcibus_probe;
 static device_attach_t ofw_pcibus_attach;
diff --git a/sys/powerpc/ofw/ofw_pcibus.h b/sys/powerpc/ofw/ofw_pcibus.h
index c7b82d7..fad4d66 100644
--- a/sys/powerpc/ofw/ofw_pcibus.h
+++ b/sys/powerpc/ofw/ofw_pcibus.h
@@ -33,6 +33,7 @@
 #include <sys/pciio.h>
 
 #include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
 #include <dev/ofw/ofw_pci.h>
 #include <dev/pci/pcivar.h>
 
diff --git a/sys/powerpc/ofw/ofw_syscons.c b/sys/powerpc/ofw/ofw_syscons.c
index b766485..b42f142 100644
--- a/sys/powerpc/ofw/ofw_syscons.c
+++ b/sys/powerpc/ofw/ofw_syscons.c
@@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/ofw/openfirm.h>
 #include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
 #include <dev/ofw/ofw_pci.h>
 #include <powerpc/ofw/ofw_syscons.h>
 
diff --git a/sys/powerpc/powermac/cpcht.c b/sys/powerpc/powermac/cpcht.c
index 765d946..737e872 100644
--- a/sys/powerpc/powermac/cpcht.c
+++ b/sys/powerpc/powermac/cpcht.c
@@ -36,7 +36,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/rman.h>
 
 #include <dev/ofw/openfirm.h>
-#include <dev/ofw/ofw_pci.h>
 
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcireg.h>
@@ -51,7 +50,7 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_bus_subr.h>
-#include <powerpc/ofw/ofw_pci.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <vm/vm.h>
 #include <vm/pmap.h>
diff --git a/sys/powerpc/powermac/grackle.c b/sys/powerpc/powermac/grackle.c
index 95d59a1..f0928f3 100644
--- a/sys/powerpc/powermac/grackle.c
+++ b/sys/powerpc/powermac/grackle.c
@@ -37,9 +37,9 @@ __FBSDID("$FreeBSD$");
 #include <sys/proc.h>
 
 #include <dev/ofw/openfirm.h>
-#include <dev/ofw/ofw_pci.h>
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcireg.h>
@@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/rman.h>
 
-#include <powerpc/ofw/ofw_pci.h>
 #include <powerpc/powermac/gracklevar.h>
 
 #include <vm/vm.h>
diff --git a/sys/powerpc/powermac/uninorth.c b/sys/powerpc/powermac/uninorth.c
index e34c9d8..357924a 100644
--- a/sys/powerpc/powermac/uninorth.c
+++ b/sys/powerpc/powermac/uninorth.c
@@ -33,9 +33,9 @@
 #include <sys/kernel.h>
 
 #include <dev/ofw/openfirm.h>
-#include <dev/ofw/ofw_pci.h>
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcireg.h>
diff --git a/sys/powerpc/powermac/uninorthpci.c 
b/sys/powerpc/powermac/uninorthpci.c
index 9da06ff..5cb21c1 100644
--- a/sys/powerpc/powermac/uninorthpci.c
+++ b/sys/powerpc/powermac/uninorthpci.c
@@ -34,9 +34,9 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 
 #include <dev/ofw/openfirm.h>
-#include <dev/ofw/ofw_pci.h>
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcireg.h>
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/rman.h>
 
-#include <powerpc/ofw/ofw_pci.h>
 #include <powerpc/powermac/uninorthvar.h>
 
 #include <vm/vm.h>
diff --git a/sys/powerpc/powermac/uninorthvar.h 
b/sys/powerpc/powermac/uninorthvar.h
index e08478d..efe169c 100644
--- a/sys/powerpc/powermac/uninorthvar.h
+++ b/sys/powerpc/powermac/uninorthvar.h
@@ -30,7 +30,6 @@
 
 #include <dev/ofw/ofw_bus_subr.h>
 #include <dev/ofw/ofw_pci.h>
-#include <powerpc/ofw/ofw_pci.h>
 
 struct uninorth_softc {
        struct ofw_pci_softc    pci_sc;
diff --git a/sys/powerpc/pseries/rtas_pci.c b/sys/powerpc/pseries/rtas_pci.c
index bb72b71..1348fc8 100644
--- a/sys/powerpc/pseries/rtas_pci.c
+++ b/sys/powerpc/pseries/rtas_pci.c
@@ -34,9 +34,9 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 
 #include <dev/ofw/openfirm.h>
-#include <dev/ofw/ofw_pci.h>
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcireg.h>
@@ -53,7 +53,6 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm.h>
 #include <vm/pmap.h>
 
-#include <powerpc/ofw/ofw_pci.h>
 #include <powerpc/pseries/plpar_iommu.h>
 
 #include "pcib_if.h"
diff --git a/sys/sparc64/ebus/ebus.c b/sys/sparc64/ebus/ebus.c
index a53b20b..6f705ad 100644
--- a/sys/sparc64/ebus/ebus.c
+++ b/sys/sparc64/ebus/ebus.c
@@ -74,6 +74,7 @@ __FBSDID("$FreeBSD$");
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_bus_subr.h>
 #include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <machine/bus.h>
 #ifndef SUN4V
@@ -85,8 +86,6 @@ __FBSDID("$FreeBSD$");
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
-#include <sparc64/pci/ofw_pci.h>
-
 /*
  * The register, interrupt map and for the PCI variant also the ranges
  * properties are identical to the ISA ones.
diff --git a/sys/sparc64/isa/isa.c b/sys/sparc64/isa/isa.c
index 74627c5..ceccb8a 100644
--- a/sys/sparc64/isa/isa.c
+++ b/sys/sparc64/isa/isa.c
@@ -44,13 +44,14 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <machine/resource.h>
 
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
-#include <sparc64/pci/ofw_pci.h>
 #include <sparc64/isa/ofw_isa.h>
 
 /* There can be only one ISA bus, so it is safe to use globals. */
diff --git a/sys/sparc64/isa/ofw_isa.c b/sys/sparc64/isa/ofw_isa.c
index dbe5d8a..2be894d 100644
--- a/sys/sparc64/isa/ofw_isa.c
+++ b/sys/sparc64/isa/ofw_isa.c
@@ -65,14 +65,15 @@ __FBSDID("$FreeBSD$");
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/bus.h>
+#include <sys/rman.h>
 
 #include <dev/ofw/ofw_bus_subr.h>
 #include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <machine/bus.h>
 #include <machine/resource.h>
 
-#include <sparc64/pci/ofw_pci.h>
 #include <sparc64/isa/ofw_isa.h>
 
 #include "pcib_if.h"
@@ -83,9 +84,9 @@ ofw_isa_range_restype(struct isa_ranges *range)
        int ps = ISA_RANGE_PS(range);
 
        switch (ps) {
-       case OFW_PCI_CS_IO:
+       case OFW_PCI_IO:
                return (SYS_RES_IOPORT);
-       case OFW_PCI_CS_MEM32:
+       case OFW_PCI_MEM32:
                return (SYS_RES_MEMORY);
        default:
                panic("ofw_isa_range_restype: illegal space %x", ps);
diff --git a/sys/sparc64/pci/apb.c b/sys/sparc64/pci/apb.c
index ba3643c..f709e9a 100644
--- a/sys/sparc64/pci/apb.c
+++ b/sys/sparc64/pci/apb.c
@@ -53,6 +53,8 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <machine/bus.h>
 #include <machine/resource.h>
@@ -63,7 +65,6 @@ __FBSDID("$FreeBSD$");
 
 #include "pcib_if.h"
 
-#include <sparc64/pci/ofw_pci.h>
 #include <sparc64/pci/ofw_pcib_subr.h>
 
 /*
diff --git a/sys/sparc64/pci/fire.c b/sys/sparc64/pci/fire.c
index e06ad50..bd795d2 100644
--- a/sys/sparc64/pci/fire.c
+++ b/sys/sparc64/pci/fire.c
@@ -60,6 +60,8 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <vm/vm.h>
 #include <vm/pmap.h>
@@ -74,7 +76,6 @@ __FBSDID("$FreeBSD$");
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
-#include <sparc64/pci/ofw_pci.h>
 #include <sparc64/pci/firereg.h>
 #include <sparc64/pci/firevar.h>
 
@@ -136,8 +137,8 @@ static device_method_t fire_methods[] = {
        DEVMETHOD(bus_setup_intr,       fire_setup_intr),
        DEVMETHOD(bus_teardown_intr,    fire_teardown_intr),
        DEVMETHOD(bus_alloc_resource,   fire_alloc_resource),
-       DEVMETHOD(bus_activate_resource, ofw_pci_activate_resource),
-       DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
+       DEVMETHOD(bus_activate_resource,   sparc64_ofw_pci_activate_resource),
+       DEVMETHOD(bus_deactivate_resource, sparc64_ofw_pci_deactivate_resource),
        DEVMETHOD(bus_adjust_resource,  ofw_pci_adjust_resource),
        DEVMETHOD(bus_release_resource, bus_generic_release_resource),
        DEVMETHOD(bus_get_dma_tag,      ofw_pci_get_dma_tag),
diff --git a/sys/sparc64/pci/ofw_pci.c b/sys/sparc64/pci/ofw_pci.c
deleted file mode 100644
index 8babd49..0000000
--- a/sys/sparc64/pci/ofw_pci.c
+++ /dev/null
@@ -1,406 +0,0 @@
-/*-
- * Copyright (c) 1999, 2000 Matthew R. Green
- * Copyright (c) 2001 - 2003 by Thomas Moestl <t...@freebsd.org>
- * Copyright (c) 2005 - 2015 by Marius Strobl <mar...@freebsd.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *     from: NetBSD: psycho.c,v 1.35 2001/09/10 16:17:06 eeh Exp
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "opt_ofw_pci.h"
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/bus.h>
-#include <sys/kernel.h>
-#include <sys/rman.h>
-
-#include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_pci.h>
-#include <dev/ofw/openfirm.h>
-
-#include <dev/pci/pcireg.h>
-#include <dev/pci/pcivar.h>
-
-#include <machine/asi.h>
-#include <machine/bus.h>
-#include <machine/bus_private.h>
-#include <machine/cpufunc.h>
-#include <machine/fsr.h>
-#include <machine/resource.h>
-
-#include <sparc64/pci/ofw_pci.h>
-
-int
-ofw_pci_attach_common(device_t dev, bus_dma_tag_t dmat, u_long iosize,
-    u_long memsize)
-{
-       struct ofw_pci_softc *sc;
-       struct ofw_pci_ranges *range;
-       phandle_t node;
-       uint32_t prop_array[2];
-       u_int i, j, nrange;
-
-       sc = device_get_softc(dev);
-       node = ofw_bus_get_node(dev);
-       sc->sc_node = node;
-       sc->sc_pci_dmat = dmat;
-
-       /* Initialize memory and I/O rmans. */
-       sc->sc_pci_io_rman.rm_type = RMAN_ARRAY;
-       sc->sc_pci_io_rman.rm_descr = "PCI I/O Ports";
-       if (rman_init(&sc->sc_pci_io_rman) != 0 ||
-           rman_manage_region(&sc->sc_pci_io_rman, 0, iosize) != 0) {
-               device_printf(dev, "failed to set up I/O rman\n");
-               return (ENXIO);
-       }
-       sc->sc_pci_mem_rman.rm_type = RMAN_ARRAY;
-       sc->sc_pci_mem_rman.rm_descr = "PCI Memory";
-       if (rman_init(&sc->sc_pci_mem_rman) != 0 ||
-           rman_manage_region(&sc->sc_pci_mem_rman, 0, memsize) != 0) {
-               device_printf(dev, "failed to set up memory rman\n");
-               return (ENXIO);
-       }
-
-       /*
-        * Find the addresses of the various bus spaces.  The physical
-        * start addresses of the ranges are the configuration, I/O and
-        * memory handles.  There should not be multiple ones of one kind.
-        */
-       nrange = OF_getprop_alloc(node, "ranges", sizeof(*range),
-           (void **)&range);
-       for (i = 0; i < nrange; i++) {
-               j = OFW_PCI_RANGE_CS(&range[i]);
-               if (sc->sc_pci_bh[j] != 0) {
-                       device_printf(dev, "duplicate range for space %d\n",
-                           j);
-                       free(range, M_OFWPROP);
-                       return (EINVAL);
-               }
-               sc->sc_pci_bh[j] = OFW_PCI_RANGE_PHYS(&range[i]);
-       }
-       free(range, M_OFWPROP);
-
-       /*
-        * Make sure that the expected ranges are actually present.
-        * The OFW_PCI_CS_MEM64 one is not currently used.
-        */
-       if (sc->sc_pci_bh[OFW_PCI_CS_CONFIG] == 0) {
-               device_printf(dev, "missing CONFIG range\n");
-               return (ENXIO);
-       }
-       if (sc->sc_pci_bh[OFW_PCI_CS_IO] == 0) {
-               device_printf(dev, "missing IO range\n");
-               return (ENXIO);
-       }
-       if (sc->sc_pci_bh[OFW_PCI_CS_MEM32] == 0) {
-               device_printf(dev, "missing MEM32 range\n");
-               return (ENXIO);
-       }
-
-       /* Allocate our tags. */
-       sc->sc_pci_iot = sparc64_alloc_bus_tag(NULL, PCI_IO_BUS_SPACE);
-       if (sc->sc_pci_iot == NULL) {
-               device_printf(dev, "could not allocate PCI I/O tag\n");
-               return (ENXIO);
-       }
-       sc->sc_pci_cfgt = sparc64_alloc_bus_tag(NULL, PCI_CONFIG_BUS_SPACE);
-       if (sc->sc_pci_cfgt == NULL) {
-               device_printf(dev,
-                   "could not allocate PCI configuration space tag\n");
-               return (ENXIO);
-       }
-
-       /*
-        * Get the bus range from the firmware.
-        */
-       i = OF_getprop(node, "bus-range", (void *)prop_array,
-           sizeof(prop_array));
-       if (i == -1) {
-               device_printf(dev, "could not get bus-range\n");
-               return (ENXIO);
-       }
-       if (i != sizeof(prop_array)) {
-               device_printf(dev, "broken bus-range (%d)", i);
-               return (EINVAL);
-       }
-       sc->sc_pci_secbus = prop_array[0];
-       sc->sc_pci_subbus = prop_array[1];
-       if (bootverbose != 0)
-               device_printf(dev, "bus range %u to %u; PCI bus %d\n",
-                   sc->sc_pci_secbus, sc->sc_pci_subbus, sc->sc_pci_secbus);
-
-       ofw_bus_setup_iinfo(node, &sc->sc_pci_iinfo, sizeof(ofw_pci_intr_t));
-
-       return (0);
-}
-
-uint32_t
-ofw_pci_read_config_common(device_t dev, u_int regmax, u_long offset,
-    u_int bus, u_int slot, u_int func, u_int reg, int width)
-{
-       struct ofw_pci_softc *sc;
-       bus_space_handle_t bh;
-       uint32_t r, wrd;
-       int i;
-       uint16_t shrt;
-       uint8_t byte;
-
-       sc = device_get_softc(dev);
-       if (bus < sc->sc_pci_secbus || bus > sc->sc_pci_subbus ||
-           slot > PCI_SLOTMAX || func > PCI_FUNCMAX || reg > regmax)
-               return (-1);
-
-       bh = sc->sc_pci_bh[OFW_PCI_CS_CONFIG];
-       switch (width) {
-       case 1:
-               i = bus_space_peek_1(sc->sc_pci_cfgt, bh, offset, &byte);
-               r = byte;
-               break;
-       case 2:
-               i = bus_space_peek_2(sc->sc_pci_cfgt, bh, offset, &shrt);
-               r = shrt;
-               break;
-       case 4:
-               i = bus_space_peek_4(sc->sc_pci_cfgt, bh, offset, &wrd);
-               r = wrd;
-               break;
-       default:
-               panic("%s: bad width %d", __func__, width);
-               /* NOTREACHED */
-       }
-
-       if (i) {
-#ifdef OFW_PCI_DEBUG
-               printf("%s: read data error reading: %d.%d.%d: 0x%x\n",
-                   __func__, bus, slot, func, reg);
-#endif
-               r = -1;
-       }
-       return (r);
-}
-
-void
-ofw_pci_write_config_common(device_t dev, u_int regmax, u_long offset,
-    u_int bus, u_int slot, u_int func, u_int reg, uint32_t val, int width)
-{
-       struct ofw_pci_softc *sc;
-       bus_space_handle_t bh;
-
-       sc = device_get_softc(dev);
-       if (bus < sc->sc_pci_secbus || bus > sc->sc_pci_subbus ||
-           slot > PCI_SLOTMAX || func > PCI_FUNCMAX || reg > regmax)
-               return;
-
-       bh = sc->sc_pci_bh[OFW_PCI_CS_CONFIG];
-       switch (width) {
-       case 1:
-               bus_space_write_1(sc->sc_pci_cfgt, bh, offset, val);
-               break;
-       case 2:
-               bus_space_write_2(sc->sc_pci_cfgt, bh, offset, val);
-               break;
-       case 4:
-               bus_space_write_4(sc->sc_pci_cfgt, bh, offset, val);
-               break;
-       default:
-               panic("%s: bad width %d", __func__, width);
-               /* NOTREACHED */
-       }
-}
-
-ofw_pci_intr_t
-ofw_pci_route_interrupt_common(device_t bridge, device_t dev, int pin)
-{
-       struct ofw_pci_softc *sc;
-       struct ofw_pci_register reg;
-       ofw_pci_intr_t pintr, mintr;
-
-       sc = device_get_softc(bridge);
-       pintr = pin;
-       if (ofw_bus_lookup_imap(ofw_bus_get_node(dev), &sc->sc_pci_iinfo,
-           &reg, sizeof(reg), &pintr, sizeof(pintr), &mintr, sizeof(mintr),
-           NULL) != 0)
-               return (mintr);
-       return (PCI_INVALID_IRQ);
-}
-
-void
-ofw_pci_dmamap_sync_stst_order_common(void)
-{
-       static u_char buf[VIS_BLOCKSIZE] __aligned(VIS_BLOCKSIZE);
-       register_t reg, s;
-
-       s = intr_disable();
-       reg = rd(fprs);
-       wr(fprs, reg | FPRS_FEF, 0);
-       __asm __volatile("stda %%f0, [%0] %1"
-           : : "r" (buf), "n" (ASI_BLK_COMMIT_S));
-       membar(Sync);
-       wr(fprs, reg, 0);
-       intr_restore(s);
-}
-
-int
-ofw_pci_read_ivar(device_t dev, device_t child __unused, int which,
-    uintptr_t *result)
-{
-       struct ofw_pci_softc *sc;
-
-       switch (which) {
-       case PCIB_IVAR_DOMAIN:
-               *result = device_get_unit(dev);
-               return (0);
-       case PCIB_IVAR_BUS:
-               sc = device_get_softc(dev);
-               *result = sc->sc_pci_secbus;
-               return (0);
-       }
-       return (ENOENT);
-}
-
-struct resource *
-ofw_pci_alloc_resource(device_t bus, device_t child, int type, int *rid,
-    rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
-{
-       struct ofw_pci_softc *sc;
-       struct resource *rv;
-       struct rman *rm;
-
-       sc = device_get_softc(bus);
-       switch (type) {
-       case SYS_RES_IRQ:
-               /*
-                * XXX: Don't accept blank ranges for now, only single
-                * interrupts.  The other case should not happen with
-                * the MI PCI code ...
-                * XXX: This may return a resource that is out of the
-                * range that was specified.  Is this correct ...?
-                */
-               if (start != end)
-                       panic("%s: XXX: interrupt range", __func__);
-               return (bus_generic_alloc_resource(bus, child, type, rid,
-                   start, end, count, flags));
-       case SYS_RES_MEMORY:
-               rm = &sc->sc_pci_mem_rman;
-               break;
-       case SYS_RES_IOPORT:
-               rm = &sc->sc_pci_io_rman;
-               break;
-       default:
-               return (NULL);
-       }
-
-       rv = rman_reserve_resource(rm, start, end, count, flags & ~RF_ACTIVE,
-           child);
-       if (rv == NULL)
-               return (NULL);
-       rman_set_rid(rv, *rid);
-
-       if ((flags & RF_ACTIVE) != 0 && bus_activate_resource(child, type,
-           *rid, rv) != 0) {
-               rman_release_resource(rv);
-               return (NULL);
-       }
-       return (rv);
-}
-
-int
-ofw_pci_activate_resource(device_t bus, device_t child, int type, int rid,
-    struct resource *r)
-{
-       struct ofw_pci_softc *sc;
-       struct bus_space_tag *tag;
-
-       sc = device_get_softc(bus);
-       switch (type) {
-       case SYS_RES_IRQ:
-               return (bus_generic_activate_resource(bus, child, type, rid,
-                   r));
-       case SYS_RES_MEMORY:
-               tag = sparc64_alloc_bus_tag(r, PCI_MEMORY_BUS_SPACE);
-               if (tag == NULL)
-                       return (ENOMEM);
-               rman_set_bustag(r, tag);
-               rman_set_bushandle(r, sc->sc_pci_bh[OFW_PCI_CS_MEM32] +
-                   rman_get_start(r));
-               break;
-       case SYS_RES_IOPORT:
-               rman_set_bustag(r, sc->sc_pci_iot);
-               rman_set_bushandle(r, sc->sc_pci_bh[OFW_PCI_CS_IO] +
-                   rman_get_start(r));
-               break;
-       }
-       return (rman_activate_resource(r));
-}
-
-int
-ofw_pci_adjust_resource(device_t bus, device_t child, int type,
-    struct resource *r, rman_res_t start, rman_res_t end)
-{
-       struct ofw_pci_softc *sc;
-       struct rman *rm;
-
-       sc = device_get_softc(bus);
-       switch (type) {
-       case SYS_RES_IRQ:
-               return (bus_generic_adjust_resource(bus, child, type, r,
-                   start, end));
-       case SYS_RES_MEMORY:
-               rm = &sc->sc_pci_mem_rman;
-               break;
-       case SYS_RES_IOPORT:
-               rm = &sc->sc_pci_io_rman;
-               break;
-       default:
-               return (EINVAL);
-       }
-       if (rman_is_region_manager(r, rm) == 0)
-               return (EINVAL);
-       return (rman_adjust_resource(r, start, end));
-}
-
-bus_dma_tag_t
-ofw_pci_get_dma_tag(device_t bus, device_t child __unused)
-{
-       struct ofw_pci_softc *sc;
-
-       sc = device_get_softc(bus);
-       return (sc->sc_pci_dmat);
-}
-
-phandle_t
-ofw_pci_get_node(device_t bus, device_t child __unused)
-{
-       struct ofw_pci_softc *sc;
-
-       sc = device_get_softc(bus);
-       /* We only have one child, the PCI bus, which needs our own node. */
-       return (sc->sc_node);
-}
diff --git a/sys/sparc64/pci/ofw_pci.h b/sys/sparc64/pci/ofw_pci.h
deleted file mode 100644
index 6d1e5d9..0000000
--- a/sys/sparc64/pci/ofw_pci.h
+++ /dev/null
@@ -1,170 +0,0 @@
-/*-
- * Copyright (c) 1999, 2000 Matthew R. Green
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*-
- * Copyright (c) 1998, 1999 Eduardo E. Horvath
- * Copyright (c) 2001, 2003 by Thomas Moestl <t...@freebsd.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *     from: NetBSD: psychoreg.h,v 1.14 2008/05/30 02:29:37 mrg Exp
- *
- * $FreeBSD$
- */
-
-#ifndef _SPARC64_PCI_OFW_PCI_H_
-#define        _SPARC64_PCI_OFW_PCI_H_
-
-#include <sys/rman.h>
-
-#include <dev/ofw/ofw_bus_subr.h>
-
-#include "ofw_pci_if.h"
-
-typedef uint32_t ofw_pci_intr_t;
-
-/* PCI range child spaces. XXX: are these MI? */
-#define        OFW_PCI_CS_CONFIG       0x00
-#define        OFW_PCI_CS_IO           0x01
-#define        OFW_PCI_CS_MEM32        0x02
-#define        OFW_PCI_CS_MEM64        0x03
-#define        OFW_PCI_NUM_CS          4
-
-/* OFW device types */
-#define        OFW_TYPE_PCI            "pci"
-#define        OFW_TYPE_PCIE           "pciex"
-
-struct ofw_pci_msi_addr_ranges {
-       uint32_t        addr32_hi;
-       uint32_t        addr32_lo;
-       uint32_t        addr32_sz;
-       uint32_t        addr64_hi;
-       uint32_t        addr64_lo;
-       uint32_t        addr64_sz;
-};
-
-#define        OFW_PCI_MSI_ADDR_RANGE_32(r) \
-       (((uint64_t)(r)->addr32_hi << 32) | (uint64_t)(r)->addr32_lo)
-#define        OFW_PCI_MSI_ADDR_RANGE_64(r) \
-       (((uint64_t)(r)->addr64_hi << 32) | (uint64_t)(r)->addr64_lo)
-
-struct ofw_pci_msi_eq_to_devino {
-       uint32_t        eq_first;
-       uint32_t        eq_count;
-       uint32_t        devino_first;
-};
-
-struct ofw_pci_msi_ranges {
-       uint32_t        first;
-       uint32_t        count;
-};
-
-struct ofw_pci_ranges {
-       uint32_t        cspace;
-       uint32_t        child_hi;
-       uint32_t        child_lo;
-       uint32_t        phys_hi;
-       uint32_t        phys_lo;
-       uint32_t        size_hi;
-       uint32_t        size_lo;
-};
-
-#define        OFW_PCI_RANGE_CHILD(r) \
-       (((uint64_t)(r)->child_hi << 32) | (uint64_t)(r)->child_lo)
-#define        OFW_PCI_RANGE_PHYS(r) \
-       (((uint64_t)(r)->phys_hi << 32) | (uint64_t)(r)->phys_lo)
-#define        OFW_PCI_RANGE_SIZE(r) \
-       (((uint64_t)(r)->size_hi << 32) | (uint64_t)(r)->size_lo)
-#define        OFW_PCI_RANGE_CS(r)     (((r)->cspace >> 24) & 0x03)
-
-/* default values */
-#define        OFW_PCI_LATENCY 64
-
-/*
- * Common and generic parts of host-PCI-bridge support
- */
-
-struct ofw_pci_softc {
-       struct rman             sc_pci_mem_rman;
-       struct rman             sc_pci_io_rman;
-
-       bus_space_handle_t      sc_pci_bh[OFW_PCI_NUM_CS];
-       bus_space_tag_t         sc_pci_cfgt;
-       bus_space_tag_t         sc_pci_iot;
-       bus_dma_tag_t           sc_pci_dmat;
-
-       struct ofw_bus_iinfo    sc_pci_iinfo;
-
-       phandle_t               sc_node;
-
-       uint8_t                 sc_pci_secbus;
-       uint8_t                 sc_pci_subbus;
-};
-
-int ofw_pci_attach_common(device_t dev, bus_dma_tag_t dmat, u_long iosize,
-    u_long memsize);
-uint32_t ofw_pci_read_config_common(device_t dev, u_int regmax, u_long offset,
-    u_int bus, u_int slot, u_int func, u_int reg, int width);
-void ofw_pci_write_config_common(device_t dev, u_int regmax, u_long offset,
-    u_int bus, u_int slot, u_int func, u_int reg, uint32_t val, int width);
-ofw_pci_intr_t ofw_pci_route_interrupt_common(device_t bridge, device_t dev,
-    int pin);
-
-void ofw_pci_dmamap_sync_stst_order_common(void);
-
-bus_activate_resource_t ofw_pci_activate_resource;
-bus_adjust_resource_t ofw_pci_adjust_resource;
-bus_alloc_resource_t ofw_pci_alloc_resource;
-bus_get_dma_tag_t ofw_pci_get_dma_tag;
-bus_read_ivar_t ofw_pci_read_ivar;
-
-ofw_bus_get_node_t ofw_pci_get_node;
-
-#endif /* ! _SPARC64_PCI_OFW_PCI_H_ */
diff --git a/sys/sparc64/pci/ofw_pcib.c b/sys/sparc64/pci/ofw_pcib.c
index 7944237..6b4290b 100644
--- a/sys/sparc64/pci/ofw_pcib.c
+++ b/sys/sparc64/pci/ofw_pcib.c
@@ -46,14 +46,16 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcib_private.h>
 
 #include "pcib_if.h"
+#include "ofw_pci_if.h"
 
-#include <sparc64/pci/ofw_pci.h>
 #include <sparc64/pci/ofw_pcib_subr.h>
 
 #define        PCI_DEVID_ALI_M5249     0x524910b9
diff --git a/sys/sparc64/pci/ofw_pcib_subr.c b/sys/sparc64/pci/ofw_pcib_subr.c
index 14fa72b..4c2b113 100644
--- a/sys/sparc64/pci/ofw_pcib_subr.c
+++ b/sys/sparc64/pci/ofw_pcib_subr.c
@@ -34,8 +34,9 @@ __FBSDID("$FreeBSD$");
 #include <sys/rman.h>
 
 #include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_pci.h>
 #include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <machine/bus.h>
 
@@ -45,7 +46,6 @@ __FBSDID("$FreeBSD$");
 
 #include "pcib_if.h"
 
-#include <sparc64/pci/ofw_pci.h>
 #include <sparc64/pci/ofw_pcib_subr.h>
 
 void
diff --git a/sys/sparc64/pci/ofw_pcibus.c b/sys/sparc64/pci/ofw_pcibus.c
index 92b9f76..178606b 100644
--- a/sys/sparc64/pci/ofw_pcibus.c
+++ b/sys/sparc64/pci/ofw_pcibus.c
@@ -39,10 +39,12 @@ __FBSDID("$FreeBSD$");
 #include <sys/libkern.h>
 #include <sys/module.h>
 #include <sys/pciio.h>
+#include <sys/rman.h>
 
 #include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_pci.h>
 #include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <machine/bus.h>
 #ifndef SUN4V
@@ -55,10 +57,9 @@ __FBSDID("$FreeBSD$");
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pci_private.h>
 
-#include <sparc64/pci/ofw_pci.h>
-
 #include "pcib_if.h"
 #include "pci_if.h"
+#include "ofw_pci_if.h"
 
 /* Helper functions */
 static void ofw_pcibus_setup_device(device_t bridge, uint32_t clock,
diff --git a/sys/sparc64/pci/psycho.c b/sys/sparc64/pci/psycho.c
index 496df96..3441d08 100644
--- a/sys/sparc64/pci/psycho.c
+++ b/sys/sparc64/pci/psycho.c
@@ -58,6 +58,8 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <machine/bus.h>
 #include <machine/bus_common.h>
@@ -70,11 +72,11 @@ __FBSDID("$FreeBSD$");
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
-#include <sparc64/pci/ofw_pci.h>
 #include <sparc64/pci/psychoreg.h>
 #include <sparc64/pci/psychovar.h>
 
 #include "pcib_if.h"
+#include "ofw_pci_if.h"
 
 static const struct psycho_desc *psycho_find_desc(const struct psycho_desc *,
     const char *);
@@ -130,8 +132,8 @@ static device_method_t psycho_methods[] = {
        DEVMETHOD(bus_setup_intr,       psycho_setup_intr),
        DEVMETHOD(bus_teardown_intr,    bus_generic_teardown_intr),
        DEVMETHOD(bus_alloc_resource,   psycho_alloc_resource),
-       DEVMETHOD(bus_activate_resource, ofw_pci_activate_resource),
-       DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
+       DEVMETHOD(bus_activate_resource,   sparc64_ofw_pci_activate_resource),
+       DEVMETHOD(bus_deactivate_resource, sparc64_ofw_pci_deactivate_resource),
        DEVMETHOD(bus_adjust_resource,  ofw_pci_adjust_resource),
        DEVMETHOD(bus_release_resource, bus_generic_release_resource),
        DEVMETHOD(bus_get_dma_tag,      ofw_pci_get_dma_tag),
@@ -541,8 +543,8 @@ psycho_attach(device_t dev)
                panic("%s: ofw_pci_attach_common() failed", __func__);
 
        /* Clear any pending PCI error bits. */
-       PCIB_WRITE_CONFIG(dev, sc->sc_ops.sc_pci_secbus, PCS_DEVICE, PCS_FUNC,
-           PCIR_STATUS, PCIB_READ_CONFIG(dev, sc->sc_ops.sc_pci_secbus,
+       PCIB_WRITE_CONFIG(dev, sc->sc_ops.sc_secbus, PCS_DEVICE, PCS_FUNC,
+           PCIR_STATUS, PCIB_READ_CONFIG(dev, sc->sc_ops.sc_secbus,
            PCS_DEVICE, PCS_FUNC, PCIR_STATUS, 2), 2);
        PCICTL_WRITE8(sc, PCR_CS, PCICTL_READ8(sc, PCR_CS));
        PCICTL_WRITE8(sc, PCR_AFS, PCICTL_READ8(sc, PCR_AFS));
@@ -605,19 +607,19 @@ psycho_attach(device_t dev)
         * Set the latency timer register as this isn't always done by the
         * firmware.
         */
-       PCIB_WRITE_CONFIG(dev, sc->sc_ops.sc_pci_secbus, PCS_DEVICE, PCS_FUNC,
+       PCIB_WRITE_CONFIG(dev, sc->sc_ops.sc_secbus, PCS_DEVICE, PCS_FUNC,
            PCIR_LATTIMER, OFW_PCI_LATENCY, 1);
 
        for (i = PCIR_VENDOR; i < PCIR_STATUS; i += sizeof(uint16_t))
                le16enc(&sc->sc_pci_hpbcfg[i],
-                   bus_space_read_2(sc->sc_ops.sc_pci_cfgt,
-                   sc->sc_ops.sc_pci_bh[OFW_PCI_CS_CONFIG],
-                   PSYCHO_CONF_OFF(sc->sc_ops.sc_pci_secbus, PCS_DEVICE,
+                   bus_space_read_2(sc->sc_ops.sc_cfgt,
+                   sc->sc_ops.sc_bh[OFW_PCI_CONFIG],
+                   PSYCHO_CONF_OFF(sc->sc_ops.sc_secbus, PCS_DEVICE,
                    PCS_FUNC, i)));
        for (i = PCIR_REVID; i <= PCIR_BIST; i += sizeof(uint8_t))
-               sc->sc_pci_hpbcfg[i] = bus_space_read_1(sc->sc_ops.sc_pci_cfgt,
-                   sc->sc_ops.sc_pci_bh[OFW_PCI_CS_CONFIG], PSYCHO_CONF_OFF(
-                   sc->sc_ops.sc_pci_secbus, PCS_DEVICE, PCS_FUNC, i));
+               sc->sc_pci_hpbcfg[i] = bus_space_read_1(sc->sc_ops.sc_cfgt,
+                   sc->sc_ops.sc_bh[OFW_PCI_CONFIG], PSYCHO_CONF_OFF(
+                   sc->sc_ops.sc_secbus, PCS_DEVICE, PCS_FUNC, i));
 
        /*
         * On E250 the interrupt map entry for the EBus bridge is wrong,
@@ -882,7 +884,7 @@ psycho_read_config(device_t dev, u_int bus, u_int slot, 
u_int func, u_int reg,
         * The Psycho bridges contain a dupe of their header at 0x80
         * which we nullify that way also.
         */
-       if (bus == sc->sc_ops.sc_pci_secbus && slot == PCS_DEVICE &&
+       if (bus == sc->sc_ops.sc_secbus && slot == PCS_DEVICE &&
            func == PCS_FUNC) {
                if (reg % width != 0)
                        return (-1);
@@ -893,9 +895,9 @@ psycho_read_config(device_t dev, u_int bus, u_int slot, 
u_int func, u_int reg,
                if ((reg < PCIR_STATUS && reg + width > PCIR_STATUS) ||
                    reg == PCIR_STATUS || reg == PCIR_STATUS + 1)
                        le16enc(&sc->sc_pci_hpbcfg[PCIR_STATUS],
-                           bus_space_read_2(sc->sc_ops.sc_pci_cfgt,
-                           sc->sc_ops.sc_pci_bh[OFW_PCI_CS_CONFIG],
-                           PSYCHO_CONF_OFF(sc->sc_ops.sc_pci_secbus,
+                           bus_space_read_2(sc->sc_ops.sc_cfgt,
+                           sc->sc_ops.sc_bh[OFW_PCI_CONFIG],
+                           PSYCHO_CONF_OFF(sc->sc_ops.sc_secbus,
                            PCS_DEVICE, PCS_FUNC, PCIR_STATUS)));
 
                switch (width) {
diff --git a/sys/sparc64/pci/schizo.c b/sys/sparc64/pci/schizo.c
index a96155b..8e44a5a 100644
--- a/sys/sparc64/pci/schizo.c
+++ b/sys/sparc64/pci/schizo.c
@@ -58,6 +58,8 @@ __FBSDID("$FreeBSD$");
 
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
 
 #include <machine/bus.h>
 #include <machine/bus_common.h>
@@ -69,11 +71,11 @@ __FBSDID("$FreeBSD$");
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
-#include <sparc64/pci/ofw_pci.h>
 #include <sparc64/pci/schizoreg.h>
 #include <sparc64/pci/schizovar.h>
 
 #include "pcib_if.h"
+#include "ofw_pci_if.h"
 
 static const struct schizo_desc *schizo_get_desc(device_t);
 static void schizo_set_intr(struct schizo_softc *, u_int, u_int,
@@ -127,8 +129,8 @@ static device_method_t schizo_methods[] = {
        DEVMETHOD(bus_setup_intr,       schizo_setup_intr),
        DEVMETHOD(bus_teardown_intr,    bus_generic_teardown_intr),
        DEVMETHOD(bus_alloc_resource,   schizo_alloc_resource),
-       DEVMETHOD(bus_activate_resource, ofw_pci_activate_resource),
-       DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
+       DEVMETHOD(bus_activate_resource,   sparc64_ofw_pci_activate_resource),
+       DEVMETHOD(bus_deactivate_resource, sparc64_ofw_pci_deactivate_resource),
        DEVMETHOD(bus_adjust_resource,  ofw_pci_adjust_resource),
        DEVMETHOD(bus_release_resource, bus_generic_release_resource),
        DEVMETHOD(bus_get_dma_tag,      ofw_pci_get_dma_tag),
@@ -548,9 +550,9 @@ schizo_attach(device_t dev)
                panic("%s: ofw_pci_attach_common() failed", __func__);
 
        /* Clear any pending PCI error bits. */
-       PCIB_WRITE_CONFIG(dev, sc->sc_ops.sc_pci_secbus, STX_CS_DEVICE,
+       PCIB_WRITE_CONFIG(dev, sc->sc_ops.sc_secbus, STX_CS_DEVICE,
            STX_CS_FUNC, PCIR_STATUS, PCIB_READ_CONFIG(dev,
-           sc->sc_ops.sc_pci_secbus, STX_CS_DEVICE, STX_CS_FUNC, PCIR_STATUS,
+           sc->sc_ops.sc_secbus, STX_CS_DEVICE, STX_CS_FUNC, PCIR_STATUS,
            2), 2);
        SCHIZO_PCI_SET(sc, STX_PCI_CTRL, SCHIZO_PCI_READ_8(sc, STX_PCI_CTRL));
        SCHIZO_PCI_SET(sc, STX_PCI_AFSR, SCHIZO_PCI_READ_8(sc, STX_PCI_AFSR));
@@ -679,7 +681,7 @@ schizo_attach(device_t dev)
         * Set the latency timer register as this isn't always done by the
         * firmware.
         */
-       PCIB_WRITE_CONFIG(dev, sc->sc_ops.sc_pci_secbus, STX_CS_DEVICE,
+       PCIB_WRITE_CONFIG(dev, sc->sc_ops.sc_secbus, STX_CS_DEVICE,
            STX_CS_FUNC, PCIR_LATTIMER, OFW_PCI_LATENCY, 1);
 
 #define        SCHIZO_SYSCTL_ADD_UINT(name, arg, desc)                         
\
@@ -804,7 +806,7 @@ schizo_pci_bus(void *arg)
                xstat = SCHIZO_PCI_READ_8(sc, XMS_PCI_X_ERR_STAT);
        else
                xstat = 0;
-       status = PCIB_READ_CONFIG(sc->sc_dev, sc->sc_ops.sc_pci_secbus,
+       status = PCIB_READ_CONFIG(sc->sc_dev, sc->sc_ops.sc_secbus,
            STX_CS_DEVICE, STX_CS_FUNC, PCIR_STATUS, 2);
 
        /*
@@ -845,7 +847,7 @@ schizo_pci_bus(void *arg)
            (unsigned long long)iommu, (unsigned long long)xstat, status);
 
        /* Clear the error bits that we caught. */
-       PCIB_WRITE_CONFIG(sc->sc_dev, sc->sc_ops.sc_pci_secbus, STX_CS_DEVICE,
+       PCIB_WRITE_CONFIG(sc->sc_dev, sc->sc_ops.sc_secbus, STX_CS_DEVICE,
            STX_CS_FUNC, PCIR_STATUS, status, 2);
        SCHIZO_PCI_WRITE_8(sc, STX_PCI_CTRL, csr);
        SCHIZO_PCI_WRITE_8(sc, STX_PCI_AFSR, afsr);
@@ -972,7 +974,7 @@ schizo_read_config(device_t dev, u_int bus, u_int slot, 
u_int func, u_int reg,
         * The Schizo bridges contain a dupe of their header at 0x80.
         */
        if (sc->sc_mode == SCHIZO_MODE_SCZ &&
-           bus == sc->sc_ops.sc_pci_secbus && slot == STX_CS_DEVICE &&
+           bus == sc->sc_ops.sc_secbus && slot == STX_CS_DEVICE &&
            func == STX_CS_FUNC && reg + width > 0x80)
                return (0);
 
diff --git a/sys/sparc64/pci/sparc64_ofw_pci.c 
b/sys/sparc64/pci/sparc64_ofw_pci.c
new file mode 100644
index 0000000..5e8d592
--- /dev/null
+++ b/sys/sparc64/pci/sparc64_ofw_pci.c
@@ -0,0 +1,317 @@
+/*-
+ * Copyright (c) 1999, 2000 Matthew R. Green
+ * Copyright (c) 2001 - 2003 by Thomas Moestl <t...@freebsd.org>
+ * Copyright (c) 2005 - 2015 by Marius Strobl <mar...@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     from: NetBSD: psycho.c,v 1.35 2001/09/10 16:17:06 eeh Exp
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_ofw_pci.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/rman.h>
+
+#include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_pci.h>
+
+#include <dev/pci/pcireg.h>
+#include <dev/pci/pcivar.h>
+
+#include <machine/asi.h>
+#include <machine/bus.h>
+#include <machine/bus_private.h>
+#include <machine/cpufunc.h>
+#include <machine/fsr.h>
+#include <machine/resource.h>
+
+#include "ofw_pci_if.h"
+
+static device_method_t sparc64_ofw_pci_methods[] = {
+
+       DEVMETHOD(bus_activate_resource,        
sparc64_ofw_pci_activate_resource),
+       DEVMETHOD(bus_deactivate_resource,      
sparc64_ofw_pci_deactivate_resource),
+
+       DEVMETHOD_END
+};
+
+DEFINE_CLASS_1(ofw_pci, sparc64_ofw_pci_driver, sparc64_ofw_pci_methods,
+    sizeof(struct ofw_pci_softc), ofw_pci_driver);
+
+int
+ofw_pci_attach_common(device_t dev, bus_dma_tag_t dmat, u_long iosize,
+    u_long memsize)
+{
+       struct ofw_pci_softc *sc;
+       struct ofw_pci_range *ranges;
+       phandle_t node;
+       uint32_t prop_array[2];
+       u_int i, j, nrange;
+
+       sc = device_get_softc(dev);
+       node = ofw_bus_get_node(dev);
+       sc->sc_node = node;
+       sc->sc_dmat = dmat;
+
+       /* Initialize memory and I/O rmans. */
+       sc->sc_io_rman.rm_type = RMAN_ARRAY;
+       sc->sc_io_rman.rm_descr = "PCI I/O Ports";
+       if (rman_init(&sc->sc_io_rman) != 0 ||
+           rman_manage_region(&sc->sc_io_rman, 0, iosize) != 0) {
+               device_printf(dev, "failed to set up I/O rman\n");
+               return (ENXIO);
+       }
+       sc->sc_mem_rman.rm_type = RMAN_ARRAY;
+       sc->sc_mem_rman.rm_descr = "PCI Memory";
+       if (rman_init(&sc->sc_mem_rman) != 0 ||
+           rman_manage_region(&sc->sc_mem_rman, 0, memsize) != 0) {
+               device_printf(dev, "failed to set up memory rman\n");
+               return (ENXIO);
+       }
+
+       /*
+        * Find the addresses of the various bus spaces.  The physical
+        * start addresses of the ranges are the configuration, I/O and
+        * memory handles.  There should not be multiple ones of one kind.
+        */
+       nrange = OF_getencprop_alloc(node, "ranges", sizeof(*ranges),
+           (void **)&ranges);
+       for (i = 0; i < nrange; i++) {
+               j = ranges[i].pci_hi & OFW_PCI_PHYS_HI_SPACEMASK;
+               if (sc->sc_bh[j] != 0) {
+                       device_printf(dev, "duplicate range for space %d\n",
+                           j);
+                       free(ranges, M_OFWPROP);
+                       return (EINVAL);
+               }
+               sc->sc_bh[j] = ranges[i].host;
+       }
+       free(ranges, M_OFWPROP);
+
+       /*
+        * Make sure that the expected ranges are actually present.
+        * The OFW_PCI_MEM64 one is not currently used.
+        */
+       if (sc->sc_bh[OFW_PCI_CONFIG] == 0) {
+               device_printf(dev, "missing CONFIG range\n");
+               return (ENXIO);
+       }
+       if (sc->sc_bh[OFW_PCI_IO] == 0) {
+               device_printf(dev, "missing IO range\n");
+               return (ENXIO);
+       }
+       if (sc->sc_bh[OFW_PCI_MEM32] == 0) {
+               device_printf(dev, "missing MEM32 range\n");
+               return (ENXIO);
+       }
+
+       /* Allocate our tags. */
+       sc->sc_iot = sparc64_alloc_bus_tag(NULL, PCI_IO_BUS_SPACE);
+       if (sc->sc_iot == NULL) {
+               device_printf(dev, "could not allocate PCI I/O tag\n");
+               return (ENXIO);
+       }
+       sc->sc_cfgt = sparc64_alloc_bus_tag(NULL, PCI_CONFIG_BUS_SPACE);
+       if (sc->sc_cfgt == NULL) {
+               device_printf(dev,
+                   "could not allocate PCI configuration space tag\n");
+               return (ENXIO);
+       }
+
+       /*
+        * Get the bus range from the firmware.
+        */
+       i = OF_getprop(node, "bus-range", (void *)prop_array,
+           sizeof(prop_array));
+       if (i == -1) {
+               device_printf(dev, "could not get bus-range\n");
+               return (ENXIO);
+       }
+       if (i != sizeof(prop_array)) {
+               device_printf(dev, "broken bus-range (%d)", i);
+               return (EINVAL);
+       }
+       sc->sc_secbus = prop_array[0];
+       sc->sc_subbus = prop_array[1];
+       if (bootverbose != 0)
+               device_printf(dev, "bus range %u to %u; PCI bus %d\n",
+                   sc->sc_secbus, sc->sc_subbus, sc->sc_secbus);
+
+       ofw_bus_setup_iinfo(node, &sc->sc_pci_iinfo, sizeof(ofw_pci_intr_t));
+
+       return (0);
+}
+
+uint32_t
+ofw_pci_read_config_common(device_t dev, u_int regmax, u_long offset,
+    u_int bus, u_int slot, u_int func, u_int reg, int width)
+{
+       struct ofw_pci_softc *sc;
+       bus_space_handle_t bh;
+       uint32_t r, wrd;
+       int i;
+       uint16_t shrt;
+       uint8_t byte;
+
+       sc = device_get_softc(dev);
+       if (bus < sc->sc_secbus || bus > sc->sc_subbus ||
+           slot > PCI_SLOTMAX || func > PCI_FUNCMAX || reg > regmax)
+               return (-1);
+
+       bh = sc->sc_bh[OFW_PCI_CONFIG];
+       switch (width) {
+       case 1:
+               i = bus_space_peek_1(sc->sc_cfgt, bh, offset, &byte);
+               r = byte;
+               break;
+       case 2:
+               i = bus_space_peek_2(sc->sc_cfgt, bh, offset, &shrt);
+               r = shrt;
+               break;
+       case 4:
+               i = bus_space_peek_4(sc->sc_cfgt, bh, offset, &wrd);
+               r = wrd;
+               break;
+       default:
+               panic("%s: bad width %d", __func__, width);
+               /* NOTREACHED */
+       }
+
+       if (i) {
+#ifdef OFW_PCI_DEBUG
+               printf("%s: read data error reading: %d.%d.%d: 0x%x\n",
+                   __func__, bus, slot, func, reg);
+#endif
+               r = -1;
+       }
+       return (r);
+}
+
+void
+ofw_pci_write_config_common(device_t dev, u_int regmax, u_long offset,
+    u_int bus, u_int slot, u_int func, u_int reg, uint32_t val, int width)
+{
+       struct ofw_pci_softc *sc;
+       bus_space_handle_t bh;
+
+       sc = device_get_softc(dev);
+       if (bus < sc->sc_secbus || bus > sc->sc_subbus ||
+           slot > PCI_SLOTMAX || func > PCI_FUNCMAX || reg > regmax)
+               return;
+
+       bh = sc->sc_bh[OFW_PCI_CONFIG];
+       switch (width) {
+       case 1:
+               bus_space_write_1(sc->sc_cfgt, bh, offset, val);
+               break;
+       case 2:
+               bus_space_write_2(sc->sc_cfgt, bh, offset, val);
+               break;
+       case 4:
+               bus_space_write_4(sc->sc_cfgt, bh, offset, val);
+               break;
+       default:
+               panic("%s: bad width %d", __func__, width);
+               /* NOTREACHED */
+       }
+}
+
+ofw_pci_intr_t
+ofw_pci_route_interrupt_common(device_t bridge, device_t dev, int pin)
+{
+       struct ofw_pci_softc *sc;
+       struct ofw_pci_register reg;
+       ofw_pci_intr_t pintr, mintr;
+
+       sc = device_get_softc(bridge);
+       pintr = pin;
+       if (ofw_bus_lookup_imap(ofw_bus_get_node(dev), &sc->sc_pci_iinfo,
+           &reg, sizeof(reg), &pintr, sizeof(pintr), &mintr, sizeof(mintr),
+           NULL) != 0)
+               return (mintr);
+       return (PCI_INVALID_IRQ);
+}
+
+void
+ofw_pci_dmamap_sync_stst_order_common(void)
+{
+       static u_char buf[VIS_BLOCKSIZE] __aligned(VIS_BLOCKSIZE);
+       register_t reg, s;
+
+       s = intr_disable();
+       reg = rd(fprs);
+       wr(fprs, reg | FPRS_FEF, 0);
+       __asm __volatile("stda %%f0, [%0] %1"
+           : : "r" (buf), "n" (ASI_BLK_COMMIT_S));
+       membar(Sync);
+       wr(fprs, reg, 0);
+       intr_restore(s);
+}
+
+int
+sparc64_ofw_pci_activate_resource(device_t bus, device_t child, int type, int 
rid,
+    struct resource *r)
+{
+       struct ofw_pci_softc *sc;
+       struct bus_space_tag *tag;
+
+       sc = device_get_softc(bus);
+       switch (type) {
+       case SYS_RES_IRQ:
+               return (bus_generic_activate_resource(bus, child, type, rid,
+                   r));
+       case SYS_RES_MEMORY:
+               tag = sparc64_alloc_bus_tag(r, PCI_MEMORY_BUS_SPACE);
+               if (tag == NULL)
+                       return (ENOMEM);
+               rman_set_bustag(r, tag);
+               rman_set_bushandle(r, sc->sc_bh[OFW_PCI_MEM32] +
+                   rman_get_start(r));
+               break;
+       case SYS_RES_IOPORT:
+               rman_set_bustag(r, sc->sc_iot);
+               rman_set_bushandle(r, sc->sc_bh[OFW_PCI_IO] +
+                   rman_get_start(r));
+               break;
+       }
+       return (rman_activate_resource(r));
+}
+
+int
+sparc64_ofw_pci_deactivate_resource(device_t bus, device_t child,
+    int type, int rid, struct resource *r)
+{
+
+        return (bus_generic_deactivate_resource(bus, child, type, rid, r));
+}
diff --git a/sys/sparc64/sparc64/jbusppm.c b/sys/sparc64/sparc64/jbusppm.c
index 12f9f0f..0b41054 100644
--- a/sys/sparc64/sparc64/jbusppm.c
+++ b/sys/sparc64/sparc64/jbusppm.c
@@ -35,13 +35,14 @@ __FBSDID("$FreeBSD$");
 #include <sys/resource.h>
 #include <sys/rman.h>
 
+#include <dev/ofw/ofw_bus_subr.h>
 #include <dev/ofw/ofw_bus.h>
 
 #include <machine/bus.h>
 #include <machine/resource.h>
 
 #if 1
-#include <sparc64/pci/ofw_pci.h>
+#include <dev/ofw/ofw_pci.h>
 #endif
 
 #define        JBUSPPM_NREG    2
diff --git a/sys/sparc64/sparc64/ofw_machdep.c 
b/sys/sparc64/sparc64/ofw_machdep.c
index 7fcf5c8..a9b40f8 100644
--- a/sys/sparc64/sparc64/ofw_machdep.c
+++ b/sys/sparc64/sparc64/ofw_machdep.c
@@ -34,12 +34,14 @@ __FBSDID("$FreeBSD$");
 #include <sys/param.h>
 #include <sys/bus.h>
 #include <sys/systm.h>
+#include <sys/rman.h>
 
 #include <net/ethernet.h>
 
+#include <dev/ofw/openfirm.h>
 #include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
 #include <dev/ofw/ofw_pci.h>
-#include <dev/ofw/openfirm.h>
 
 #include <machine/bus.h>
 #include <machine/idprom.h>
_______________________________________________
freebsd-current@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to