]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
PCI/AER: Decode Requester ID when no error info found
authorBjorn Helgaas <bhelgaas@google.com>
Wed, 6 Dec 2023 22:42:30 +0000 (16:42 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 5 Feb 2024 20:17:04 +0000 (20:17 +0000)
[ Upstream commit 1291b716bbf969e101d517bfb8ba18d958f758b8 ]

When a device with AER detects an error, it logs error information in its
own AER Error Status registers.  It may send an Error Message to the Root
Port (RCEC in the case of an RCiEP), which logs the fact that an Error
Message was received (Root Error Status) and the Requester ID of the
message source (Error Source Identification).

aer_print_port_info() prints the Requester ID from the Root Port Error
Source in the usual Linux "bb:dd.f" format, but when find_source_device()
finds no error details in the hierarchy below the Root Port, it printed the
raw Requester ID without decoding it.

Decode the Requester ID in the usual Linux format so it matches other
messages.

Sample message changes:

  - pcieport 0000:00:1c.5: AER: Correctable error received: 0000:00:1c.5
  - pcieport 0000:00:1c.5: AER: can't find device of ID00e5
  + pcieport 0000:00:1c.5: AER: Correctable error message received from 0000:00:1c.5
  + pcieport 0000:00:1c.5: AER: found no error details for 0000:00:1c.5

Link: https://lore.kernel.org/r/20231206224231.732765-3-helgaas@kernel.org
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/pci/pcie/aer.c

index 42a3bd35a3e118d8eb656d1d24b9f0fa0f4afaf7..38e3346772cc70470d33bedd80986feee3003513 100644 (file)
@@ -740,7 +740,7 @@ static void aer_print_port_info(struct pci_dev *dev, struct aer_err_info *info)
        u8 bus = info->id >> 8;
        u8 devfn = info->id & 0xff;
 
-       pci_info(dev, "%s%s error received: %04x:%02x:%02x.%d\n",
+       pci_info(dev, "%s%s error message received from %04x:%02x:%02x.%d\n",
                 info->multi_error_valid ? "Multiple " : "",
                 aer_error_severity_string[info->severity],
                 pci_domain_nr(dev->bus), bus, PCI_SLOT(devfn),
@@ -929,7 +929,12 @@ static bool find_source_device(struct pci_dev *parent,
                pci_walk_bus(parent->subordinate, find_device_iter, e_info);
 
        if (!e_info->error_dev_num) {
-               pci_info(parent, "can't find device of ID%04x\n", e_info->id);
+               u8 bus = e_info->id >> 8;
+               u8 devfn = e_info->id & 0xff;
+
+               pci_info(parent, "found no error details for %04x:%02x:%02x.%d\n",
+                        pci_domain_nr(parent->bus), bus, PCI_SLOT(devfn),
+                        PCI_FUNC(devfn));
                return false;
        }
        return true;