diff options
| -rw-r--r-- | drivers/acpi/apei/cper.c | 19 | ||||
| -rw-r--r-- | drivers/pci/pcie/aer/aerdrv_errprint.c | 9 | ||||
| -rw-r--r-- | include/linux/aer.h | 4 | 
3 files changed, 26 insertions, 6 deletions
diff --git a/drivers/acpi/apei/cper.c b/drivers/acpi/apei/cper.c index e6defd86b42..1e5d8a40101 100644 --- a/drivers/acpi/apei/cper.c +++ b/drivers/acpi/apei/cper.c @@ -29,6 +29,7 @@  #include <linux/time.h>  #include <linux/cper.h>  #include <linux/acpi.h> +#include <linux/pci.h>  #include <linux/aer.h>  /* @@ -249,6 +250,10 @@ static const char *cper_pcie_port_type_strs[] = {  static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie,  			    const struct acpi_hest_generic_data *gdata)  { +#ifdef CONFIG_ACPI_APEI_PCIEAER +	struct pci_dev *dev; +#endif +  	if (pcie->validation_bits & CPER_PCIE_VALID_PORT_TYPE)  		printk("%s""port_type: %d, %s\n", pfx, pcie->port_type,  		       pcie->port_type < ARRAY_SIZE(cper_pcie_port_type_strs) ? @@ -281,10 +286,18 @@ static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie,  	"%s""bridge: secondary_status: 0x%04x, control: 0x%04x\n",  	pfx, pcie->bridge.secondary_status, pcie->bridge.control);  #ifdef CONFIG_ACPI_APEI_PCIEAER -	if (pcie->validation_bits & CPER_PCIE_VALID_AER_INFO) { -		struct aer_capability_regs *aer_regs = (void *)pcie->aer_info; -		cper_print_aer(pfx, gdata->error_severity, aer_regs); +	dev = pci_get_domain_bus_and_slot(pcie->device_id.segment, +			pcie->device_id.bus, pcie->device_id.function); +	if (!dev) { +		pr_err("PCI AER Cannot get PCI device %04x:%02x:%02x.%d\n", +			pcie->device_id.segment, pcie->device_id.bus, +			pcie->device_id.slot, pcie->device_id.function); +		return;  	} +	if (pcie->validation_bits & CPER_PCIE_VALID_AER_INFO) +		cper_print_aer(pfx, dev, gdata->error_severity, +				(struct aer_capability_regs *) pcie->aer_info); +	pci_dev_put(dev);  #endif  } diff --git a/drivers/pci/pcie/aer/aerdrv_errprint.c b/drivers/pci/pcie/aer/aerdrv_errprint.c index 3ea51736f18..d3e5fc5a2de 100644 --- a/drivers/pci/pcie/aer/aerdrv_errprint.c +++ b/drivers/pci/pcie/aer/aerdrv_errprint.c @@ -23,6 +23,9 @@  #include "aerdrv.h" +#define CREATE_TRACE_POINTS +#include <trace/events/ras.h> +  #define AER_AGENT_RECEIVER		0  #define AER_AGENT_REQUESTER		1  #define AER_AGENT_COMPLETER		2 @@ -194,6 +197,8 @@ void aer_print_error(struct pci_dev *dev, struct aer_err_info *info)  	if (info->id && info->error_dev_num > 1 && info->id == id)  		printk("%s""  Error of this Agent(%04x) is reported first\n",  			prefix, id); +	trace_aer_event(dev_name(&dev->dev), (info->status & ~info->mask), +			info->severity);  }  void aer_print_port_info(struct pci_dev *dev, struct aer_err_info *info) @@ -217,7 +222,7 @@ int cper_severity_to_aer(int cper_severity)  }  EXPORT_SYMBOL_GPL(cper_severity_to_aer); -void cper_print_aer(const char *prefix, int cper_severity, +void cper_print_aer(const char *prefix, struct pci_dev *dev, int cper_severity,  		    struct aer_capability_regs *aer)  {  	int aer_severity, layer, agent, status_strs_size, tlp_header_valid = 0; @@ -259,5 +264,7 @@ void cper_print_aer(const char *prefix, int cper_severity,  			*(tlp + 8), *(tlp + 15), *(tlp + 14),  			*(tlp + 13), *(tlp + 12));  	} +	trace_aer_event(dev_name(&dev->dev), (status & ~mask), +			aer_severity);  }  #endif diff --git a/include/linux/aer.h b/include/linux/aer.h index 544abdb2238..ec10e1b24c1 100644 --- a/include/linux/aer.h +++ b/include/linux/aer.h @@ -49,8 +49,8 @@ static inline int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev)  }  #endif -extern void cper_print_aer(const char *prefix, int cper_severity, -			   struct aer_capability_regs *aer); +extern void cper_print_aer(const char *prefix, struct pci_dev *dev, +			   int cper_severity, struct aer_capability_regs *aer);  extern int cper_severity_to_aer(int cper_severity);  extern void aer_recover_queue(int domain, unsigned int bus, unsigned int devfn,  			      int severity);  |