1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2015-2020, Broadcom 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <arch_helpers.h> 8*91f16700Schasinglulu #include <common/debug.h> 9*91f16700Schasinglulu #include <drivers/brcm/sotp.h> 10*91f16700Schasinglulu 11*91f16700Schasinglulu #include <cmn_plat_util.h> 12*91f16700Schasinglulu #include <platform_def.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu uint32_t boot_source_get(void) 15*91f16700Schasinglulu { 16*91f16700Schasinglulu uint32_t data; 17*91f16700Schasinglulu 18*91f16700Schasinglulu #ifdef FORCE_BOOTSOURCE 19*91f16700Schasinglulu data = FORCE_BOOTSOURCE; 20*91f16700Schasinglulu #else 21*91f16700Schasinglulu /* Read primary boot strap from CRMU persistent registers */ 22*91f16700Schasinglulu data = mmio_read_32(CRMU_IHOST_SW_PERSISTENT_REG1); 23*91f16700Schasinglulu if (data & BOOT_SOURCE_SOFT_ENABLE_MASK) { 24*91f16700Schasinglulu data >>= BOOT_SOURCE_SOFT_DATA_OFFSET; 25*91f16700Schasinglulu } else { 26*91f16700Schasinglulu uint64_t sotp_atf_row; 27*91f16700Schasinglulu 28*91f16700Schasinglulu sotp_atf_row = 29*91f16700Schasinglulu sotp_mem_read(SOTP_ATF_CFG_ROW_ID, SOTP_ROW_NO_ECC); 30*91f16700Schasinglulu 31*91f16700Schasinglulu if (sotp_atf_row & SOTP_BOOT_SOURCE_ENABLE_MASK) { 32*91f16700Schasinglulu /* Construct the boot source based on SOTP bits */ 33*91f16700Schasinglulu data = 0; 34*91f16700Schasinglulu if (sotp_atf_row & SOTP_BOOT_SOURCE_BITS0) 35*91f16700Schasinglulu data |= 0x1; 36*91f16700Schasinglulu if (sotp_atf_row & SOTP_BOOT_SOURCE_BITS1) 37*91f16700Schasinglulu data |= 0x2; 38*91f16700Schasinglulu if (sotp_atf_row & SOTP_BOOT_SOURCE_BITS2) 39*91f16700Schasinglulu data |= 0x4; 40*91f16700Schasinglulu } else { 41*91f16700Schasinglulu 42*91f16700Schasinglulu /* 43*91f16700Schasinglulu * This path is for L0 reset with 44*91f16700Schasinglulu * Primary Boot source disabled in SOTP. 45*91f16700Schasinglulu * BOOT_SOURCE_FROM_PR_ON_L1 compile flag will allow 46*91f16700Schasinglulu * to never come back here so that the 47*91f16700Schasinglulu * external straps will not be read on L1 reset. 48*91f16700Schasinglulu */ 49*91f16700Schasinglulu 50*91f16700Schasinglulu /* Use the external straps */ 51*91f16700Schasinglulu data = mmio_read_32(ROM_S0_IDM_IO_STATUS); 52*91f16700Schasinglulu 53*91f16700Schasinglulu #ifdef BOOT_SOURCE_FROM_PR_ON_L1 54*91f16700Schasinglulu /* Enable boot source read from PR#1 */ 55*91f16700Schasinglulu mmio_setbits_32(CRMU_IHOST_SW_PERSISTENT_REG1, 56*91f16700Schasinglulu BOOT_SOURCE_SOFT_ENABLE_MASK); 57*91f16700Schasinglulu 58*91f16700Schasinglulu /* set boot source */ 59*91f16700Schasinglulu data &= BOOT_SOURCE_MASK; 60*91f16700Schasinglulu mmio_clrsetbits_32(CRMU_IHOST_SW_PERSISTENT_REG1, 61*91f16700Schasinglulu BOOT_SOURCE_MASK << BOOT_SOURCE_SOFT_DATA_OFFSET, 62*91f16700Schasinglulu data << BOOT_SOURCE_SOFT_DATA_OFFSET); 63*91f16700Schasinglulu #endif 64*91f16700Schasinglulu } 65*91f16700Schasinglulu } 66*91f16700Schasinglulu #endif 67*91f16700Schasinglulu return (data & BOOT_SOURCE_MASK); 68*91f16700Schasinglulu } 69*91f16700Schasinglulu 70*91f16700Schasinglulu void __dead2 plat_soft_reset(uint32_t reset) 71*91f16700Schasinglulu { 72*91f16700Schasinglulu if (reset == SOFT_RESET_L3) { 73*91f16700Schasinglulu mmio_setbits_32(CRMU_IHOST_SW_PERSISTENT_REG1, reset); 74*91f16700Schasinglulu mmio_write_32(CRMU_MAIL_BOX0, 0x0); 75*91f16700Schasinglulu mmio_write_32(CRMU_MAIL_BOX1, 0xFFFFFFFF); 76*91f16700Schasinglulu } 77*91f16700Schasinglulu 78*91f16700Schasinglulu if (reset != SOFT_SYS_RESET_L1) 79*91f16700Schasinglulu reset = SOFT_PWR_UP_RESET_L0; 80*91f16700Schasinglulu 81*91f16700Schasinglulu if (reset == SOFT_PWR_UP_RESET_L0) 82*91f16700Schasinglulu INFO("L0 RESET...\n"); 83*91f16700Schasinglulu 84*91f16700Schasinglulu if (reset == SOFT_SYS_RESET_L1) 85*91f16700Schasinglulu INFO("L1 RESET...\n"); 86*91f16700Schasinglulu 87*91f16700Schasinglulu console_flush(); 88*91f16700Schasinglulu 89*91f16700Schasinglulu mmio_clrbits_32(CRMU_SOFT_RESET_CTRL, 1 << reset); 90*91f16700Schasinglulu 91*91f16700Schasinglulu while (1) { 92*91f16700Schasinglulu ; 93*91f16700Schasinglulu } 94*91f16700Schasinglulu } 95