|
@@ -36,6 +36,7 @@
|
|
|
#include <linux/slab.h>
|
|
|
#include <acpi/acpi_bus.h>
|
|
|
#include <acpi/acpi_drivers.h>
|
|
|
+#include <acpi/apei.h>
|
|
|
|
|
|
#define PREFIX "ACPI: "
|
|
|
|
|
@@ -47,6 +48,11 @@ static int acpi_pci_root_add(struct acpi_device *device);
|
|
|
static int acpi_pci_root_remove(struct acpi_device *device, int type);
|
|
|
static int acpi_pci_root_start(struct acpi_device *device);
|
|
|
|
|
|
+#define ACPI_PCIE_REQ_SUPPORT (OSC_EXT_PCI_CONFIG_SUPPORT \
|
|
|
+ | OSC_ACTIVE_STATE_PWR_SUPPORT \
|
|
|
+ | OSC_CLOCK_PWR_CAPABILITY_SUPPORT \
|
|
|
+ | OSC_MSI_SUPPORT)
|
|
|
+
|
|
|
static const struct acpi_device_id root_device_ids[] = {
|
|
|
{"PNP0A03", 0},
|
|
|
{"", 0},
|
|
@@ -566,6 +572,33 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
|
|
|
if (flags != base_flags)
|
|
|
acpi_pci_osc_support(root, flags);
|
|
|
|
|
|
+ if (!pcie_ports_disabled
|
|
|
+ && (flags & ACPI_PCIE_REQ_SUPPORT) == ACPI_PCIE_REQ_SUPPORT) {
|
|
|
+ flags = OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL
|
|
|
+ | OSC_PCI_EXPRESS_NATIVE_HP_CONTROL
|
|
|
+ | OSC_PCI_EXPRESS_PME_CONTROL;
|
|
|
+
|
|
|
+ if (pci_aer_available()) {
|
|
|
+ if (aer_acpi_firmware_first())
|
|
|
+ dev_dbg(root->bus->bridge,
|
|
|
+ "PCIe errors handled by BIOS.\n");
|
|
|
+ else
|
|
|
+ flags |= OSC_PCI_EXPRESS_AER_CONTROL;
|
|
|
+ }
|
|
|
+
|
|
|
+ dev_info(root->bus->bridge,
|
|
|
+ "Requesting ACPI _OSC control (0x%02x)\n", flags);
|
|
|
+
|
|
|
+ status = acpi_pci_osc_control_set(device->handle, &flags,
|
|
|
+ OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL);
|
|
|
+ if (ACPI_SUCCESS(status))
|
|
|
+ dev_info(root->bus->bridge,
|
|
|
+ "ACPI _OSC control (0x%02x) granted\n", flags);
|
|
|
+ else
|
|
|
+ dev_dbg(root->bus->bridge,
|
|
|
+ "ACPI _OSC request failed (code %d)\n", status);
|
|
|
+ }
|
|
|
+
|
|
|
pci_acpi_add_bus_pm_notifier(device, root->bus);
|
|
|
if (device->wakeup.flags.run_wake)
|
|
|
device_set_run_wake(root->bus->bridge, true);
|
|
@@ -603,6 +636,8 @@ static int __init acpi_pci_root_init(void)
|
|
|
if (acpi_pci_disabled)
|
|
|
return 0;
|
|
|
|
|
|
+ acpi_hest_init();
|
|
|
+
|
|
|
pci_acpi_crs_quirks();
|
|
|
if (acpi_bus_register_driver(&acpi_pci_root_driver) < 0)
|
|
|
return -ENODEV;
|