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