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