xref: /arm-trusted-firmware/plat/arm/css/sgi/include/sgi_ras.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2018-2023, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef SGI_RAS_H
8*91f16700Schasinglulu #define SGI_RAS_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <lib/extensions/ras.h>
11*91f16700Schasinglulu #include <plat/common/platform.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu /*
14*91f16700Schasinglulu  * Interrupt type supported.
15*91f16700Schasinglulu  * - SGI_RAS_INTR_TYPE_SPI: Denotes a SPI interrupt
16*91f16700Schasinglulu  * - SGI_RAS_INTR_TYPE_PPI: Denotes a PPI interrupt
17*91f16700Schasinglulu  */
18*91f16700Schasinglulu #define SGI_RAS_INTR_TYPE_SPI 0
19*91f16700Schasinglulu #define SGI_RAS_INTR_TYPE_PPI 1
20*91f16700Schasinglulu 
21*91f16700Schasinglulu /*
22*91f16700Schasinglulu  * MM Communicate information structure. Required to generate MM Communicate
23*91f16700Schasinglulu  * payload to be shared with Standalone MM.
24*91f16700Schasinglulu  */
25*91f16700Schasinglulu typedef struct mm_communicate_header {
26*91f16700Schasinglulu 	struct efi_guid	header_guid;
27*91f16700Schasinglulu 	size_t		message_len;
28*91f16700Schasinglulu 	uint8_t		data[1];
29*91f16700Schasinglulu } mm_communicate_header_t;
30*91f16700Schasinglulu 
31*91f16700Schasinglulu /* RAS error info data structure. */
32*91f16700Schasinglulu struct sgi_ras_ev_map {
33*91f16700Schasinglulu 	int sdei_ev_num;	/* SDEI Event number */
34*91f16700Schasinglulu 	int intr;		/* Physical intr number */
35*91f16700Schasinglulu 	int intr_type;          /* Interrupt Type (SPI or PPI)*/
36*91f16700Schasinglulu };
37*91f16700Schasinglulu 
38*91f16700Schasinglulu /* RAS config data structure. Must be defined by each platform. */
39*91f16700Schasinglulu struct plat_sgi_ras_config {
40*91f16700Schasinglulu 	struct sgi_ras_ev_map *ev_map;
41*91f16700Schasinglulu 	int ev_map_size;
42*91f16700Schasinglulu };
43*91f16700Schasinglulu 
44*91f16700Schasinglulu /*
45*91f16700Schasinglulu  * Find event map for a given interrupt number. On success, returns pointer
46*91f16700Schasinglulu  * to the event map. On error, returns NULL.
47*91f16700Schasinglulu  */
48*91f16700Schasinglulu struct sgi_ras_ev_map *sgi_find_ras_event_map_by_intr(uint32_t intr_num);
49*91f16700Schasinglulu 
50*91f16700Schasinglulu /*
51*91f16700Schasinglulu  * Initialization function for the framework.
52*91f16700Schasinglulu  *
53*91f16700Schasinglulu  * Registers RAS config provided by the platform and then configures and
54*91f16700Schasinglulu  * enables interrupt for each registered error. On success, return 0.
55*91f16700Schasinglulu  */
56*91f16700Schasinglulu int sgi_ras_platform_setup(struct plat_sgi_ras_config *config);
57*91f16700Schasinglulu 
58*91f16700Schasinglulu /* Base element RAM RAS interrupt handler function. */
59*91f16700Schasinglulu int sgi_ras_sram_intr_handler(const struct err_record_info *err_rec,
60*91f16700Schasinglulu 				int probe_data,
61*91f16700Schasinglulu 				const struct err_handler_data *const data);
62*91f16700Schasinglulu 
63*91f16700Schasinglulu /* CPU RAS interrupt handler */
64*91f16700Schasinglulu int sgi_ras_cpu_intr_handler(const struct err_record_info *err_rec,
65*91f16700Schasinglulu 				int probe_data,
66*91f16700Schasinglulu 				const struct err_handler_data *const data);
67*91f16700Schasinglulu 
68*91f16700Schasinglulu #endif /* SGI_RAS_H */
69