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 { |
