PCI/ACPI: Make acpiphp ignore root bridges using SHPC native hotplug
authorRafael J. Wysocki <rjw@sisk.pl>
Sun, 6 Nov 2011 22:11:28 +0000 (23:11 +0100)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Mon, 5 Dec 2011 18:21:48 +0000 (10:21 -0800)
If the kernel has requested control of the SHPC native hotplug
feature for a given root bridge, the acpiphp driver should not try
to handle that root bridge and it should leave it to shpchp.
Failing to do so causes problems to happen if shpchp is loaded
and unloaded before loading acpiphp (ACPI-based hotplug won't work
in that case anyway).

To address this issue make find_root_bridges() ignore PCI root
bridges with SHPC native hotplug enabled and make add_bridge()
return error code if SHPC native hotplug is enabled for the given
root bridge.  This causes acpiphp to refuse to load if SHPC native
hotplug is enabled for all root bridges and to refuse binding to
the root bridges with SHPC native hotplug enabled.

Reviewed-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
drivers/pci/hotplug/acpiphp_glue.c
include/linux/acpi.h

index fce1c54a0c8d8acf480c4b208ced89fb060ac95a..ba43c037de80c314e9e7ec6720ec96da50c6b892 100644 (file)
@@ -467,7 +467,7 @@ static int add_bridge(acpi_handle handle)
         * granted by the BIOS for it.
         */
        root = acpi_pci_find_root(handle);
-       if (root && (root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL))
+       if (root && (root->osc_control_set & OSC_PCI_NATIVE_HOTPLUG))
                return -ENODEV;
 
        /* if the bridge doesn't have _STA, we assume it is always there */
@@ -1395,7 +1395,7 @@ find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
        if (!root)
                return AE_OK;
 
-       if (root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL)
+       if (root->osc_control_set & OSC_PCI_NATIVE_HOTPLUG)
                return AE_OK;
 
        (*count)++;
index 6001b4da39ddc9ebd52e0f7691268abbe8ebb69d..627a3a42e4d8e3ba015ad32a6bf01f779c356943 100644 (file)
@@ -302,6 +302,10 @@ extern bool osc_sb_apei_support_acked;
                                OSC_PCI_EXPRESS_PME_CONTROL |           \
                                OSC_PCI_EXPRESS_AER_CONTROL |           \
                                OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL)
+
+#define OSC_PCI_NATIVE_HOTPLUG (OSC_PCI_EXPRESS_NATIVE_HP_CONTROL |    \
+                               OSC_SHPC_NATIVE_HP_CONTROL)
+
 extern acpi_status acpi_pci_osc_control_set(acpi_handle handle,
                                             u32 *mask, u32 req);
 extern void acpi_early_init(void);