diff options
Diffstat (limited to 'drivers/edac/ghes_edac.c')
-rw-r--r-- | drivers/edac/ghes_edac.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/edac/ghes_edac.c b/drivers/edac/ghes_edac.c index 1bde45141073..636dcf18d5b6 100644 --- a/drivers/edac/ghes_edac.c +++ b/drivers/edac/ghes_edac.c @@ -15,6 +15,7 @@ #include <linux/edac.h> #include <linux/dmi.h> #include "edac_core.h" +#include <ras/ras_event.h> #define GHES_EDAC_REVISION " Ver: 1.0.0" @@ -24,6 +25,7 @@ struct ghes_edac_pvt { struct mem_ctl_info *mci; /* Buffers for the error handling routine */ + char detail_location[240]; char other_detail[160]; char msg[80]; }; @@ -191,6 +193,7 @@ void ghes_edac_report_mem_error(struct ghes *ghes, int sev, struct mem_ctl_info *mci; struct ghes_edac_pvt *pvt = NULL; char *p; + u8 grain_bits; list_for_each_entry(pvt, &ghes_reglist, list) { if (ghes == pvt->ghes) @@ -398,6 +401,16 @@ void ghes_edac_report_mem_error(struct ghes *ghes, int sev, if (p > pvt->other_detail) *(p - 1) = '\0'; + /* Generate the trace event */ + grain_bits = fls_long(e->grain); + sprintf(pvt->detail_location, "APEI location: %s %s", + e->location, e->other_detail); + trace_mc_event(type, e->msg, e->label, e->error_count, + mci->mc_idx, e->top_layer, e->mid_layer, e->low_layer, + PAGES_TO_MiB(e->page_frame_number) | e->offset_in_page, + grain_bits, e->syndrome, pvt->detail_location); + + /* Report the error via EDAC API */ edac_raw_mc_handle_error(type, mci, e); } EXPORT_SYMBOL_GPL(ghes_edac_report_mem_error); |