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