aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pci/pcie/aer/aerdrv_acpi.c35
1 files changed, 17 insertions, 18 deletions
diff --git a/drivers/pci/pcie/aer/aerdrv_acpi.c b/drivers/pci/pcie/aer/aerdrv_acpi.c
index 4f798ab629c8..e7ea5735a61f 100644
--- a/drivers/pci/pcie/aer/aerdrv_acpi.c
+++ b/drivers/pci/pcie/aer/aerdrv_acpi.c
@@ -29,6 +29,22 @@ static inline int hest_match_pci(struct acpi_hest_aer_common *p,
29 p->function == PCI_FUNC(pci->devfn)); 29 p->function == PCI_FUNC(pci->devfn));
30} 30}
31 31
32static inline bool hest_match_type(struct acpi_hest_header *hest_hdr,
33 struct pci_dev *dev)
34{
35 u16 hest_type = hest_hdr->type;
36 u8 pcie_type = pci_pcie_type(dev);
37
38 if ((hest_type == ACPI_HEST_TYPE_AER_ROOT_PORT &&
39 pcie_type == PCI_EXP_TYPE_ROOT_PORT) ||
40 (hest_type == ACPI_HEST_TYPE_AER_ENDPOINT &&
41 pcie_type == PCI_EXP_TYPE_ENDPOINT) ||
42 (hest_type == ACPI_HEST_TYPE_AER_BRIDGE &&
43 (dev->class >> 16) == PCI_BASE_CLASS_BRIDGE))
44 return true;
45 return false;
46}
47
32struct aer_hest_parse_info { 48struct aer_hest_parse_info {
33 struct pci_dev *pci_dev; 49 struct pci_dev *pci_dev;
34 int firmware_first; 50 int firmware_first;
@@ -38,28 +54,11 @@ static int aer_hest_parse(struct acpi_hest_header *hest_hdr, void *data)
38{ 54{
39 struct aer_hest_parse_info *info = data; 55 struct aer_hest_parse_info *info = data;
40 struct acpi_hest_aer_common *p; 56 struct acpi_hest_aer_common *p;
41 u8 pcie_type = 0;
42 u8 bridge = 0;
43 int ff = 0; 57 int ff = 0;
44 58
45 switch (hest_hdr->type) {
46 case ACPI_HEST_TYPE_AER_ROOT_PORT:
47 pcie_type = PCI_EXP_TYPE_ROOT_PORT;
48 break;
49 case ACPI_HEST_TYPE_AER_ENDPOINT:
50 pcie_type = PCI_EXP_TYPE_ENDPOINT;
51 break;
52 case ACPI_HEST_TYPE_AER_BRIDGE:
53 if ((info->pci_dev->class >> 16) == PCI_BASE_CLASS_BRIDGE)
54 bridge = 1;
55 break;
56 default:
57 return 0;
58 }
59
60 p = (struct acpi_hest_aer_common *)(hest_hdr + 1); 59 p = (struct acpi_hest_aer_common *)(hest_hdr + 1);
61 if (p->flags & ACPI_HEST_GLOBAL) { 60 if (p->flags & ACPI_HEST_GLOBAL) {
62 if ((pci_pcie_type(info->pci_dev) == pcie_type) || bridge) 61 if (hest_match_type(hest_hdr, info->pci_dev))
63 ff = !!(p->flags & ACPI_HEST_FIRMWARE_FIRST); 62 ff = !!(p->flags & ACPI_HEST_FIRMWARE_FIRST);
64 } else 63 } else
65 if (hest_match_pci(p, info->pci_dev)) 64 if (hest_match_pci(p, info->pci_dev))