acpi/pcib: If bus does not present, give other bus drivers chance
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 17 Apr 2011 10:58:26 +0000 (18:58 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 17 Apr 2011 10:58:26 +0000 (18:58 +0800)
- Call acpi_DeviceIsPresent() during probing, so that if bus does not
  present other bus drivers could have chance to take over the bus.
- In acpi_pcib_attach(), assert that bus is present, since the presence
  of the bus is checked during probing.

Reported-by: swildner@
sys/dev/acpica5/acpi_pcib.c
sys/dev/acpica5/acpi_pcib_acpi.c
sys/dev/acpica5/acpi_pcib_pci.c
sys/dev/acpica5/acpi_pcibvar.h

index 6c238ac..36addd9 100644 (file)
@@ -40,6 +40,7 @@
 
 #include <bus/pci/pcivar.h>
 #include <bus/pci/pcireg.h>
+#include <bus/pci/pci_cfgreg.h>
 #include "pcib_if.h"
 
 /* Hooks for the ACPI CA debugging infrastructure. */
@@ -133,14 +134,10 @@ acpi_pcib_attach(device_t dev, ACPI_BUFFER *prt, int busno)
 
     ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
 
-    /*
-     * Don't attach if we're not really there.
-     *
-     * XXX: This isn't entirely correct since we may be a PCI bus
-     * on a hot-plug docking station, etc.
-     */
-    if (!acpi_DeviceIsPresent(dev))
-       return_VALUE(ENXIO);
+    if (!acpi_DeviceIsPresent(dev)) {
+       /* Caller should already have checked it */
+       panic("%s device is not present\n", __func__);
+    }
 
     ACPI_SERIAL_INIT(pcib);
 
@@ -287,3 +284,21 @@ out:
 
     return_VALUE (interrupt);
 }
+
+int
+acpi_pcib_probe(device_t dev)
+{
+    /*
+     * Don't attach if we're not really there.
+     *
+     * XXX: This isn't entirely correct since we may be a PCI bus
+     * on a hot-plug docking station, etc.
+     */
+    if (!acpi_DeviceIsPresent(dev))
+       return ENXIO;
+
+    if (pci_cfgregopen() == 0)
+       return ENXIO;
+
+    return 0;
+}
index 9debe24..e5661ee 100644 (file)
@@ -38,7 +38,7 @@
 #include "acpi.h"
 #include <dev/acpica5/acpivar.h>
 
-#include <bus/pci/i386/pci_cfgreg.h>
+#include <bus/pci/pci_cfgreg.h>
 #include <bus/pci/pcivar.h>
 #include <bus/pci/pcib_private.h>
 #include "pcib_if.h"
@@ -130,14 +130,18 @@ MODULE_DEPEND(acpi_pcib, acpi, 1, 1, 1);
 static int
 acpi_pcib_acpi_probe(device_t dev)
 {
+    int error;
+
     static char *pcib_ids[] = { "PNP0A03", NULL };
 
     if (acpi_disabled("pcib") ||
        ACPI_ID_PROBE(device_get_parent(dev), dev, pcib_ids) == NULL)
        return (ENXIO);
 
-    if (pci_cfgregopen() == 0)
-       return (ENXIO);
+    error = acpi_pcib_probe(dev);
+    if (error)
+       return (error);
+
     device_set_desc(dev, "ACPI Host-PCI bridge");
     return (0);
 }
index e29e152..11bf0e4 100644 (file)
@@ -39,7 +39,6 @@
 #include <dev/acpica5/acpivar.h>
 #include <dev/acpica5/acpi_pcibvar.h>
 
-#include <bus/pci/i386/pci_cfgreg.h>
 #include <bus/pci/pcivar.h>
 #include <bus/pci/pcireg.h>
 #include <bus/pci/pcib_private.h>
@@ -111,14 +110,16 @@ MODULE_DEPEND(acpi_pcib, acpi, 1, 1, 1);
 static int
 acpi_pcib_pci_probe(device_t dev)
 {
+    int error;
+
     if (pci_get_class(dev) != PCIC_BRIDGE ||
        pci_get_subclass(dev) != PCIS_BRIDGE_PCI ||
        acpi_disabled("pci"))
        return (ENXIO);
-    if (acpi_get_handle(dev) == NULL)
-       return (ENXIO);
-    if (pci_cfgregopen() == 0)
-       return (ENXIO);
+
+    error = acpi_pcib_probe(dev);
+    if (error)
+       return (error);
 
     device_set_desc(dev, "ACPI PCI-PCI bridge");
     return (-100);
index bbbacd5..0175756 100644 (file)
@@ -34,6 +34,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_probe(device_t bus);
 int    acpi_pcib_attach(device_t bus, ACPI_BUFFER *prt, int busno);
 int    acpi_pcib_route_interrupt(device_t pcib, device_t dev, int pin,
     ACPI_BUFFER *prtbuf);