1a7055c58SJeenu Viswambharan /* 2*7e87f494SBoyan Karatotev * Copyright (c) 2018-2025, Arm Limited and Contributors. All rights reserved. 3a7055c58SJeenu Viswambharan * 4a7055c58SJeenu Viswambharan * SPDX-License-Identifier: BSD-3-Clause 5a7055c58SJeenu Viswambharan */ 6a7055c58SJeenu Viswambharan 75602ce1dSManish Pandey #include <inttypes.h> 85602ce1dSManish Pandey #include <stdint.h> 95602ce1dSManish Pandey 1009d40e0eSAntonio Nino Diaz #include <lib/extensions/ras.h> 115602ce1dSManish Pandey #include <services/sdei.h> 125602ce1dSManish Pandey 13*7e87f494SBoyan Karatotev #if PLATFORM_TEST_RAS_FFH 145602ce1dSManish Pandey static int injected_fault_handler(const struct err_record_info *info, 155602ce1dSManish Pandey int probe_data, const struct err_handler_data *const data) 165602ce1dSManish Pandey { 175602ce1dSManish Pandey uint64_t status; 185602ce1dSManish Pandey int ret; 195602ce1dSManish Pandey 205602ce1dSManish Pandey /* 215602ce1dSManish Pandey * The faulting error record is already selected by the SER probe 225602ce1dSManish Pandey * function. 235602ce1dSManish Pandey */ 245602ce1dSManish Pandey status = read_erxstatus_el1(); 255602ce1dSManish Pandey 265602ce1dSManish Pandey ERROR("Fault reported by system error record %d on 0x%lx: status=0x%" PRIx64 "\n", 275602ce1dSManish Pandey probe_data, read_mpidr_el1(), status); 285602ce1dSManish Pandey ERROR(" exception reason=%u syndrome=0x%" PRIx64 "\n", data->ea_reason, 295602ce1dSManish Pandey data->flags); 305602ce1dSManish Pandey 315602ce1dSManish Pandey /* Clear error */ 325602ce1dSManish Pandey write_erxstatus_el1(status); 335602ce1dSManish Pandey 345602ce1dSManish Pandey ret = sdei_dispatch_event(5000); 355602ce1dSManish Pandey if (ret < 0) { 365602ce1dSManish Pandey ERROR("Can't dispatch event to SDEI\n"); 375602ce1dSManish Pandey panic(); 385602ce1dSManish Pandey } else { 395602ce1dSManish Pandey INFO("SDEI event dispatched\n"); 405602ce1dSManish Pandey } 415602ce1dSManish Pandey 425602ce1dSManish Pandey return 0; 435602ce1dSManish Pandey } 445602ce1dSManish Pandey 455602ce1dSManish Pandey void plat_handle_uncontainable_ea(void) 465602ce1dSManish Pandey { 475602ce1dSManish Pandey /* Do not change the string, CI expects it. Wait forever */ 485602ce1dSManish Pandey INFO("Injected Uncontainable Error\n"); 495602ce1dSManish Pandey while (true) { 505602ce1dSManish Pandey wfe(); 515602ce1dSManish Pandey } 525602ce1dSManish Pandey } 535602ce1dSManish 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*7e87f494SBoyan Karatotev #if PLATFORM_TEST_RAS_FFH 605602ce1dSManish Pandey /* Record for injected fault */ 615602ce1dSManish Pandey ERR_RECORD_SYSREG_V1(0, 2, ras_err_ser_probe_sysreg, 625602ce1dSManish Pandey injected_fault_handler, NULL), 635602ce1dSManish Pandey #endif 64a7055c58SJeenu Viswambharan }; 65a7055c58SJeenu Viswambharan 66a7055c58SJeenu Viswambharan REGISTER_ERR_RECORD_INFO(fvp_err_records); 67a7055c58SJeenu Viswambharan REGISTER_RAS_INTERRUPTS(fvp_ras_interrupts); 68