1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <inttypes.h> 8*91f16700Schasinglulu #include <stdint.h> 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <lib/extensions/ras.h> 11*91f16700Schasinglulu #include <services/sdei.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu #ifdef PLATFORM_TEST_RAS_FFH 14*91f16700Schasinglulu static int injected_fault_handler(const struct err_record_info *info, 15*91f16700Schasinglulu int probe_data, const struct err_handler_data *const data) 16*91f16700Schasinglulu { 17*91f16700Schasinglulu uint64_t status; 18*91f16700Schasinglulu int ret; 19*91f16700Schasinglulu 20*91f16700Schasinglulu /* 21*91f16700Schasinglulu * The faulting error record is already selected by the SER probe 22*91f16700Schasinglulu * function. 23*91f16700Schasinglulu */ 24*91f16700Schasinglulu status = read_erxstatus_el1(); 25*91f16700Schasinglulu 26*91f16700Schasinglulu ERROR("Fault reported by system error record %d on 0x%lx: status=0x%" PRIx64 "\n", 27*91f16700Schasinglulu probe_data, read_mpidr_el1(), status); 28*91f16700Schasinglulu ERROR(" exception reason=%u syndrome=0x%" PRIx64 "\n", data->ea_reason, 29*91f16700Schasinglulu data->flags); 30*91f16700Schasinglulu 31*91f16700Schasinglulu /* Clear error */ 32*91f16700Schasinglulu write_erxstatus_el1(status); 33*91f16700Schasinglulu 34*91f16700Schasinglulu ret = sdei_dispatch_event(5000); 35*91f16700Schasinglulu if (ret < 0) { 36*91f16700Schasinglulu ERROR("Can't dispatch event to SDEI\n"); 37*91f16700Schasinglulu panic(); 38*91f16700Schasinglulu } else { 39*91f16700Schasinglulu INFO("SDEI event dispatched\n"); 40*91f16700Schasinglulu } 41*91f16700Schasinglulu 42*91f16700Schasinglulu return 0; 43*91f16700Schasinglulu } 44*91f16700Schasinglulu 45*91f16700Schasinglulu void plat_handle_uncontainable_ea(void) 46*91f16700Schasinglulu { 47*91f16700Schasinglulu /* Do not change the string, CI expects it. Wait forever */ 48*91f16700Schasinglulu INFO("Injected Uncontainable Error\n"); 49*91f16700Schasinglulu while (true) { 50*91f16700Schasinglulu wfe(); 51*91f16700Schasinglulu } 52*91f16700Schasinglulu } 53*91f16700Schasinglulu #endif 54*91f16700Schasinglulu 55*91f16700Schasinglulu struct ras_interrupt fvp_ras_interrupts[] = { 56*91f16700Schasinglulu }; 57*91f16700Schasinglulu 58*91f16700Schasinglulu struct err_record_info fvp_err_records[] = { 59*91f16700Schasinglulu #ifdef PLATFORM_TEST_RAS_FFH 60*91f16700Schasinglulu /* Record for injected fault */ 61*91f16700Schasinglulu ERR_RECORD_SYSREG_V1(0, 2, ras_err_ser_probe_sysreg, 62*91f16700Schasinglulu injected_fault_handler, NULL), 63*91f16700Schasinglulu #endif 64*91f16700Schasinglulu }; 65*91f16700Schasinglulu 66*91f16700Schasinglulu REGISTER_ERR_RECORD_INFO(fvp_err_records); 67*91f16700Schasinglulu REGISTER_RAS_INTERRUPTS(fvp_ras_interrupts); 68