xref: /rk3399_ARM-atf/lib/extensions/ras/ras_common.c (revision 362599eca43a0e97b1bd38bfc96d277d86faa3d4)
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