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