From: Hans Zhang <hans.zh...@cixtech.com> Add a new "aer_panic" kernel parameter to force panic on unrecoverable PCIe errors. This prepares for handling fatal AER errors in systems where bus hangs require immediate reboot.
Signed-off-by: Hans Zhang <hans.zh...@cixtech.com> --- drivers/pci/pci.c | 2 ++ drivers/pci/pci.h | 2 ++ drivers/pci/pcie/aer.c | 6 ++++++ 3 files changed, 10 insertions(+) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index e77d5b53c0ce..663454135224 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -6821,6 +6821,8 @@ static int __init pci_setup(char *str) pcie_ats_disabled = true; } else if (!strcmp(str, "noaer")) { pci_no_aer(); + } else if (!strcmp(str, "aer_panic")) { + pci_aer_panic(); } else if (!strcmp(str, "earlydump")) { pci_early_dump = true; } else if (!strncmp(str, "realloc=", 8)) { diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index b81e99cd4b62..8ddfc1677eeb 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -958,6 +958,7 @@ static inline void of_pci_remove_host_bridge_node(struct pci_host_bridge *bridge #ifdef CONFIG_PCIEAER void pci_no_aer(void); +void pci_aer_panic(void); void pci_aer_init(struct pci_dev *dev); void pci_aer_exit(struct pci_dev *dev); extern const struct attribute_group aer_stats_attr_group; @@ -968,6 +969,7 @@ void pci_save_aer_state(struct pci_dev *dev); void pci_restore_aer_state(struct pci_dev *dev); #else static inline void pci_no_aer(void) { } +static inline void pci_aer_panic(void) { } static inline void pci_aer_init(struct pci_dev *d) { } static inline void pci_aer_exit(struct pci_dev *d) { } static inline void pci_aer_clear_fatal_status(struct pci_dev *dev) { } diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c index ade98c5a19b9..fa51fb8a5fe7 100644 --- a/drivers/pci/pcie/aer.c +++ b/drivers/pci/pcie/aer.c @@ -112,6 +112,7 @@ struct aer_stats { PCI_ERR_ROOT_MULTI_UNCOR_RCV) static bool pcie_aer_disable; +static bool pcie_aer_panic; static pci_ers_result_t aer_root_reset(struct pci_dev *dev); void pci_no_aer(void) @@ -119,6 +120,11 @@ void pci_no_aer(void) pcie_aer_disable = true; } +void pci_aer_panic(void) +{ + pcie_aer_panic = true; +} + bool pci_aer_available(void) { return !pcie_aer_disable && pci_msi_enabled(); -- 2.25.1