summaryrefslogtreecommitdiffstats
path: root/plat/brcm/board/common/platform_common.c
blob: f4c9a738fb88dfbcc1e8aa9f03d69a3153b72c84 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
 * 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) {
		;
	}
}