xref: /arm-trusted-firmware/plat/brcm/board/common/platform_common.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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