xref: /arm-trusted-firmware/plat/nxp/common/warm_reset/plat_warm_reset.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright 2021 NXP
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  *
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu #include <errno.h>
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <common/debug.h>
11*91f16700Schasinglulu #include <ddr.h>
12*91f16700Schasinglulu #ifndef NXP_COINED_BB
13*91f16700Schasinglulu #include <flash_info.h>
14*91f16700Schasinglulu #include <fspi.h>
15*91f16700Schasinglulu #include <fspi_api.h>
16*91f16700Schasinglulu #endif
17*91f16700Schasinglulu #include <lib/mmio.h>
18*91f16700Schasinglulu #include <lib/psci/psci.h>
19*91f16700Schasinglulu #ifdef NXP_COINED_BB
20*91f16700Schasinglulu #include <snvs.h>
21*91f16700Schasinglulu #endif
22*91f16700Schasinglulu 
23*91f16700Schasinglulu #include <plat_nv_storage.h>
24*91f16700Schasinglulu #include "plat_warm_rst.h"
25*91f16700Schasinglulu #include "platform_def.h"
26*91f16700Schasinglulu 
27*91f16700Schasinglulu #if defined(IMAGE_BL2)
28*91f16700Schasinglulu 
29*91f16700Schasinglulu uint32_t is_warm_boot(void)
30*91f16700Schasinglulu {
31*91f16700Schasinglulu 	uint32_t ret = mmio_read_32(NXP_RESET_ADDR + RST_RSTRQSR1_OFFSET)
32*91f16700Schasinglulu 				& ~(RSTRQSR1_SWRR);
33*91f16700Schasinglulu 
34*91f16700Schasinglulu 	const nv_app_data_t *nv_app_data = get_nv_data();
35*91f16700Schasinglulu 
36*91f16700Schasinglulu 	if (ret == 0U) {
37*91f16700Schasinglulu 		INFO("Not a SW(Warm) triggered reset.\n");
38*91f16700Schasinglulu 		return 0U;
39*91f16700Schasinglulu 	}
40*91f16700Schasinglulu 
41*91f16700Schasinglulu 	ret = (nv_app_data->warm_rst_flag == WARM_BOOT_SUCCESS) ? 1 : 0;
42*91f16700Schasinglulu 
43*91f16700Schasinglulu 	if (ret != 0U) {
44*91f16700Schasinglulu 		INFO("Warm Reset was triggered..\n");
45*91f16700Schasinglulu 	} else {
46*91f16700Schasinglulu 		INFO("Warm Reset was not triggered..\n");
47*91f16700Schasinglulu 	}
48*91f16700Schasinglulu 
49*91f16700Schasinglulu 	return ret;
50*91f16700Schasinglulu }
51*91f16700Schasinglulu 
52*91f16700Schasinglulu #endif
53*91f16700Schasinglulu 
54*91f16700Schasinglulu #if defined(IMAGE_BL31)
55*91f16700Schasinglulu int prep_n_execute_warm_reset(void)
56*91f16700Schasinglulu {
57*91f16700Schasinglulu #ifdef NXP_COINED_BB
58*91f16700Schasinglulu #if !TRUSTED_BOARD_BOOT
59*91f16700Schasinglulu 	snvs_disable_zeroize_lp_gpr();
60*91f16700Schasinglulu #endif
61*91f16700Schasinglulu #else
62*91f16700Schasinglulu 	int ret;
63*91f16700Schasinglulu 	uint8_t warm_reset = WARM_BOOT_SUCCESS;
64*91f16700Schasinglulu 
65*91f16700Schasinglulu 	ret = fspi_init(NXP_FLEXSPI_ADDR, NXP_FLEXSPI_FLASH_ADDR);
66*91f16700Schasinglulu 
67*91f16700Schasinglulu 	if (ret != 0) {
68*91f16700Schasinglulu 		ERROR("Failed to initialized driver flexspi-nor.\n");
69*91f16700Schasinglulu 		ERROR("exiting warm-reset request.\n");
70*91f16700Schasinglulu 		return PSCI_E_INTERN_FAIL;
71*91f16700Schasinglulu 	}
72*91f16700Schasinglulu 
73*91f16700Schasinglulu 	/* Sector starting from NV_STORAGE_BASE_ADDR is already
74*91f16700Schasinglulu 	 * erased for writing.
75*91f16700Schasinglulu 	 */
76*91f16700Schasinglulu 
77*91f16700Schasinglulu #if (ERLY_WRM_RST_FLG_FLSH_UPDT)
78*91f16700Schasinglulu 	ret = xspi_write((uint32_t)NV_STORAGE_BASE_ADDR,
79*91f16700Schasinglulu 			 &warm_reset,
80*91f16700Schasinglulu 			 sizeof(warm_reset));
81*91f16700Schasinglulu #else
82*91f16700Schasinglulu 	/* Preparation for writing the Warm reset flag. */
83*91f16700Schasinglulu 	ret = xspi_wren((uint32_t)NV_STORAGE_BASE_ADDR);
84*91f16700Schasinglulu 
85*91f16700Schasinglulu 	/* IP Control Register0 - SF Address to be read */
86*91f16700Schasinglulu 	fspi_out32((NXP_FLEXSPI_ADDR + FSPI_IPCR0),
87*91f16700Schasinglulu 		   (uint32_t) NV_STORAGE_BASE_ADDR);
88*91f16700Schasinglulu 
89*91f16700Schasinglulu 	while ((fspi_in32(NXP_FLEXSPI_ADDR + FSPI_INTR) &
90*91f16700Schasinglulu 		FSPI_INTR_IPTXWE_MASK) == 0) {
91*91f16700Schasinglulu 		;
92*91f16700Schasinglulu 	}
93*91f16700Schasinglulu 	/* Write TX FIFO Data Register */
94*91f16700Schasinglulu 	fspi_out32(NXP_FLEXSPI_ADDR + FSPI_TFDR, (uint32_t) warm_reset);
95*91f16700Schasinglulu 
96*91f16700Schasinglulu 	fspi_out32(NXP_FLEXSPI_ADDR + FSPI_INTR, FSPI_INTR_IPTXWE);
97*91f16700Schasinglulu 
98*91f16700Schasinglulu 	/* IP Control Register1 - SEQID_WRITE operation, Size = 1 Byte */
99*91f16700Schasinglulu 	fspi_out32(NXP_FLEXSPI_ADDR + FSPI_IPCR1,
100*91f16700Schasinglulu 		   (uint32_t)(FSPI_WRITE_SEQ_ID << FSPI_IPCR1_ISEQID_SHIFT) |
101*91f16700Schasinglulu 		   (uint16_t) sizeof(warm_reset));
102*91f16700Schasinglulu 
103*91f16700Schasinglulu 	/* Trigger XSPI-IP-Write cmd only if:
104*91f16700Schasinglulu 	 *  - Putting DDR in-self refresh mode is successfully.
105*91f16700Schasinglulu 	 *    to complete the writing of the warm-reset flag
106*91f16700Schasinglulu 	 *    to flash.
107*91f16700Schasinglulu 	 *
108*91f16700Schasinglulu 	 * This code is as part of assembly.
109*91f16700Schasinglulu 	 */
110*91f16700Schasinglulu #endif
111*91f16700Schasinglulu #endif
112*91f16700Schasinglulu 	INFO("Doing DDR Self refresh.\n");
113*91f16700Schasinglulu 	_soc_sys_warm_reset();
114*91f16700Schasinglulu 
115*91f16700Schasinglulu 	/* Expected behaviour is to do the power cycle */
116*91f16700Schasinglulu 	while (1 != 0)
117*91f16700Schasinglulu 		;
118*91f16700Schasinglulu 
119*91f16700Schasinglulu 	return -1;
120*91f16700Schasinglulu }
121*91f16700Schasinglulu #endif
122