提交 eed85ff4 编写于 作者: K Keith Busch 提交者: Bjorn Helgaas

PCI/DPC: Enable DPC only if AER is available

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: NKeith Busch <keith.busch@intel.com>
Signed-off-by: NBjorn Helgaas <helgaas@kernel.org>
上级 aa6ca5a9
...@@ -92,7 +92,7 @@ config PCIE_PME ...@@ -92,7 +92,7 @@ config PCIE_PME
config PCIE_DPC config PCIE_DPC
bool "PCIe Downstream Port Containment support" bool "PCIe Downstream Port Containment support"
depends on PCIEPORTBUS depends on PCIEPORTBUS && PCIEAER
default n default n
help help
This enables PCI Express Downstream Port Containment (DPC) This enables PCI Express Downstream Port Containment (DPC)
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/pcieport_if.h> #include <linux/pcieport_if.h>
#include "../pci.h" #include "../pci.h"
#include "aer/aerdrv.h"
struct rp_pio_header_log_regs { struct rp_pio_header_log_regs {
u32 dw0; u32 dw0;
...@@ -309,6 +310,9 @@ static int dpc_probe(struct pcie_device *dev) ...@@ -309,6 +310,9 @@ static int dpc_probe(struct pcie_device *dev)
int status; int status;
u16 ctl, cap; u16 ctl, cap;
if (pcie_aer_get_firmware_first(pdev))
return -ENOTSUPP;
dpc = devm_kzalloc(device, sizeof(*dpc), GFP_KERNEL); dpc = devm_kzalloc(device, sizeof(*dpc), GFP_KERNEL);
if (!dpc) if (!dpc)
return -ENOMEM; return -ENOMEM;
......
...@@ -216,9 +216,9 @@ static int get_port_device_capability(struct pci_dev *dev) ...@@ -216,9 +216,9 @@ static int get_port_device_capability(struct pci_dev *dev)
return 0; return 0;
cap_mask = PCIE_PORT_SERVICE_PME | PCIE_PORT_SERVICE_HP 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()) if (pci_aer_available())
cap_mask |= PCIE_PORT_SERVICE_AER; cap_mask |= PCIE_PORT_SERVICE_AER | PCIE_PORT_SERVICE_DPC;
if (pcie_ports_auto) if (pcie_ports_auto)
pcie_port_platform_notify(dev, &cap_mask); pcie_port_platform_notify(dev, &cap_mask);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册