xref: /arm-trusted-firmware/plat/arm/board/fvp_r/fvp_r_err.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2021, Arm Limited. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <errno.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <common/debug.h>
10*91f16700Schasinglulu #include <drivers/arm/sp805.h>
11*91f16700Schasinglulu #include <drivers/cfi/v2m_flash.h>
12*91f16700Schasinglulu #include <plat/arm/common/plat_arm.h>
13*91f16700Schasinglulu #include <platform_def.h>
14*91f16700Schasinglulu 
15*91f16700Schasinglulu /*
16*91f16700Schasinglulu  * FVP_R error handler
17*91f16700Schasinglulu  */
18*91f16700Schasinglulu __dead2 void plat_arm_error_handler(int err)
19*91f16700Schasinglulu {
20*91f16700Schasinglulu 	int ret;
21*91f16700Schasinglulu 
22*91f16700Schasinglulu 	switch (err) {
23*91f16700Schasinglulu 	case -ENOENT:
24*91f16700Schasinglulu 	case -EAUTH:
25*91f16700Schasinglulu 		/* Image load or authentication error. Erase the ToC */
26*91f16700Schasinglulu 		INFO("Erasing FIP ToC from flash...\n");
27*91f16700Schasinglulu 		(void)nor_unlock(PLAT_ARM_FLASH_IMAGE_BASE);
28*91f16700Schasinglulu 		ret = nor_word_program(PLAT_ARM_FLASH_IMAGE_BASE, 0);
29*91f16700Schasinglulu 		if (ret != 0) {
30*91f16700Schasinglulu 			ERROR("Cannot erase ToC\n");
31*91f16700Schasinglulu 		} else {
32*91f16700Schasinglulu 			INFO("Done\n");
33*91f16700Schasinglulu 		}
34*91f16700Schasinglulu 		break;
35*91f16700Schasinglulu 	default:
36*91f16700Schasinglulu 		/* Unexpected error */
37*91f16700Schasinglulu 		break;
38*91f16700Schasinglulu 	}
39*91f16700Schasinglulu 
40*91f16700Schasinglulu 	(void)console_flush();
41*91f16700Schasinglulu 
42*91f16700Schasinglulu 	/* Setup the watchdog to reset the system as soon as possible */
43*91f16700Schasinglulu 	sp805_refresh(ARM_SP805_TWDG_BASE, 1U);
44*91f16700Schasinglulu 
45*91f16700Schasinglulu 	while (true) {
46*91f16700Schasinglulu 		wfi();
47*91f16700Schasinglulu 	}
48*91f16700Schasinglulu }
49