|
@@ -421,7 +421,8 @@ out:
|
|
|
}
|
|
|
EXPORT_SYMBOL(acpi_pci_osc_control_set);
|
|
|
|
|
|
-static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm)
|
|
|
+static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm,
|
|
|
+ bool is_pcie)
|
|
|
{
|
|
|
u32 support, control, requested;
|
|
|
acpi_status status;
|
|
@@ -455,10 +456,15 @@ static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm)
|
|
|
decode_osc_support(root, "OS supports", support);
|
|
|
status = acpi_pci_osc_support(root, support);
|
|
|
if (ACPI_FAILURE(status)) {
|
|
|
+ *no_aspm = 1;
|
|
|
+
|
|
|
+ /* _OSC is optional for PCI host bridges */
|
|
|
+ if ((status == AE_NOT_FOUND) && !is_pcie)
|
|
|
+ return;
|
|
|
+
|
|
|
dev_info(&device->dev, "_OSC failed (%s)%s\n",
|
|
|
acpi_format_exception(status),
|
|
|
pcie_aspm_support_enabled() ? "; disabling ASPM" : "");
|
|
|
- *no_aspm = 1;
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -534,6 +540,7 @@ static int acpi_pci_root_add(struct acpi_device *device,
|
|
|
acpi_handle handle = device->handle;
|
|
|
int no_aspm = 0;
|
|
|
bool hotadd = system_state == SYSTEM_RUNNING;
|
|
|
+ bool is_pcie;
|
|
|
|
|
|
root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL);
|
|
|
if (!root)
|
|
@@ -591,7 +598,8 @@ static int acpi_pci_root_add(struct acpi_device *device,
|
|
|
|
|
|
root->mcfg_addr = acpi_pci_root_get_mcfg_addr(handle);
|
|
|
|
|
|
- negotiate_os_control(root, &no_aspm);
|
|
|
+ is_pcie = strcmp(acpi_device_hid(device), "PNP0A08") == 0;
|
|
|
+ negotiate_os_control(root, &no_aspm, is_pcie);
|
|
|
|
|
|
/*
|
|
|
* TBD: Need PCI interface for enumeration/configuration of roots.
|