95 lines
2.2 KiB
C
95 lines
2.2 KiB
C
/*
|
|
* Copyright (c) 2015-2020, Broadcom
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include <arch_helpers.h>
|
|
#include <common/debug.h>
|
|
#include <drivers/brcm/sotp.h>
|
|
|
|
#include <cmn_plat_util.h>
|
|
#include <platform_def.h>
|
|
|
|
uint32_t boot_source_get(void)
|
|
{
|
|
uint32_t data;
|
|
|
|
#ifdef FORCE_BOOTSOURCE
|
|
data = FORCE_BOOTSOURCE;
|
|
#else
|
|
/* Read primary boot strap from CRMU persistent registers */
|
|
data = mmio_read_32(CRMU_IHOST_SW_PERSISTENT_REG1);
|
|
if (data & BOOT_SOURCE_SOFT_ENABLE_MASK) {
|
|
data >>= BOOT_SOURCE_SOFT_DATA_OFFSET;
|
|
} else {
|
|
uint64_t sotp_atf_row;
|
|
|
|
sotp_atf_row =
|
|
sotp_mem_read(SOTP_ATF_CFG_ROW_ID, SOTP_ROW_NO_ECC);
|
|
|
|
if (sotp_atf_row & SOTP_BOOT_SOURCE_ENABLE_MASK) {
|
|
/* Construct the boot source based on SOTP bits */
|
|
data = 0;
|
|
if (sotp_atf_row & SOTP_BOOT_SOURCE_BITS0)
|
|
data |= 0x1;
|
|
if (sotp_atf_row & SOTP_BOOT_SOURCE_BITS1)
|
|
data |= 0x2;
|
|
if (sotp_atf_row & SOTP_BOOT_SOURCE_BITS2)
|
|
data |= 0x4;
|
|
} else {
|
|
|
|
/*
|
|
* This path is for L0 reset with
|
|
* Primary Boot source disabled in SOTP.
|
|
* BOOT_SOURCE_FROM_PR_ON_L1 compile flag will allow
|
|
* to never come back here so that the
|
|
* external straps will not be read on L1 reset.
|
|
*/
|
|
|
|
/* Use the external straps */
|
|
data = mmio_read_32(ROM_S0_IDM_IO_STATUS);
|
|
|
|
#ifdef BOOT_SOURCE_FROM_PR_ON_L1
|
|
/* Enable boot source read from PR#1 */
|
|
mmio_setbits_32(CRMU_IHOST_SW_PERSISTENT_REG1,
|
|
BOOT_SOURCE_SOFT_ENABLE_MASK);
|
|
|
|
/* set boot source */
|
|
data &= BOOT_SOURCE_MASK;
|
|
mmio_clrsetbits_32(CRMU_IHOST_SW_PERSISTENT_REG1,
|
|
BOOT_SOURCE_MASK << BOOT_SOURCE_SOFT_DATA_OFFSET,
|
|
data << BOOT_SOURCE_SOFT_DATA_OFFSET);
|
|
#endif
|
|
}
|
|
}
|
|
#endif
|
|
return (data & BOOT_SOURCE_MASK);
|
|
}
|
|
|
|
void __dead2 plat_soft_reset(uint32_t reset)
|
|
{
|
|
if (reset == SOFT_RESET_L3) {
|
|
mmio_setbits_32(CRMU_IHOST_SW_PERSISTENT_REG1, reset);
|
|
mmio_write_32(CRMU_MAIL_BOX0, 0x0);
|
|
mmio_write_32(CRMU_MAIL_BOX1, 0xFFFFFFFF);
|
|
}
|
|
|
|
if (reset != SOFT_SYS_RESET_L1)
|
|
reset = SOFT_PWR_UP_RESET_L0;
|
|
|
|
if (reset == SOFT_PWR_UP_RESET_L0)
|
|
INFO("L0 RESET...\n");
|
|
|
|
if (reset == SOFT_SYS_RESET_L1)
|
|
INFO("L1 RESET...\n");
|
|
|
|
console_flush();
|
|
|
|
mmio_clrbits_32(CRMU_SOFT_RESET_CTRL, 1 << reset);
|
|
|
|
while (1) {
|
|
;
|
|
}
|
|
}
|