]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
PCI/DPC: Enable DPC only if AER is available
authorKeith Busch <keith.busch@intel.com>
Wed, 24 Jan 2018 23:03:18 +0000 (17:03 -0600)
committerBjorn Helgaas <helgaas@kernel.org>
Fri, 26 Jan 2018 22:49:40 +0000 (16:49 -0600)
The "Determination of DPC Control" implementation note in PCIe r4.0, sec
6.1.10, recommends the operating system always link DPC control to the
control of AER, as the two functionalities are strongly connected.

To avoid conflicts over whether platform firmware or the OS controls DPC,
enable DPC only if AER is enabled in the OS, and the device's error
handling does not have firmware-first AER handling.

Signed-off-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Bjorn Helgaas <helgaas@kernel.org>
drivers/pci/pcie/Kconfig
drivers/pci/pcie/pcie-dpc.c
drivers/pci/pcie/portdrv_core.c

index ac53edbc9613cc3a89ecdaf1c88241d0fe824279..d658dfa53b87a77a771193559fd83e586b3255b7 100644 (file)
@@ -92,7 +92,7 @@ config PCIE_PME
 
 config PCIE_DPC
        bool "PCIe Downstream Port Containment support"
-       depends on PCIEPORTBUS
+       depends on PCIEPORTBUS && PCIEAER
        default n
        help
          This enables PCI Express Downstream Port Containment (DPC)
index f7cf5ae7dec29225c409e5a773599cc311d4e683..d1fbd83cd240d4df813daf82e1b9cdda69dbc76e 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/pci.h>
 #include <linux/pcieport_if.h>
 #include "../pci.h"
+#include "aer/aerdrv.h"
 
 struct rp_pio_header_log_regs {
        u32 dw0;
@@ -309,6 +310,9 @@ static int dpc_probe(struct pcie_device *dev)
        int status;
        u16 ctl, cap;
 
+       if (pcie_aer_get_firmware_first(pdev))
+               return -ENOTSUPP;
+
        dpc = devm_kzalloc(device, sizeof(*dpc), GFP_KERNEL);
        if (!dpc)
                return -ENOMEM;
index a59210350c447a7d53d7e856b28c67b31872d380..ef3bad4ad010129b32752cb2e8719c778b58fd63 100644 (file)
@@ -216,9 +216,9 @@ static int get_port_device_capability(struct pci_dev *dev)
                return 0;
 
        cap_mask = PCIE_PORT_SERVICE_PME | PCIE_PORT_SERVICE_HP
-                       | PCIE_PORT_SERVICE_VC | PCIE_PORT_SERVICE_DPC;
+                       | PCIE_PORT_SERVICE_VC;
        if (pci_aer_available())
-               cap_mask |= PCIE_PORT_SERVICE_AER;
+               cap_mask |= PCIE_PORT_SERVICE_AER | PCIE_PORT_SERVICE_DPC;
 
        if (pcie_ports_auto)
                pcie_port_platform_notify(dev, &cap_mask);