|
@@ -459,8 +459,17 @@ static int add_bridge(acpi_handle handle)
|
|
{
|
|
{
|
|
acpi_status status;
|
|
acpi_status status;
|
|
unsigned long long tmp;
|
|
unsigned long long tmp;
|
|
|
|
+ struct acpi_pci_root *root;
|
|
acpi_handle dummy_handle;
|
|
acpi_handle dummy_handle;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * We shouldn't use this bridge if PCIe native hotplug control has been
|
|
|
|
+ * granted by the BIOS for it.
|
|
|
|
+ */
|
|
|
|
+ root = acpi_pci_find_root(handle);
|
|
|
|
+ if (root && (root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL))
|
|
|
|
+ return -ENODEV;
|
|
|
|
+
|
|
/* if the bridge doesn't have _STA, we assume it is always there */
|
|
/* if the bridge doesn't have _STA, we assume it is always there */
|
|
status = acpi_get_handle(handle, "_STA", &dummy_handle);
|
|
status = acpi_get_handle(handle, "_STA", &dummy_handle);
|
|
if (ACPI_SUCCESS(status)) {
|
|
if (ACPI_SUCCESS(status)) {
|
|
@@ -1376,13 +1385,23 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type,
|
|
static acpi_status
|
|
static acpi_status
|
|
find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
|
|
find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
|
|
{
|
|
{
|
|
|
|
+ struct acpi_pci_root *root;
|
|
int *count = (int *)context;
|
|
int *count = (int *)context;
|
|
|
|
|
|
- if (acpi_is_root_bridge(handle)) {
|
|
|
|
- acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
|
|
|
|
- handle_hotplug_event_bridge, NULL);
|
|
|
|
- (*count)++;
|
|
|
|
- }
|
|
|
|
|
|
+ if (!acpi_is_root_bridge(handle))
|
|
|
|
+ return AE_OK;
|
|
|
|
+
|
|
|
|
+ root = acpi_pci_find_root(handle);
|
|
|
|
+ if (!root)
|
|
|
|
+ return AE_OK;
|
|
|
|
+
|
|
|
|
+ if (root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL)
|
|
|
|
+ return AE_OK;
|
|
|
|
+
|
|
|
|
+ (*count)++;
|
|
|
|
+ acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
|
|
|
|
+ handle_hotplug_event_bridge, NULL);
|
|
|
|
+
|
|
return AE_OK ;
|
|
return AE_OK ;
|
|
}
|
|
}
|
|
|
|
|