1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2022 Arm Limited. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu * 6*91f16700Schasinglulu * DRTM support for DRTM error remediation. 7*91f16700Schasinglulu * 8*91f16700Schasinglulu */ 9*91f16700Schasinglulu #include <inttypes.h> 10*91f16700Schasinglulu #include <stdint.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #include <common/debug.h> 13*91f16700Schasinglulu #include <common/runtime_svc.h> 14*91f16700Schasinglulu #include "drtm_main.h" 15*91f16700Schasinglulu #include <plat/common/platform.h> 16*91f16700Schasinglulu 17*91f16700Schasinglulu uint64_t drtm_set_error(uint64_t x1, void *ctx) 18*91f16700Schasinglulu { 19*91f16700Schasinglulu int rc; 20*91f16700Schasinglulu 21*91f16700Schasinglulu rc = plat_set_drtm_error(x1); 22*91f16700Schasinglulu 23*91f16700Schasinglulu if (rc != 0) { 24*91f16700Schasinglulu SMC_RET1(ctx, INTERNAL_ERROR); 25*91f16700Schasinglulu } 26*91f16700Schasinglulu 27*91f16700Schasinglulu SMC_RET1(ctx, SUCCESS); 28*91f16700Schasinglulu } 29*91f16700Schasinglulu 30*91f16700Schasinglulu uint64_t drtm_get_error(void *ctx) 31*91f16700Schasinglulu { 32*91f16700Schasinglulu uint64_t error_code; 33*91f16700Schasinglulu int rc; 34*91f16700Schasinglulu 35*91f16700Schasinglulu rc = plat_get_drtm_error(&error_code); 36*91f16700Schasinglulu 37*91f16700Schasinglulu if (rc != 0) { 38*91f16700Schasinglulu SMC_RET1(ctx, INTERNAL_ERROR); 39*91f16700Schasinglulu } 40*91f16700Schasinglulu 41*91f16700Schasinglulu SMC_RET2(ctx, SUCCESS, error_code); 42*91f16700Schasinglulu } 43*91f16700Schasinglulu 44*91f16700Schasinglulu void drtm_enter_remediation(uint64_t err_code, const char *err_str) 45*91f16700Schasinglulu { 46*91f16700Schasinglulu int rc = plat_set_drtm_error(err_code); 47*91f16700Schasinglulu 48*91f16700Schasinglulu if (rc != 0) { 49*91f16700Schasinglulu ERROR("%s(): drtm_error_set() failed unexpectedly rc=%d\n", 50*91f16700Schasinglulu __func__, rc); 51*91f16700Schasinglulu panic(); 52*91f16700Schasinglulu } 53*91f16700Schasinglulu 54*91f16700Schasinglulu ERROR("DRTM: entering remediation of error:\n%" PRIu64 "\t\'%s\'\n", 55*91f16700Schasinglulu err_code, err_str); 56*91f16700Schasinglulu 57*91f16700Schasinglulu ERROR("%s(): system reset is not yet supported\n", __func__); 58*91f16700Schasinglulu plat_system_reset(); 59*91f16700Schasinglulu } 60