diff options
Diffstat (limited to 'drivers/pci/pcie/aer/aerdrv_acpi.c')
-rw-r--r-- | drivers/pci/pcie/aer/aerdrv_acpi.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/drivers/pci/pcie/aer/aerdrv_acpi.c b/drivers/pci/pcie/aer/aerdrv_acpi.c index 2bb9b8972211..275bf158ffa7 100644 --- a/drivers/pci/pcie/aer/aerdrv_acpi.c +++ b/drivers/pci/pcie/aer/aerdrv_acpi.c | |||
@@ -93,4 +93,38 @@ int pcie_aer_get_firmware_first(struct pci_dev *dev) | |||
93 | aer_set_firmware_first(dev); | 93 | aer_set_firmware_first(dev); |
94 | return dev->__aer_firmware_first; | 94 | return dev->__aer_firmware_first; |
95 | } | 95 | } |
96 | |||
97 | static bool aer_firmware_first; | ||
98 | |||
99 | static int aer_hest_parse_aff(struct acpi_hest_header *hest_hdr, void *data) | ||
100 | { | ||
101 | struct acpi_hest_aer_common *p; | ||
102 | |||
103 | if (aer_firmware_first) | ||
104 | return 0; | ||
105 | |||
106 | switch (hest_hdr->type) { | ||
107 | case ACPI_HEST_TYPE_AER_ROOT_PORT: | ||
108 | case ACPI_HEST_TYPE_AER_ENDPOINT: | ||
109 | case ACPI_HEST_TYPE_AER_BRIDGE: | ||
110 | p = (struct acpi_hest_aer_common *)(hest_hdr + 1); | ||
111 | aer_firmware_first = !!(p->flags & ACPI_HEST_FIRMWARE_FIRST); | ||
112 | default: | ||
113 | return 0; | ||
114 | } | ||
115 | } | ||
116 | |||
117 | /** | ||
118 | * aer_acpi_firmware_first - Check if APEI should control AER. | ||
119 | */ | ||
120 | bool aer_acpi_firmware_first(void) | ||
121 | { | ||
122 | static bool parsed = false; | ||
123 | |||
124 | if (!parsed) { | ||
125 | apei_hest_parse(aer_hest_parse_aff, NULL); | ||
126 | parsed = true; | ||
127 | } | ||
128 | return aer_firmware_first; | ||
129 | } | ||
96 | #endif | 130 | #endif |