summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2016-04-27 16:39:05 +0000
committerjhb <jhb@FreeBSD.org>2016-04-27 16:39:05 +0000
commit4a26c9bbdf73e90e480ac36d601cd327f8cf76f0 (patch)
treea142f6a2e1963024e2461948295502e9668253cd /sys/dev
parentaf967cc0f01234519d07002e8ad79826aafac3d1 (diff)
downloadFreeBSD-src-4a26c9bbdf73e90e480ac36d601cd327f8cf76f0.zip
FreeBSD-src-4a26c9bbdf73e90e480ac36d601cd327f8cf76f0.tar.gz
Add a pcib_attach_child() method to manage adding the child "pci" device.
This allows the PCI-PCI bridge driver to save a reference to the child device in its softc. Note that this required moving the "pci" device creation out of acpi_pcib_attach(). Instead, acpi_pcib_attach() is renamed to acpi_pcib_fetch_prt() as it's sole action now is to fetch the PCI interrupt routing table. Differential Revision: https://reviews.freebsd.org/D6021
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/acpica/acpi_pcib.c18
-rw-r--r--sys/dev/acpica/acpi_pcib_acpi.c8
-rw-r--r--sys/dev/acpica/acpi_pcib_pci.c4
-rw-r--r--sys/dev/acpica/acpi_pcibvar.h2
-rw-r--r--sys/dev/pci/pci_pci.c27
-rw-r--r--sys/dev/pci/pcib_private.h2
6 files changed, 32 insertions, 29 deletions
diff --git a/sys/dev/acpica/acpi_pcib.c b/sys/dev/acpica/acpi_pcib.c
index c2c2499..ffcb8ca 100644
--- a/sys/dev/acpica/acpi_pcib.c
+++ b/sys/dev/acpica/acpi_pcib.c
@@ -126,11 +126,10 @@ prt_attach_devices(ACPI_PCI_ROUTING_TABLE *entry, void *arg)
ACPI_ADR_PCI_SLOT(entry->Address), entry->Pin);
}
-int
-acpi_pcib_attach(device_t dev, ACPI_BUFFER *prt, int busno)
+void
+acpi_pcib_fetch_prt(device_t dev, ACPI_BUFFER *prt)
{
ACPI_STATUS status;
- int error;
ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
@@ -148,20 +147,9 @@ acpi_pcib_attach(device_t dev, ACPI_BUFFER *prt, int busno)
acpi_name(acpi_get_handle(dev)), AcpiFormatException(status));
/*
- * Attach the PCI bus proper.
- */
- if (device_add_child(dev, "pci", -1) == NULL) {
- device_printf(device_get_parent(dev), "couldn't attach pci bus\n");
- return_VALUE(ENXIO);
- }
-
- /*
- * Now go scan the bus.
+ * Ensure all the link devices are attached.
*/
prt_walk_table(prt, prt_attach_devices, dev);
-
- error = bus_generic_attach(dev);
- return_VALUE(error);
}
static void
diff --git a/sys/dev/acpica/acpi_pcib_acpi.c b/sys/dev/acpica/acpi_pcib_acpi.c
index f31bab7..e9bcbd1 100644
--- a/sys/dev/acpica/acpi_pcib_acpi.c
+++ b/sys/dev/acpica/acpi_pcib_acpi.c
@@ -502,7 +502,13 @@ acpi_pcib_acpi_attach(device_t dev)
if (sc->ap_segment == 0 && sc->ap_bus == 0)
bus0_seen = 1;
- return (acpi_pcib_attach(dev, &sc->ap_prt, sc->ap_bus));
+ acpi_pcib_fetch_prt(dev, &sc->ap_prt);
+
+ if (device_add_child(dev, "pci", -1) == NULL) {
+ device_printf(device_get_parent(dev), "couldn't attach pci bus\n");
+ return (ENXIO);
+ }
+ return (bus_generic_attach(dev));
}
/*
diff --git a/sys/dev/acpica/acpi_pcib_pci.c b/sys/dev/acpica/acpi_pcib_pci.c
index d3f4cbc..ca94d38 100644
--- a/sys/dev/acpica/acpi_pcib_pci.c
+++ b/sys/dev/acpica/acpi_pcib_pci.c
@@ -120,7 +120,9 @@ acpi_pcib_pci_attach(device_t dev)
pcib_attach_common(dev);
sc = device_get_softc(dev);
sc->ap_handle = acpi_get_handle(dev);
- return (acpi_pcib_attach(dev, &sc->ap_prt, sc->ap_pcibsc.bus.sec));
+ acpi_pcib_fetch_prt(dev, &sc->ap_prt);
+
+ return (pcib_attach_child(dev));
}
static int
diff --git a/sys/dev/acpica/acpi_pcibvar.h b/sys/dev/acpica/acpi_pcibvar.h
index 9a4be07..f563e77 100644
--- a/sys/dev/acpica/acpi_pcibvar.h
+++ b/sys/dev/acpica/acpi_pcibvar.h
@@ -35,7 +35,7 @@
void acpi_pci_link_add_reference(device_t dev, int index, device_t pcib,
int slot, int pin);
int acpi_pci_link_route_interrupt(device_t dev, int index);
-int acpi_pcib_attach(device_t bus, ACPI_BUFFER *prt, int busno);
+void acpi_pcib_fetch_prt(device_t bus, ACPI_BUFFER *prt);
int acpi_pcib_route_interrupt(device_t pcib, device_t dev, int pin,
ACPI_BUFFER *prtbuf);
int acpi_pcib_power_for_sleep(device_t pcib, device_t dev,
diff --git a/sys/dev/pci/pci_pci.c b/sys/dev/pci/pci_pci.c
index 112b198..76643bc 100644
--- a/sys/dev/pci/pci_pci.c
+++ b/sys/dev/pci/pci_pci.c
@@ -1075,21 +1075,26 @@ pcib_attach_common(device_t dev)
}
int
+pcib_attach_child(device_t dev)
+{
+ struct pcib_softc *sc;
+
+ sc = device_get_softc(dev);
+ if (sc->bus.sec == 0) {
+ /* no secondary bus; we should have fixed this */
+ return(0);
+ }
+
+ sc->child = device_add_child(dev, "pci", -1);
+ return (bus_generic_attach(dev));
+}
+
+int
pcib_attach(device_t dev)
{
- struct pcib_softc *sc;
- device_t child;
pcib_attach_common(dev);
- sc = device_get_softc(dev);
- if (sc->bus.sec != 0) {
- child = device_add_child(dev, "pci", -1);
- if (child != NULL)
- return(bus_generic_attach(dev));
- }
-
- /* no secondary bus; we should have fixed this */
- return(0);
+ return (pcib_attach_child(dev));
}
int
diff --git a/sys/dev/pci/pcib_private.h b/sys/dev/pci/pcib_private.h
index 417c107..93d9a71 100644
--- a/sys/dev/pci/pcib_private.h
+++ b/sys/dev/pci/pcib_private.h
@@ -101,6 +101,7 @@ struct pcib_secbus {
struct pcib_softc
{
device_t dev;
+ device_t child;
uint32_t flags; /* flags */
#define PCIB_SUBTRACTIVE 0x1
#define PCIB_DISABLE_MSI 0x2
@@ -144,6 +145,7 @@ void pcib_setup_secbus(device_t dev, struct pcib_secbus *bus,
int min_count);
#endif
int pcib_attach(device_t dev);
+int pcib_attach_child(device_t dev);
void pcib_attach_common(device_t dev);
void pcib_bridge_init(device_t dev);
#ifdef NEW_PCIB
OpenPOWER on IntegriCloud