Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/pci/pci_host_generic.c
Show All 40 Lines | |||||
#include <sys/kernel.h> | #include <sys/kernel.h> | ||||
#include <sys/rman.h> | #include <sys/rman.h> | ||||
#include <sys/module.h> | #include <sys/module.h> | ||||
#include <sys/bus.h> | #include <sys/bus.h> | ||||
#include <sys/endian.h> | #include <sys/endian.h> | ||||
#include <sys/cpuset.h> | #include <sys/cpuset.h> | ||||
#include <sys/rwlock.h> | #include <sys/rwlock.h> | ||||
#if defined(INTRNG) | |||||
#include <machine/intr.h> | |||||
#endif | |||||
#include <dev/ofw/openfirm.h> | #include <dev/ofw/openfirm.h> | ||||
#include <dev/ofw/ofw_bus.h> | #include <dev/ofw/ofw_bus.h> | ||||
#include <dev/ofw/ofw_bus_subr.h> | #include <dev/ofw/ofw_bus_subr.h> | ||||
#include <dev/ofw/ofw_pci.h> | #include <dev/ofw/ofw_pci.h> | ||||
#include <dev/pci/pcivar.h> | #include <dev/pci/pcivar.h> | ||||
#include <dev/pci/pcireg.h> | #include <dev/pci/pcireg.h> | ||||
#include <dev/pci/pcib_private.h> | #include <dev/pci/pcib_private.h> | ||||
#include <dev/pci/pci_host_generic.h> | #include <dev/pci/pci_host_generic.h> | ||||
▲ Show 20 Lines • Show All 96 Lines • ▼ Show 20 Lines | |||||
int | int | ||||
pci_host_generic_attach(device_t dev) | pci_host_generic_attach(device_t dev) | ||||
{ | { | ||||
struct generic_pcie_softc *sc; | struct generic_pcie_softc *sc; | ||||
uint64_t phys_base; | uint64_t phys_base; | ||||
uint64_t pci_base; | uint64_t pci_base; | ||||
uint64_t size; | uint64_t size; | ||||
phandle_t node; | |||||
int error; | int error; | ||||
int tuple; | int tuple; | ||||
int rid; | int rid; | ||||
sc = device_get_softc(dev); | sc = device_get_softc(dev); | ||||
sc->dev = dev; | sc->dev = dev; | ||||
/* Retrieve 'ranges' property from FDT */ | /* Retrieve 'ranges' property from FDT */ | ||||
▲ Show 20 Lines • Show All 53 Lines • ▼ Show 20 Lines | for (tuple = 0; tuple < MAX_RANGES_TUPLES; tuple++) { | ||||
if (error) { | if (error) { | ||||
device_printf(dev, "rman_manage_region() failed." | device_printf(dev, "rman_manage_region() failed." | ||||
"error = %d\n", error); | "error = %d\n", error); | ||||
rman_fini(&sc->mem_rman); | rman_fini(&sc->mem_rman); | ||||
return (error); | return (error); | ||||
} | } | ||||
} | } | ||||
ofw_bus_setup_iinfo(ofw_bus_get_node(dev), &sc->pci_iinfo, | node = ofw_bus_get_node(dev); | ||||
sizeof(cell_t)); | ofw_bus_setup_iinfo(node, &sc->pci_iinfo, sizeof(cell_t)); | ||||
/* Find the MSI interrupt handler */ | |||||
OF_searchencprop(node, "msi-parent", &sc->msi_parent, | |||||
sizeof(sc->msi_parent)); | |||||
device_add_child(dev, "pci", -1); | device_add_child(dev, "pci", -1); | ||||
return (bus_generic_attach(dev)); | return (bus_generic_attach(dev)); | ||||
} | } | ||||
static int | static int | ||||
parse_pci_mem_ranges(struct generic_pcie_softc *sc) | parse_pci_mem_ranges(struct generic_pcie_softc *sc) | ||||
{ | { | ||||
pcell_t pci_addr_cells, parent_addr_cells; | pcell_t pci_addr_cells, parent_addr_cells; | ||||
▲ Show 20 Lines • Show All 415 Lines • ▼ Show 20 Lines | generic_pcie_deactivate_resource(device_t dev, device_t child, int type, int rid, | ||||
return (res); | return (res); | ||||
} | } | ||||
static int | static int | ||||
generic_pcie_alloc_msi(device_t pci, device_t child, int count, int maxcount, | generic_pcie_alloc_msi(device_t pci, device_t child, int count, int maxcount, | ||||
int *irqs) | int *irqs) | ||||
{ | { | ||||
#if defined(INTRNG) | |||||
struct generic_pcie_softc *sc; | |||||
#if defined(__aarch64__) | sc = device_get_softc(pci); | ||||
return (intr_alloc_msi(pci, child, sc->msi_parent, count, maxcount, | |||||
irqs)); | |||||
#elif defined(__aarch64__) | |||||
return (arm_alloc_msi(pci, child, count, maxcount, irqs)); | return (arm_alloc_msi(pci, child, count, maxcount, irqs)); | ||||
#else | #else | ||||
return (ENXIO); | return (ENXIO); | ||||
#endif | #endif | ||||
} | } | ||||
static int | static int | ||||
generic_pcie_release_msi(device_t pci, device_t child, int count, int *irqs) | generic_pcie_release_msi(device_t pci, device_t child, int count, int *irqs) | ||||
{ | { | ||||
#if defined(INTRNG) | |||||
struct generic_pcie_softc *sc; | |||||
#if defined(__aarch64__) | sc = device_get_softc(pci); | ||||
return (intr_release_msi(pci, child, sc->msi_parent, count, irqs)); | |||||
#elif defined(__aarch64__) | |||||
return (arm_release_msi(pci, child, count, irqs)); | return (arm_release_msi(pci, child, count, irqs)); | ||||
#else | #else | ||||
return (ENXIO); | return (ENXIO); | ||||
#endif | #endif | ||||
} | } | ||||
static int | static int | ||||
generic_pcie_map_msi(device_t pci, device_t child, int irq, uint64_t *addr, | generic_pcie_map_msi(device_t pci, device_t child, int irq, uint64_t *addr, | ||||
uint32_t *data) | uint32_t *data) | ||||
{ | { | ||||
#if defined(INTRNG) | |||||
struct generic_pcie_softc *sc; | |||||
#if defined(__aarch64__) | sc = device_get_softc(pci); | ||||
return (intr_map_msi(pci, child, sc->msi_parent, irq, addr, data)); | |||||
#elif defined(__aarch64__) | |||||
return (arm_map_msi(pci, child, irq, addr, data)); | return (arm_map_msi(pci, child, irq, addr, data)); | ||||
#else | #else | ||||
return (ENXIO); | return (ENXIO); | ||||
#endif | #endif | ||||
} | } | ||||
static int | static int | ||||
generic_pcie_alloc_msix(device_t pci, device_t child, int *irq) | generic_pcie_alloc_msix(device_t pci, device_t child, int *irq) | ||||
{ | { | ||||
#if defined(INTRNG) | |||||
struct generic_pcie_softc *sc; | |||||
#if defined(__aarch64__) | sc = device_get_softc(pci); | ||||
return (intr_alloc_msix(pci, child, sc->msi_parent, irq)); | |||||
#elif defined(__aarch64__) | |||||
return (arm_alloc_msix(pci, child, irq)); | return (arm_alloc_msix(pci, child, irq)); | ||||
#else | #else | ||||
return (ENXIO); | return (ENXIO); | ||||
#endif | #endif | ||||
} | } | ||||
static int | static int | ||||
generic_pcie_release_msix(device_t pci, device_t child, int irq) | generic_pcie_release_msix(device_t pci, device_t child, int irq) | ||||
{ | { | ||||
#if defined(INTRNG) | |||||
struct generic_pcie_softc *sc; | |||||
#if defined(__aarch64__) | sc = device_get_softc(pci); | ||||
return (intr_release_msix(pci, child, sc->msi_parent, irq)); | |||||
#elif defined(__aarch64__) | |||||
return (arm_release_msix(pci, child, irq)); | return (arm_release_msix(pci, child, irq)); | ||||
#else | #else | ||||
return (ENXIO); | return (ENXIO); | ||||
#endif | #endif | ||||
} | } | ||||
static device_method_t generic_pcie_methods[] = { | static device_method_t generic_pcie_methods[] = { | ||||
DEVMETHOD(device_probe, generic_pcie_probe), | DEVMETHOD(device_probe, generic_pcie_probe), | ||||
▲ Show 20 Lines • Show All 156 Lines • Show Last 20 Lines |