xref: /arm-trusted-firmware/plat/intel/soc/common/sip/socfpga_sip_ecc.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu // SPDX-License-Identifier: BSD-3-Clause
2*91f16700Schasinglulu /*
3*91f16700Schasinglulu  * Copyright (c) 2020-2023, ARM Limited and Contributors. All rights reserved.
4*91f16700Schasinglulu  */
5*91f16700Schasinglulu 
6*91f16700Schasinglulu #include <assert.h>
7*91f16700Schasinglulu #include <common/debug.h>
8*91f16700Schasinglulu #include <common/runtime_svc.h>
9*91f16700Schasinglulu #include <lib/mmio.h>
10*91f16700Schasinglulu #include <tools_share/uuid.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include "socfpga_fcs.h"
13*91f16700Schasinglulu #include "socfpga_mailbox.h"
14*91f16700Schasinglulu #include "socfpga_plat_def.h"
15*91f16700Schasinglulu #include "socfpga_reset_manager.h"
16*91f16700Schasinglulu #include "socfpga_sip_svc.h"
17*91f16700Schasinglulu #include "socfpga_system_manager.h"
18*91f16700Schasinglulu 
19*91f16700Schasinglulu 
20*91f16700Schasinglulu uint32_t intel_ecc_dbe_notification(uint64_t dbe_value)
21*91f16700Schasinglulu {
22*91f16700Schasinglulu 	dbe_value &= WARM_RESET_WFI_FLAG;
23*91f16700Schasinglulu 
24*91f16700Schasinglulu 	/* Trap CPUs in WFI if warm reset flag is set */
25*91f16700Schasinglulu 	if (dbe_value > 0) {
26*91f16700Schasinglulu 		while (1) {
27*91f16700Schasinglulu 			wfi();
28*91f16700Schasinglulu 		}
29*91f16700Schasinglulu 	}
30*91f16700Schasinglulu 
31*91f16700Schasinglulu 	return INTEL_SIP_SMC_STATUS_OK;
32*91f16700Schasinglulu }
33*91f16700Schasinglulu 
34*91f16700Schasinglulu bool cold_reset_for_ecc_dbe(void)
35*91f16700Schasinglulu {
36*91f16700Schasinglulu 	uint32_t dbe_int_status;
37*91f16700Schasinglulu 
38*91f16700Schasinglulu 	dbe_int_status = mmio_read_32(SOCFPGA_SYSMGR(BOOT_SCRATCH_COLD_8));
39*91f16700Schasinglulu 
40*91f16700Schasinglulu 	/* Trigger cold reset only for error in critical memory (DDR/OCRAM) */
41*91f16700Schasinglulu 	dbe_int_status &= SYSMGR_ECC_DBE_COLD_RST_MASK;
42*91f16700Schasinglulu 
43*91f16700Schasinglulu 	if (dbe_int_status > 0) {
44*91f16700Schasinglulu 		return true;
45*91f16700Schasinglulu 	}
46*91f16700Schasinglulu 
47*91f16700Schasinglulu 	return false;
48*91f16700Schasinglulu }
49