diff options
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce-apei.c | 3 | ||||
-rw-r--r-- | drivers/acpi/apei/cper.c | 7 | ||||
-rw-r--r-- | drivers/acpi/apei/ghes.c | 4 | ||||
-rw-r--r-- | drivers/edac/ghes_edac.c | 5 | ||||
-rw-r--r-- | include/linux/cper.h | 11 |
5 files changed, 18 insertions, 12 deletions
diff --git a/arch/x86/kernel/cpu/mcheck/mce-apei.c b/arch/x86/kernel/cpu/mcheck/mce-apei.c index cd8b166a1735..de8b60a53f69 100644 --- a/arch/x86/kernel/cpu/mcheck/mce-apei.c +++ b/arch/x86/kernel/cpu/mcheck/mce-apei.c | |||
@@ -42,8 +42,7 @@ void apei_mce_report_mem_error(int corrected, struct cper_sec_mem_err *mem_err) | |||
42 | struct mce m; | 42 | struct mce m; |
43 | 43 | ||
44 | /* Only corrected MC is reported */ | 44 | /* Only corrected MC is reported */ |
45 | if (!corrected || !(mem_err->validation_bits & | 45 | if (!corrected || !(mem_err->validation_bits & CPER_MEM_VALID_PA)) |
46 | CPER_MEM_VALID_PHYSICAL_ADDRESS)) | ||
47 | return; | 46 | return; |
48 | 47 | ||
49 | mce_setup(&m); | 48 | mce_setup(&m); |
diff --git a/drivers/acpi/apei/cper.c b/drivers/acpi/apei/cper.c index eb5f6d6d7dbc..946ef520186f 100644 --- a/drivers/acpi/apei/cper.c +++ b/drivers/acpi/apei/cper.c | |||
@@ -8,7 +8,7 @@ | |||
8 | * various tables, such as ERST, BERT and HEST etc. | 8 | * various tables, such as ERST, BERT and HEST etc. |
9 | * | 9 | * |
10 | * For more information about CPER, please refer to Appendix N of UEFI | 10 | * For more information about CPER, please refer to Appendix N of UEFI |
11 | * Specification version 2.3. | 11 | * Specification version 2.4. |
12 | * | 12 | * |
13 | * This program is free software; you can redistribute it and/or | 13 | * This program is free software; you can redistribute it and/or |
14 | * modify it under the terms of the GNU General Public License version | 14 | * modify it under the terms of the GNU General Public License version |
@@ -191,16 +191,17 @@ static const char *cper_mem_err_type_strs[] = { | |||
191 | "memory sparing", | 191 | "memory sparing", |
192 | "scrub corrected error", | 192 | "scrub corrected error", |
193 | "scrub uncorrected error", | 193 | "scrub uncorrected error", |
194 | "physical memory map-out event", | ||
194 | }; | 195 | }; |
195 | 196 | ||
196 | static void cper_print_mem(const char *pfx, const struct cper_sec_mem_err *mem) | 197 | static void cper_print_mem(const char *pfx, const struct cper_sec_mem_err *mem) |
197 | { | 198 | { |
198 | if (mem->validation_bits & CPER_MEM_VALID_ERROR_STATUS) | 199 | if (mem->validation_bits & CPER_MEM_VALID_ERROR_STATUS) |
199 | printk("%s""error_status: 0x%016llx\n", pfx, mem->error_status); | 200 | printk("%s""error_status: 0x%016llx\n", pfx, mem->error_status); |
200 | if (mem->validation_bits & CPER_MEM_VALID_PHYSICAL_ADDRESS) | 201 | if (mem->validation_bits & CPER_MEM_VALID_PA) |
201 | printk("%s""physical_address: 0x%016llx\n", | 202 | printk("%s""physical_address: 0x%016llx\n", |
202 | pfx, mem->physical_addr); | 203 | pfx, mem->physical_addr); |
203 | if (mem->validation_bits & CPER_MEM_VALID_PHYSICAL_ADDRESS_MASK) | 204 | if (mem->validation_bits & CPER_MEM_VALID_PA_MASK) |
204 | printk("%s""physical_address_mask: 0x%016llx\n", | 205 | printk("%s""physical_address_mask: 0x%016llx\n", |
205 | pfx, mem->physical_addr_mask); | 206 | pfx, mem->physical_addr_mask); |
206 | if (mem->validation_bits & CPER_MEM_VALID_NODE) | 207 | if (mem->validation_bits & CPER_MEM_VALID_NODE) |
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index 0db6e4ff6501..a30bc313787b 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c | |||
@@ -419,7 +419,7 @@ static void ghes_handle_memory_failure(struct acpi_generic_data *gdata, int sev) | |||
419 | 419 | ||
420 | if (sec_sev == GHES_SEV_CORRECTED && | 420 | if (sec_sev == GHES_SEV_CORRECTED && |
421 | (gdata->flags & CPER_SEC_ERROR_THRESHOLD_EXCEEDED) && | 421 | (gdata->flags & CPER_SEC_ERROR_THRESHOLD_EXCEEDED) && |
422 | (mem_err->validation_bits & CPER_MEM_VALID_PHYSICAL_ADDRESS)) { | 422 | (mem_err->validation_bits & CPER_MEM_VALID_PA)) { |
423 | pfn = mem_err->physical_addr >> PAGE_SHIFT; | 423 | pfn = mem_err->physical_addr >> PAGE_SHIFT; |
424 | if (pfn_valid(pfn)) | 424 | if (pfn_valid(pfn)) |
425 | memory_failure_queue(pfn, 0, MF_SOFT_OFFLINE); | 425 | memory_failure_queue(pfn, 0, MF_SOFT_OFFLINE); |
@@ -430,7 +430,7 @@ static void ghes_handle_memory_failure(struct acpi_generic_data *gdata, int sev) | |||
430 | } | 430 | } |
431 | if (sev == GHES_SEV_RECOVERABLE && | 431 | if (sev == GHES_SEV_RECOVERABLE && |
432 | sec_sev == GHES_SEV_RECOVERABLE && | 432 | sec_sev == GHES_SEV_RECOVERABLE && |
433 | mem_err->validation_bits & CPER_MEM_VALID_PHYSICAL_ADDRESS) { | 433 | mem_err->validation_bits & CPER_MEM_VALID_PA) { |
434 | pfn = mem_err->physical_addr >> PAGE_SHIFT; | 434 | pfn = mem_err->physical_addr >> PAGE_SHIFT; |
435 | memory_failure_queue(pfn, 0, 0); | 435 | memory_failure_queue(pfn, 0, 0); |
436 | } | 436 | } |
diff --git a/drivers/edac/ghes_edac.c b/drivers/edac/ghes_edac.c index bb534670ec02..0ad797b9db65 100644 --- a/drivers/edac/ghes_edac.c +++ b/drivers/edac/ghes_edac.c | |||
@@ -297,15 +297,14 @@ void ghes_edac_report_mem_error(struct ghes *ghes, int sev, | |||
297 | } | 297 | } |
298 | 298 | ||
299 | /* Error address */ | 299 | /* Error address */ |
300 | if (mem_err->validation_bits & CPER_MEM_VALID_PHYSICAL_ADDRESS) { | 300 | if (mem_err->validation_bits & CPER_MEM_VALID_PA) { |
301 | e->page_frame_number = mem_err->physical_addr >> PAGE_SHIFT; | 301 | e->page_frame_number = mem_err->physical_addr >> PAGE_SHIFT; |
302 | e->offset_in_page = mem_err->physical_addr & ~PAGE_MASK; | 302 | e->offset_in_page = mem_err->physical_addr & ~PAGE_MASK; |
303 | } | 303 | } |
304 | 304 | ||
305 | /* Error grain */ | 305 | /* Error grain */ |
306 | if (mem_err->validation_bits & CPER_MEM_VALID_PHYSICAL_ADDRESS_MASK) { | 306 | if (mem_err->validation_bits & CPER_MEM_VALID_PA_MASK) |
307 | e->grain = ~(mem_err->physical_addr_mask & ~PAGE_MASK); | 307 | e->grain = ~(mem_err->physical_addr_mask & ~PAGE_MASK); |
308 | } | ||
309 | 308 | ||
310 | /* Memory error location, mapped on e->location */ | 309 | /* Memory error location, mapped on e->location */ |
311 | p = e->location; | 310 | p = e->location; |
diff --git a/include/linux/cper.h b/include/linux/cper.h index 09ebe2113641..2fc0ec3d89cc 100644 --- a/include/linux/cper.h +++ b/include/linux/cper.h | |||
@@ -218,8 +218,8 @@ enum { | |||
218 | #define CPER_PROC_VALID_IP 0x1000 | 218 | #define CPER_PROC_VALID_IP 0x1000 |
219 | 219 | ||
220 | #define CPER_MEM_VALID_ERROR_STATUS 0x0001 | 220 | #define CPER_MEM_VALID_ERROR_STATUS 0x0001 |
221 | #define CPER_MEM_VALID_PHYSICAL_ADDRESS 0x0002 | 221 | #define CPER_MEM_VALID_PA 0x0002 |
222 | #define CPER_MEM_VALID_PHYSICAL_ADDRESS_MASK 0x0004 | 222 | #define CPER_MEM_VALID_PA_MASK 0x0004 |
223 | #define CPER_MEM_VALID_NODE 0x0008 | 223 | #define CPER_MEM_VALID_NODE 0x0008 |
224 | #define CPER_MEM_VALID_CARD 0x0010 | 224 | #define CPER_MEM_VALID_CARD 0x0010 |
225 | #define CPER_MEM_VALID_MODULE 0x0020 | 225 | #define CPER_MEM_VALID_MODULE 0x0020 |
@@ -232,6 +232,9 @@ enum { | |||
232 | #define CPER_MEM_VALID_RESPONDER_ID 0x1000 | 232 | #define CPER_MEM_VALID_RESPONDER_ID 0x1000 |
233 | #define CPER_MEM_VALID_TARGET_ID 0x2000 | 233 | #define CPER_MEM_VALID_TARGET_ID 0x2000 |
234 | #define CPER_MEM_VALID_ERROR_TYPE 0x4000 | 234 | #define CPER_MEM_VALID_ERROR_TYPE 0x4000 |
235 | #define CPER_MEM_VALID_RANK_NUMBER 0x8000 | ||
236 | #define CPER_MEM_VALID_CARD_HANDLE 0x10000 | ||
237 | #define CPER_MEM_VALID_MODULE_HANDLE 0x20000 | ||
235 | 238 | ||
236 | #define CPER_PCIE_VALID_PORT_TYPE 0x0001 | 239 | #define CPER_PCIE_VALID_PORT_TYPE 0x0001 |
237 | #define CPER_PCIE_VALID_VERSION 0x0002 | 240 | #define CPER_PCIE_VALID_VERSION 0x0002 |
@@ -347,6 +350,10 @@ struct cper_sec_mem_err { | |||
347 | __u64 responder_id; | 350 | __u64 responder_id; |
348 | __u64 target_id; | 351 | __u64 target_id; |
349 | __u8 error_type; | 352 | __u8 error_type; |
353 | __u8 reserved; | ||
354 | __u16 rank; | ||
355 | __u16 mem_array_handle; /* card handle in UEFI 2.4 */ | ||
356 | __u16 mem_dev_handle; /* module handle in UEFI 2.4 */ | ||
350 | }; | 357 | }; |
351 | 358 | ||
352 | struct cper_sec_pcie { | 359 | struct cper_sec_pcie { |