Add reporting ARM64 CPU correctable errors to the RAS correctable errors collector(CEC). ARM processor error types are cache/TLB/bus errors. Any of the above error types should not be consider for the error collection and CPU core isolation? Signed-off-by: Shiju Jose <shiju.jose@xxxxxxxxxx> --- drivers/acpi/apei/ghes.c | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index 81bf71b10d44..3cecb457d352 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c @@ -511,6 +511,38 @@ static void ghes_handle_aer(struct acpi_hest_generic_data *gdata) #endif } +static void ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata) +{ + struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata); + struct cper_arm_err_info *err_info; + int sec_sev; + int cpu, i, ret; + + log_arm_hw_error(err); + + sec_sev = ghes_severity(gdata->error_severity); + if (sec_sev != GHES_SEV_CORRECTED) + return; + +#if defined(CONFIG_ARM64) + cpu = get_logical_index(err->mpidr); + if (cpu == -EINVAL) + return; + + /* ARM processor error types are cache/tlb/bus errors. + * Any of the above error types should not be consider for the + * error collection and CPU core isolation? + */ + err_info = (struct cper_arm_err_info *)(err + 1); + for (i = 0; i < err->err_info_num; i++) { + ret = cec_cpu_add_elem(cpu, err_info->multiple_error + 1); + if (ret) + break; + err_info += 1; + } +#endif +} + static bool ghes_do_proc(struct ghes *ghes, const struct acpi_hest_generic_status *estatus) { @@ -543,9 +575,7 @@ static bool ghes_do_proc(struct ghes *ghes, ghes_handle_aer(gdata); } else if (guid_equal(sec_type, &CPER_SEC_PROC_ARM)) { - struct cper_sec_proc_arm *err = acpi_hest_get_payload(gdata); - - log_arm_hw_error(err); + ghes_handle_arm_hw_error(gdata); } else { void *err = acpi_hest_get_payload(gdata); -- 2.17.1