Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/pci/pci_host_generic_acpi.c
Show First 20 Lines • Show All 342 Lines • ▼ Show 20 Lines | |||||
generic_pcie_acpi_route_interrupt(device_t bus, device_t dev, int pin) | generic_pcie_acpi_route_interrupt(device_t bus, device_t dev, int pin) | ||||
{ | { | ||||
struct generic_pcie_acpi_softc *sc; | struct generic_pcie_acpi_softc *sc; | ||||
sc = device_get_softc(bus); | sc = device_get_softc(bus); | ||||
return (acpi_pcib_route_interrupt(bus, dev, pin, &sc->ap_prt)); | return (acpi_pcib_route_interrupt(bus, dev, pin, &sc->ap_prt)); | ||||
} | } | ||||
static u_int | |||||
generic_pcie_get_xref(device_t pci, device_t child) | |||||
{ | |||||
struct generic_pcie_acpi_softc *sc; | |||||
uintptr_t rid; | |||||
u_int xref, devid; | |||||
int err; | |||||
sc = device_get_softc(pci); | |||||
err = pcib_get_id(pci, child, PCI_ID_RID, &rid); | |||||
andrew: This should check the return status. | |||||
Done Inline Actionspcib_get_id is not likely to fail when type is PCI_ID_RID - so I didn't think it was needed. Anyway, I will fix it up. jchandra: pcib_get_id is not likely to fail when type is PCI_ID_RID - so I didn't think it was needed. | |||||
if (err != 0) | |||||
return (ACPI_MSI_XREF); | |||||
err = acpi_iort_map_pci_msi(sc->base.ecam, rid, &xref, &devid); | |||||
if (err != 0) | |||||
return (ACPI_MSI_XREF); | |||||
return (xref); | |||||
} | |||||
static u_int | |||||
generic_pcie_map_id(device_t pci, device_t child, uintptr_t *id) | |||||
{ | |||||
struct generic_pcie_acpi_softc *sc; | |||||
uintptr_t rid; | |||||
u_int xref, devid; | |||||
int err; | |||||
sc = device_get_softc(pci); | |||||
err = pcib_get_id(pci, child, PCI_ID_RID, &rid); | |||||
if (err != 0) | |||||
return (err); | |||||
err = acpi_iort_map_pci_msi(sc->base.ecam, rid, &xref, &devid); | |||||
if (err == 0) | |||||
*id = devid; | |||||
else | |||||
*id = rid; /* RID not in IORT, likely FW bug, ignore */ | |||||
return (0); | |||||
} | |||||
static int | static int | ||||
generic_pcie_acpi_alloc_msi(device_t pci, device_t child, int count, | generic_pcie_acpi_alloc_msi(device_t pci, device_t child, int count, | ||||
int maxcount, int *irqs) | int maxcount, int *irqs) | ||||
{ | { | ||||
#if defined(INTRNG) | #if defined(INTRNG) | ||||
return (intr_alloc_msi(pci, child, ACPI_MSI_XREF, count, maxcount, | return (intr_alloc_msi(pci, child, generic_pcie_get_xref(pci, child), | ||||
irqs)); | count, maxcount, irqs)); | ||||
#else | #else | ||||
return (ENXIO); | return (ENXIO); | ||||
#endif | #endif | ||||
} | } | ||||
static int | static int | ||||
generic_pcie_acpi_release_msi(device_t pci, device_t child, int count, | generic_pcie_acpi_release_msi(device_t pci, device_t child, int count, | ||||
int *irqs) | int *irqs) | ||||
{ | { | ||||
#if defined(INTRNG) | #if defined(INTRNG) | ||||
return (intr_release_msi(pci, child, ACPI_MSI_XREF, count, irqs)); | return (intr_release_msi(pci, child, generic_pcie_get_xref(pci, child), | ||||
count, irqs)); | |||||
#else | #else | ||||
return (ENXIO); | return (ENXIO); | ||||
#endif | #endif | ||||
} | } | ||||
static int | static int | ||||
generic_pcie_acpi_map_msi(device_t pci, device_t child, int irq, uint64_t *addr, | generic_pcie_acpi_map_msi(device_t pci, device_t child, int irq, uint64_t *addr, | ||||
uint32_t *data) | uint32_t *data) | ||||
{ | { | ||||
#if defined(INTRNG) | #if defined(INTRNG) | ||||
return (intr_map_msi(pci, child, ACPI_MSI_XREF, irq, addr, data)); | return (intr_map_msi(pci, child, generic_pcie_get_xref(pci, child), irq, | ||||
addr, data)); | |||||
#else | #else | ||||
return (ENXIO); | return (ENXIO); | ||||
#endif | #endif | ||||
} | } | ||||
static int | static int | ||||
generic_pcie_acpi_alloc_msix(device_t pci, device_t child, int *irq) | generic_pcie_acpi_alloc_msix(device_t pci, device_t child, int *irq) | ||||
{ | { | ||||
#if defined(INTRNG) | #if defined(INTRNG) | ||||
return (intr_alloc_msix(pci, child, ACPI_MSI_XREF, irq)); | return (intr_alloc_msix(pci, child, generic_pcie_get_xref(pci, child), | ||||
irq)); | |||||
#else | #else | ||||
return (ENXIO); | return (ENXIO); | ||||
#endif | #endif | ||||
} | } | ||||
static int | static int | ||||
generic_pcie_acpi_release_msix(device_t pci, device_t child, int irq) | generic_pcie_acpi_release_msix(device_t pci, device_t child, int irq) | ||||
{ | { | ||||
#if defined(INTRNG) | #if defined(INTRNG) | ||||
return (intr_release_msix(pci, child, ACPI_MSI_XREF, irq)); | return (intr_release_msix(pci, child, generic_pcie_get_xref(pci, child), | ||||
irq)); | |||||
#else | #else | ||||
return (ENXIO); | return (ENXIO); | ||||
#endif | #endif | ||||
} | } | ||||
static int | static int | ||||
generic_pcie_acpi_get_id(device_t pci, device_t child, enum pci_id_type type, | generic_pcie_acpi_get_id(device_t pci, device_t child, enum pci_id_type type, | ||||
uintptr_t *id) | uintptr_t *id) | ||||
{ | { | ||||
/* | |||||
* Use the PCI RID to find the MSI ID for now, we support only 1:1 | |||||
* mapping | |||||
* | |||||
* On aarch64, more complex mapping would come from IORT table | |||||
*/ | |||||
if (type == PCI_ID_MSI) | if (type == PCI_ID_MSI) | ||||
return (pcib_get_id(pci, child, PCI_ID_RID, id)); | return (generic_pcie_map_id(pci, child, id)); | ||||
else | else | ||||
return (pcib_get_id(pci, child, type, id)); | return (pcib_get_id(pci, child, type, id)); | ||||
} | } | ||||
static device_method_t generic_pcie_acpi_methods[] = { | static device_method_t generic_pcie_acpi_methods[] = { | ||||
DEVMETHOD(device_probe, generic_pcie_acpi_probe), | DEVMETHOD(device_probe, generic_pcie_acpi_probe), | ||||
DEVMETHOD(device_attach, pci_host_generic_acpi_attach), | DEVMETHOD(device_attach, pci_host_generic_acpi_attach), | ||||
DEVMETHOD(bus_read_ivar, generic_pcie_acpi_read_ivar), | DEVMETHOD(bus_read_ivar, generic_pcie_acpi_read_ivar), | ||||
Show All 20 Lines |
This should check the return status.