PCI/AER: Use only _OSC to determine AER ownership
authorAlexandru Gagniuc <mr.nuke.me@gmail.com>
Mon, 27 Apr 2020 23:25:13 +0000 (18:25 -0500)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 30 Apr 2020 22:19:12 +0000 (17:19 -0500)
Per the PCI Firmware spec, r3.2, sec 4.5.1, the OS can request control of
AER via bit 3 of the _OSC Control Field.  In the returned value of the
Control Field:

  The firmware sets [bit 3] to 1 to grant control over PCI Express Advanced
  Error Reporting.  ...  after control is transferred to the operating
  system, firmware must not modify the Advanced Error Reporting Capability.
  If control of this feature was requested and denied or was not requested,
  firmware returns this bit set to 0.

Previously the pci_root driver looked at the HEST FIRMWARE_FIRST bit to
determine whether to request ownership of the AER Capability.  This was
based on ACPI spec v6.3, sec 18.3.2.4, and similar sections, which say
things like:

  Bit [0] - FIRMWARE_FIRST: If set, indicates that system firmware will
            handle errors from this source first.

  Bit [1] - GLOBAL: If set, indicates that the settings contained in this
            structure apply globally to all PCI Express Devices.

These ACPI references don't say anything about ownership of the AER
Capability.

Remove use of the FIRMWARE_FIRST bit and rely only on the _OSC bit to
determine whether we have control of the AER Capability.

Link: https://lore.kernel.org/r/20181115231605.24352-1-mr.nuke.me@gmail.com/
Link: https://lore.kernel.org/r/20190326172343.28946-1-mr.nuke.me@gmail.com/
Link: https://lore.kernel.org/r/67af2931705bed9a588b5a39d369cb70b9942190.1587925636.git.sathyanarayanan.kuppuswamy@linux.intel.com
[bhelgaas: commit log, note: Alex posted this identical patch 18 months
ago, and I failed to apply it then, so I made him the author, added links
to his postings, and added his Signed-off-by]
Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Jon Derrick <jonathan.derrick@intel.com>
drivers/acpi/pci_root.c
drivers/pci/pcie/aer.c
include/linux/pci-acpi.h

index ac8ad6c..9e235c1 100644 (file)
@@ -483,13 +483,8 @@ static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm,
        if (IS_ENABLED(CONFIG_HOTPLUG_PCI_SHPC))
                control |= OSC_PCI_SHPC_NATIVE_HP_CONTROL;
 
-       if (pci_aer_available()) {
-               if (aer_acpi_firmware_first())
-                       dev_info(&device->dev,
-                                "PCIe AER handled by firmware\n");
-               else
-                       control |= OSC_PCI_EXPRESS_AER_CONTROL;
-       }
+       if (pci_aer_available())
+               control |= OSC_PCI_EXPRESS_AER_CONTROL;
 
        /*
         * Per the Downstream Port Containment Related Enhancements ECN to
index f4274d3..efc2677 100644 (file)
@@ -318,30 +318,6 @@ int pcie_aer_get_firmware_first(struct pci_dev *dev)
                aer_set_firmware_first(dev);
        return dev->__aer_firmware_first;
 }
-
-static bool aer_firmware_first;
-
-/**
- * aer_acpi_firmware_first - Check if APEI should control AER.
- */
-bool aer_acpi_firmware_first(void)
-{
-       static bool parsed = false;
-       struct aer_hest_parse_info info = {
-               .pci_dev        = NULL, /* Check all PCIe devices */
-               .firmware_first = 0,
-       };
-
-       if (pcie_ports_native)
-               return false;
-
-       if (!parsed) {
-               apei_hest_parse(aer_hest_parse, &info);
-               aer_firmware_first = info.firmware_first;
-               parsed = true;
-       }
-       return aer_firmware_first;
-}
 #endif
 
 #define        PCI_EXP_AER_FLAGS       (PCI_EXP_DEVCTL_CERE | PCI_EXP_DEVCTL_NFERE | \
@@ -1523,7 +1499,7 @@ static struct pcie_port_service_driver aerdriver = {
  */
 int __init pcie_aer_init(void)
 {
-       if (!pci_aer_available() || aer_acpi_firmware_first())
+       if (!pci_aer_available())
                return -ENXIO;
        return pcie_port_service_register(&aerdriver);
 }
index 2d155bf..11c9887 100644 (file)
@@ -125,10 +125,4 @@ static inline void acpi_pci_add_bus(struct pci_bus *bus) { }
 static inline void acpi_pci_remove_bus(struct pci_bus *bus) { }
 #endif /* CONFIG_ACPI */
 
-#ifdef CONFIG_ACPI_APEI
-extern bool aer_acpi_firmware_first(void);
-#else
-static inline bool aer_acpi_firmware_first(void) { return false; }
-#endif
-
 #endif /* _PCI_ACPI_H_ */