1*362599ecSJeenu Viswambharan /* 2*362599ecSJeenu Viswambharan * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 3*362599ecSJeenu Viswambharan * 4*362599ecSJeenu Viswambharan * SPDX-License-Identifier: BSD-3-Clause 5*362599ecSJeenu Viswambharan */ 6*362599ecSJeenu Viswambharan 7*362599ecSJeenu Viswambharan #include <arch_helpers.h> 8*362599ecSJeenu Viswambharan #include <debug.h> 9*362599ecSJeenu Viswambharan #include <ea_handle.h> 10*362599ecSJeenu Viswambharan #include <ehf.h> 11*362599ecSJeenu Viswambharan #include <platform.h> 12*362599ecSJeenu Viswambharan #include <ras.h> 13*362599ecSJeenu Viswambharan #include <ras_arch.h> 14*362599ecSJeenu Viswambharan 15*362599ecSJeenu Viswambharan /* Handler that receives External Aborts on RAS-capable systems */ 16*362599ecSJeenu Viswambharan int ras_ea_handler(unsigned int ea_reason, uint64_t syndrome, void *cookie, 17*362599ecSJeenu Viswambharan void *handle, uint64_t flags) 18*362599ecSJeenu Viswambharan { 19*362599ecSJeenu Viswambharan unsigned int i, n_handled = 0, ret; 20*362599ecSJeenu Viswambharan int probe_data; 21*362599ecSJeenu Viswambharan struct err_record_info *info; 22*362599ecSJeenu Viswambharan 23*362599ecSJeenu Viswambharan const struct err_handler_data err_data = { 24*362599ecSJeenu Viswambharan .version = ERR_HANDLER_VERSION, 25*362599ecSJeenu Viswambharan .ea_reason = ea_reason, 26*362599ecSJeenu Viswambharan .syndrome = syndrome, 27*362599ecSJeenu Viswambharan .flags = flags, 28*362599ecSJeenu Viswambharan .cookie = cookie, 29*362599ecSJeenu Viswambharan .handle = handle 30*362599ecSJeenu Viswambharan }; 31*362599ecSJeenu Viswambharan 32*362599ecSJeenu Viswambharan for_each_err_record_info(i, info) { 33*362599ecSJeenu Viswambharan assert(info->probe != NULL); 34*362599ecSJeenu Viswambharan assert(info->handler != NULL); 35*362599ecSJeenu Viswambharan 36*362599ecSJeenu Viswambharan /* Continue probing until the record group signals no error */ 37*362599ecSJeenu Viswambharan while (1) { 38*362599ecSJeenu Viswambharan if (info->probe(info, &probe_data) == 0) 39*362599ecSJeenu Viswambharan break; 40*362599ecSJeenu Viswambharan 41*362599ecSJeenu Viswambharan /* Handle error */ 42*362599ecSJeenu Viswambharan ret = info->handler(info, probe_data, &err_data); 43*362599ecSJeenu Viswambharan if (ret != 0) 44*362599ecSJeenu Viswambharan return ret; 45*362599ecSJeenu Viswambharan 46*362599ecSJeenu Viswambharan n_handled++; 47*362599ecSJeenu Viswambharan } 48*362599ecSJeenu Viswambharan } 49*362599ecSJeenu Viswambharan 50*362599ecSJeenu Viswambharan return (n_handled != 0); 51*362599ecSJeenu Viswambharan } 52