summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Wunner <lukas@wunner.de>2026-07-24 17:24:05 +0200
committerBjorn Helgaas <bhelgaas@google.com>2026-07-24 17:34:48 -0500
commitf141f74c45c6f774eebdb7e45bd609be5122bfa8 (patch)
tree49bdc749114724c2a86a5501c543d3b19d462b7a
parenta8bf2dd750de7d682fdaa2127f4e3217ce9c4a82 (diff)
downloadlinux-next-f141f74c45c6f774eebdb7e45bd609be5122bfa8.tar.gz
linux-next-f141f74c45c6f774eebdb7e45bd609be5122bfa8.zip
PCI/AER: Move retrieval of FEP and TLP Log into helper
When aer_get_device_error_info() gathers information on Uncorrectable Errors from a device, it reads the First Error Pointer and TLP Prefix/ Header Log and caches them in struct aer_err_info. Those two fields will also need to be read for Advisory Non-Fatal Errors (which are signaled as Correctable Errors). Move their retrieval into a new aer_get_uncor_info() helper for reuse by the imminent Advisory Non-Fatal Error support. No functional change intended. Signed-off-by: Lukas Wunner <lukas@wunner.de> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Link: https://patch.msgid.link/0f2f037c7ccf099f0c253cbc4ad9be526c68c5af.1784905909.git.lukas@wunner.de
-rw-r--r--drivers/pci/pcie/aer.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c
index 4d1d99662086..c196c94f43d7 100644
--- a/drivers/pci/pcie/aer.c
+++ b/drivers/pci/pcie/aer.c
@@ -1289,6 +1289,27 @@ void aer_recover_queue(int domain, unsigned int bus, unsigned int devfn,
EXPORT_SYMBOL_GPL(aer_recover_queue);
#endif
+static void aer_get_uncor_info(struct pci_dev *dev, struct aer_err_info *info,
+ u32 status)
+{
+ u16 aer = dev->aer_cap;
+ u32 aercc;
+
+ /* Get First Error Pointer */
+ pci_read_config_dword(dev, aer + PCI_ERR_CAP, &aercc);
+ info->first_error = PCI_ERR_CAP_FEP(aercc);
+
+ /* Get TLP Prefix/Header Log */
+ if (tlp_header_logged(status, aercc)) {
+ info->tlp_header_valid = 1;
+ pcie_read_tlp_log(dev, aer + PCI_ERR_HEADER_LOG,
+ aer + PCI_ERR_PREFIX_LOG,
+ aer_tlp_log_len(dev, aercc),
+ aercc & PCI_ERR_CAP_TLP_LOG_FLIT,
+ &info->tlp);
+ }
+}
+
/**
* aer_get_device_error_info - read error status from dev and store it to info
* @info: pointer to structure to store the error record
@@ -1302,7 +1323,6 @@ int aer_get_device_error_info(struct aer_err_info *info, int i)
{
struct pci_dev *dev;
int type, aer;
- u32 aercc;
if (i >= AER_MAX_MULTI_ERR_DEVICES)
return 0;
@@ -1340,18 +1360,7 @@ int aer_get_device_error_info(struct aer_err_info *info, int i)
if (!(info->status & ~info->mask))
return 0;
- /* Get First Error Pointer */
- pci_read_config_dword(dev, aer + PCI_ERR_CAP, &aercc);
- info->first_error = PCI_ERR_CAP_FEP(aercc);
-
- if (tlp_header_logged(info->status & ~info->mask, aercc)) {
- info->tlp_header_valid = 1;
- pcie_read_tlp_log(dev, aer + PCI_ERR_HEADER_LOG,
- aer + PCI_ERR_PREFIX_LOG,
- aer_tlp_log_len(dev, aercc),
- aercc & PCI_ERR_CAP_TLP_LOG_FLIT,
- &info->tlp);
- }
+ aer_get_uncor_info(dev, info, info->status & ~info->mask);
}
return 1;