xref: /rk3399_ARM-atf/plat/nvidia/tegra/soc/t194/plat_setup.c (revision 6f802c44e9c2b926cf887a03e596b4ada841d3a5)
141612559SVarun Wadekar /*
226c1a1e7SVarun Wadekar  * Copyright (c) 2019-2020, NVIDIA CORPORATION. All rights reserved.
341612559SVarun Wadekar  *
441612559SVarun Wadekar  * SPDX-License-Identifier: BSD-3-Clause
541612559SVarun Wadekar  */
641612559SVarun Wadekar 
741612559SVarun Wadekar #include <arch_helpers.h>
841612559SVarun Wadekar #include <assert.h>
941612559SVarun Wadekar #include <bl31/bl31.h>
1041612559SVarun Wadekar #include <common/bl_common.h>
1141612559SVarun Wadekar #include <common/interrupt_props.h>
1241612559SVarun Wadekar #include <drivers/console.h>
1341612559SVarun Wadekar #include <context.h>
1441612559SVarun Wadekar #include <lib/el3_runtime/context_mgmt.h>
1541612559SVarun Wadekar #include <cortex_a57.h>
1641612559SVarun Wadekar #include <common/debug.h>
1741612559SVarun Wadekar #include <denver.h>
1841612559SVarun Wadekar #include <drivers/arm/gic_common.h>
1941612559SVarun Wadekar #include <drivers/arm/gicv2.h>
2041612559SVarun Wadekar #include <bl31/interrupt_mgmt.h>
2141612559SVarun Wadekar #include <mce.h>
22ac252f95SDilan Lee #include <mce_private.h>
233ff448f9SKalyani Chidambaram Vaidyanathan #include <memctrl.h>
2441612559SVarun Wadekar #include <plat/common/platform.h>
253ff448f9SKalyani Chidambaram Vaidyanathan #include <smmu.h>
26117dbe6cSVarun Wadekar #include <spe.h>
2741612559SVarun Wadekar #include <tegra_def.h>
2841612559SVarun Wadekar #include <tegra_platform.h>
2941612559SVarun Wadekar #include <tegra_private.h>
3041612559SVarun Wadekar #include <lib/xlat_tables/xlat_tables_v2.h>
3141612559SVarun Wadekar 
32117dbe6cSVarun Wadekar /* ID for spe-console */
33117dbe6cSVarun Wadekar #define TEGRA_CONSOLE_SPE_ID		0xFE
34117dbe6cSVarun Wadekar 
3541612559SVarun Wadekar /*******************************************************************************
3622e4f948SKalyani Chidambaram Vaidyanathan  * Structure to store the SCR addresses and its expected settings.
3722e4f948SKalyani Chidambaram Vaidyanathan  *******************************************************************************
3822e4f948SKalyani Chidambaram Vaidyanathan  */
3922e4f948SKalyani Chidambaram Vaidyanathan typedef struct {
4022e4f948SKalyani Chidambaram Vaidyanathan 	uint32_t scr_addr;
4122e4f948SKalyani Chidambaram Vaidyanathan 	uint32_t scr_val;
4222e4f948SKalyani Chidambaram Vaidyanathan } scr_settings_t;
4322e4f948SKalyani Chidambaram Vaidyanathan 
4422e4f948SKalyani Chidambaram Vaidyanathan static const scr_settings_t t194_scr_settings[] = {
4522e4f948SKalyani Chidambaram Vaidyanathan 	{ SCRATCH_RSV68_SCR, SCRATCH_RSV68_SCR_VAL },
4622e4f948SKalyani Chidambaram Vaidyanathan 	{ SCRATCH_RSV71_SCR, SCRATCH_RSV71_SCR_VAL },
4722e4f948SKalyani Chidambaram Vaidyanathan 	{ SCRATCH_RSV72_SCR, SCRATCH_RSV72_SCR_VAL },
4822e4f948SKalyani Chidambaram Vaidyanathan 	{ SCRATCH_RSV75_SCR, SCRATCH_RSV75_SCR_VAL },
4922e4f948SKalyani Chidambaram Vaidyanathan 	{ SCRATCH_RSV81_SCR, SCRATCH_RSV81_SCR_VAL },
5022e4f948SKalyani Chidambaram Vaidyanathan 	{ SCRATCH_RSV97_SCR, SCRATCH_RSV97_SCR_VAL },
5122e4f948SKalyani Chidambaram Vaidyanathan 	{ SCRATCH_RSV99_SCR, SCRATCH_RSV99_SCR_VAL },
5222e4f948SKalyani Chidambaram Vaidyanathan 	{ SCRATCH_RSV109_SCR, SCRATCH_RSV109_SCR_VAL },
5322e4f948SKalyani Chidambaram Vaidyanathan 	{ MISCREG_SCR_SCRTZWELCK, MISCREG_SCR_SCRTZWELCK_VAL }
5422e4f948SKalyani Chidambaram Vaidyanathan };
5522e4f948SKalyani Chidambaram Vaidyanathan 
5622e4f948SKalyani Chidambaram Vaidyanathan /*******************************************************************************
5741612559SVarun Wadekar  * The Tegra power domain tree has a single system level power domain i.e. a
5841612559SVarun Wadekar  * single root node. The first entry in the power domain descriptor specifies
5941612559SVarun Wadekar  * the number of power domains at the highest power level.
6041612559SVarun Wadekar  *******************************************************************************
6141612559SVarun Wadekar  */
62b6533b56SAnthony Zhou static const uint8_t tegra_power_domain_tree_desc[] = {
6341612559SVarun Wadekar 	/* No of root nodes */
6441612559SVarun Wadekar 	1,
6541612559SVarun Wadekar 	/* No of clusters */
6641612559SVarun Wadekar 	PLATFORM_CLUSTER_COUNT,
6741612559SVarun Wadekar 	/* No of CPU cores - cluster0 */
6841612559SVarun Wadekar 	PLATFORM_MAX_CPUS_PER_CLUSTER,
6941612559SVarun Wadekar 	/* No of CPU cores - cluster1 */
701e6a7f91SVarun Wadekar 	PLATFORM_MAX_CPUS_PER_CLUSTER,
711e6a7f91SVarun Wadekar 	/* No of CPU cores - cluster2 */
721e6a7f91SVarun Wadekar 	PLATFORM_MAX_CPUS_PER_CLUSTER,
731e6a7f91SVarun Wadekar 	/* No of CPU cores - cluster3 */
7441612559SVarun Wadekar 	PLATFORM_MAX_CPUS_PER_CLUSTER
7541612559SVarun Wadekar };
7641612559SVarun Wadekar 
7742de0384SVarun Wadekar /*******************************************************************************
7842de0384SVarun Wadekar  * This function returns the Tegra default topology tree information.
7942de0384SVarun Wadekar  ******************************************************************************/
plat_get_power_domain_tree_desc(void)80b6533b56SAnthony Zhou const uint8_t *plat_get_power_domain_tree_desc(void)
8142de0384SVarun Wadekar {
8242de0384SVarun Wadekar 	return tegra_power_domain_tree_desc;
8342de0384SVarun Wadekar }
8442de0384SVarun Wadekar 
8541612559SVarun Wadekar /*
8641612559SVarun Wadekar  * Table of regions to map using the MMU.
8741612559SVarun Wadekar  */
8841612559SVarun Wadekar static const mmap_region_t tegra_mmap[] = {
89ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_MISC_BASE, 0x4000U, /* 16KB */
90b6533b56SAnthony Zhou 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
914a9026d4SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_GPCDMA_BASE, 0x10000U, /* 64KB */
924a9026d4SVarun Wadekar 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
93ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_MC_STREAMID_BASE, 0x8000U, /* 32KB */
94b6533b56SAnthony Zhou 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
95ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_MC_BASE, 0x8000U, /* 32KB */
96b6533b56SAnthony Zhou 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
97117dbe6cSVarun Wadekar #if !ENABLE_CONSOLE_SPE
98b6533b56SAnthony Zhou 	MAP_REGION_FLAT(TEGRA_UARTA_BASE, 0x20000U, /* 128KB - UART A, B*/
99b6533b56SAnthony Zhou 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
100b6533b56SAnthony Zhou 	MAP_REGION_FLAT(TEGRA_UARTC_BASE, 0x20000U, /* 128KB - UART C, G */
101b6533b56SAnthony Zhou 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
102b6533b56SAnthony Zhou 	MAP_REGION_FLAT(TEGRA_UARTD_BASE, 0x30000U, /* 192KB - UART D, E, F */
103b6533b56SAnthony Zhou 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
104117dbe6cSVarun Wadekar #endif
105ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_XUSB_PADCTL_BASE, 0x2000U, /* 8KB */
106b6533b56SAnthony Zhou 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
107ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_GICD_BASE, 0x1000, /* 4KB */
108b6533b56SAnthony Zhou 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
109ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_GICC_BASE, 0x1000, /* 4KB */
110b6533b56SAnthony Zhou 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
111ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_SE0_BASE, 0x1000U, /* 4KB */
112d11f5e05Ssteven kao 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
113ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_PKA1_BASE, 0x1000U, /* 4KB */
114b6533b56SAnthony Zhou 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
115ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_RNG1_BASE, 0x1000U, /* 4KB */
116ceb12020SVarun Wadekar 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
117ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_HSP_DBELL_BASE, 0x1000U, /* 4KB */
118b6533b56SAnthony Zhou 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
119117dbe6cSVarun Wadekar #if ENABLE_CONSOLE_SPE
120ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_CONSOLE_SPE_BASE, 0x1000U, /* 4KB */
121117dbe6cSVarun Wadekar 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
122117dbe6cSVarun Wadekar #endif
123ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_TMRUS_BASE, TEGRA_TMRUS_SIZE, /* 4KB */
124ceb12020SVarun Wadekar 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
125ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_SCRATCH_BASE, 0x1000U, /* 4KB */
126ceb12020SVarun Wadekar 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
127ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_SMMU2_BASE, 0x800000U, /* 8MB */
128ceb12020SVarun Wadekar 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
129ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_SMMU1_BASE, 0x800000U, /* 8MB */
130ceb12020SVarun Wadekar 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
131ceb12020SVarun Wadekar 	MAP_REGION_FLAT(TEGRA_SMMU0_BASE, 0x800000U, /* 8MB */
132ceb12020SVarun Wadekar 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
133d11f5e05Ssteven kao 	MAP_REGION_FLAT(TEGRA_BPMP_IPC_TX_PHYS_BASE, 0x10000U, /* 64KB */
134d11f5e05Ssteven kao 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
135b6533b56SAnthony Zhou 	MAP_REGION_FLAT(TEGRA_CAR_RESET_BASE, 0x10000U, /* 64KB */
136b6533b56SAnthony Zhou 			(uint8_t)MT_DEVICE | (uint8_t)MT_RW | (uint8_t)MT_SECURE),
13741612559SVarun Wadekar 	{0}
13841612559SVarun Wadekar };
13941612559SVarun Wadekar 
14041612559SVarun Wadekar /*******************************************************************************
14141612559SVarun Wadekar  * Set up the pagetables as per the platform memory map & initialize the MMU
14241612559SVarun Wadekar  ******************************************************************************/
plat_get_mmio_map(void)14341612559SVarun Wadekar const mmap_region_t *plat_get_mmio_map(void)
14441612559SVarun Wadekar {
14541612559SVarun Wadekar 	/* MMIO space */
14641612559SVarun Wadekar 	return tegra_mmap;
14741612559SVarun Wadekar }
14841612559SVarun Wadekar 
14941612559SVarun Wadekar /*******************************************************************************
15041612559SVarun Wadekar  * Handler to get the System Counter Frequency
15141612559SVarun Wadekar  ******************************************************************************/
plat_get_syscnt_freq2(void)152b6533b56SAnthony Zhou uint32_t plat_get_syscnt_freq2(void)
15341612559SVarun Wadekar {
15441612559SVarun Wadekar 	return 31250000;
15541612559SVarun Wadekar }
15641612559SVarun Wadekar 
157117dbe6cSVarun Wadekar #if !ENABLE_CONSOLE_SPE
15841612559SVarun Wadekar /*******************************************************************************
15941612559SVarun Wadekar  * Maximum supported UART controllers
16041612559SVarun Wadekar  ******************************************************************************/
1611c62509eSVarun Wadekar #define TEGRA194_MAX_UART_PORTS		7
16241612559SVarun Wadekar 
16341612559SVarun Wadekar /*******************************************************************************
16441612559SVarun Wadekar  * This variable holds the UART port base addresses
16541612559SVarun Wadekar  ******************************************************************************/
1661c62509eSVarun Wadekar static uint32_t tegra194_uart_addresses[TEGRA194_MAX_UART_PORTS + 1] = {
16741612559SVarun Wadekar 	0,	/* undefined - treated as an error case */
16841612559SVarun Wadekar 	TEGRA_UARTA_BASE,
16941612559SVarun Wadekar 	TEGRA_UARTB_BASE,
17041612559SVarun Wadekar 	TEGRA_UARTC_BASE,
17141612559SVarun Wadekar 	TEGRA_UARTD_BASE,
17241612559SVarun Wadekar 	TEGRA_UARTE_BASE,
17341612559SVarun Wadekar 	TEGRA_UARTF_BASE,
174b6533b56SAnthony Zhou 	TEGRA_UARTG_BASE
17541612559SVarun Wadekar };
176117dbe6cSVarun Wadekar #endif
17741612559SVarun Wadekar 
17841612559SVarun Wadekar /*******************************************************************************
179117dbe6cSVarun Wadekar  * Enable console corresponding to the console ID
18041612559SVarun Wadekar  ******************************************************************************/
plat_enable_console(int32_t id)181117dbe6cSVarun Wadekar void plat_enable_console(int32_t id)
18241612559SVarun Wadekar {
183117dbe6cSVarun Wadekar 	uint32_t console_clock = 0U;
18441612559SVarun Wadekar 
185117dbe6cSVarun Wadekar #if ENABLE_CONSOLE_SPE
1867b8fe2deSAndre Przywara 	static console_t spe_console;
187117dbe6cSVarun Wadekar 
188117dbe6cSVarun Wadekar 	if (id == TEGRA_CONSOLE_SPE_ID) {
189117dbe6cSVarun Wadekar 		(void)console_spe_register(TEGRA_CONSOLE_SPE_BASE,
190117dbe6cSVarun Wadekar 					   console_clock,
191117dbe6cSVarun Wadekar 					   TEGRA_CONSOLE_BAUDRATE,
192117dbe6cSVarun Wadekar 					   &spe_console);
1939536a25eSAndre Przywara 		console_set_scope(&spe_console, CONSOLE_FLAG_BOOT |
194117dbe6cSVarun Wadekar 			CONSOLE_FLAG_RUNTIME | CONSOLE_FLAG_CRASH);
195117dbe6cSVarun Wadekar 	}
196117dbe6cSVarun Wadekar #else
19798964f05SAndre Przywara 	static console_t uart_console;
198117dbe6cSVarun Wadekar 
199117dbe6cSVarun Wadekar 	if ((id > 0) && (id < TEGRA194_MAX_UART_PORTS)) {
200117dbe6cSVarun Wadekar 		/*
201117dbe6cSVarun Wadekar 		 * Reference clock used by the FPGAs is a lot slower.
202117dbe6cSVarun Wadekar 		 */
203117dbe6cSVarun Wadekar 		if (tegra_platform_is_fpga()) {
204117dbe6cSVarun Wadekar 			console_clock = TEGRA_BOOT_UART_CLK_13_MHZ;
205b6533b56SAnthony Zhou 		} else {
206117dbe6cSVarun Wadekar 			console_clock = TEGRA_BOOT_UART_CLK_408_MHZ;
207b6533b56SAnthony Zhou 		}
208b6533b56SAnthony Zhou 
209117dbe6cSVarun Wadekar 		(void)console_16550_register(tegra194_uart_addresses[id],
210117dbe6cSVarun Wadekar 					     console_clock,
211117dbe6cSVarun Wadekar 					     TEGRA_CONSOLE_BAUDRATE,
212117dbe6cSVarun Wadekar 					     &uart_console);
2139536a25eSAndre Przywara 		console_set_scope(&uart_console, CONSOLE_FLAG_BOOT |
214117dbe6cSVarun Wadekar 			CONSOLE_FLAG_RUNTIME | CONSOLE_FLAG_CRASH);
215117dbe6cSVarun Wadekar 	}
216117dbe6cSVarun Wadekar #endif
21741612559SVarun Wadekar }
21841612559SVarun Wadekar 
21941612559SVarun Wadekar /*******************************************************************************
22022e4f948SKalyani Chidambaram Vaidyanathan  * Verify SCR settings
22122e4f948SKalyani Chidambaram Vaidyanathan  ******************************************************************************/
tegra194_is_scr_valid(void)22222e4f948SKalyani Chidambaram Vaidyanathan static inline bool tegra194_is_scr_valid(void)
22322e4f948SKalyani Chidambaram Vaidyanathan {
22422e4f948SKalyani Chidambaram Vaidyanathan 	uint32_t scr_val;
22522e4f948SKalyani Chidambaram Vaidyanathan 	bool ret = true;
22622e4f948SKalyani Chidambaram Vaidyanathan 
22722e4f948SKalyani Chidambaram Vaidyanathan 	for (uint8_t i = 0U; i < ARRAY_SIZE(t194_scr_settings); i++) {
22822e4f948SKalyani Chidambaram Vaidyanathan 		scr_val = mmio_read_32((uintptr_t)t194_scr_settings[i].scr_addr);
22922e4f948SKalyani Chidambaram Vaidyanathan 		if (scr_val != t194_scr_settings[i].scr_val) {
23022e4f948SKalyani Chidambaram Vaidyanathan 			ERROR("Mismatch at SCR addr = 0x%x\n", t194_scr_settings[i].scr_addr);
23122e4f948SKalyani Chidambaram Vaidyanathan 			ret = false;
23222e4f948SKalyani Chidambaram Vaidyanathan 		}
23322e4f948SKalyani Chidambaram Vaidyanathan 	}
23422e4f948SKalyani Chidambaram Vaidyanathan 	return ret;
23522e4f948SKalyani Chidambaram Vaidyanathan }
23622e4f948SKalyani Chidambaram Vaidyanathan 
23722e4f948SKalyani Chidambaram Vaidyanathan /*******************************************************************************
23841612559SVarun Wadekar  * Handler for early platform setup
23941612559SVarun Wadekar  ******************************************************************************/
plat_early_platform_setup(void)24041612559SVarun Wadekar void plat_early_platform_setup(void)
24141612559SVarun Wadekar {
242d55b8f6aSKalyani Chidambaram 	const plat_params_from_bl2_t *params_from_bl2 = bl31_get_plat_params();
243d55b8f6aSKalyani Chidambaram 	uint8_t enable_ccplex_lock_step = params_from_bl2->enable_ccplex_lock_step;
244d55b8f6aSKalyani Chidambaram 	uint64_t actlr_elx;
245d55b8f6aSKalyani Chidambaram 
246fbcd053cSkalyanic 	/* Verify chip id is t194 */
247fbcd053cSkalyanic 	assert(tegra_chipid_is_t194());
248fbcd053cSkalyanic 
24922e4f948SKalyani Chidambaram Vaidyanathan 	/* Verify SCR settings */
25022e4f948SKalyani Chidambaram Vaidyanathan 	if (tegra_platform_is_silicon()) {
25122e4f948SKalyani Chidambaram Vaidyanathan 		assert(tegra194_is_scr_valid());
25222e4f948SKalyani Chidambaram Vaidyanathan 	}
25322e4f948SKalyani Chidambaram Vaidyanathan 
25441612559SVarun Wadekar 	/* sanity check MCE firmware compatibility */
25541612559SVarun Wadekar 	mce_verify_firmware_version();
25641612559SVarun Wadekar 
257*f87e54f7SManish Pandey #if ENABLE_FEAT_RAS
2588ca61538SDavid Pu 	/* Enable Uncorrectable RAS error */
2598ca61538SDavid Pu 	tegra194_ras_enable();
2608ca61538SDavid Pu #endif
2618ca61538SDavid Pu 
26226c1a1e7SVarun Wadekar 	/*
26326c1a1e7SVarun Wadekar 	 * Program XUSB STREAMIDs
26426c1a1e7SVarun Wadekar 	 * ======================
26526c1a1e7SVarun Wadekar 	 * T19x XUSB has support for XUSB virtualization. It will have one
266bc019041SAjay Gupta 	 * physical function (PF) and four Virtual function (VF)
267bc019041SAjay Gupta 	 *
268bc019041SAjay Gupta 	 * There were below two SIDs for XUSB until T186.
269bc019041SAjay Gupta 	 * 1) #define TEGRA_SID_XUSB_HOST    0x1bU
270bc019041SAjay Gupta 	 * 2) #define TEGRA_SID_XUSB_DEV    0x1cU
271bc019041SAjay Gupta 	 *
272bc019041SAjay Gupta 	 * We have below four new SIDs added for VF(s)
273bc019041SAjay Gupta 	 * 3) #define TEGRA_SID_XUSB_VF0    0x5dU
274bc019041SAjay Gupta 	 * 4) #define TEGRA_SID_XUSB_VF1    0x5eU
275bc019041SAjay Gupta 	 * 5) #define TEGRA_SID_XUSB_VF2    0x5fU
276bc019041SAjay Gupta 	 * 6) #define TEGRA_SID_XUSB_VF3    0x60U
277bc019041SAjay Gupta 	 *
278bc019041SAjay Gupta 	 * When virtualization is enabled then we have to disable SID override
279bc019041SAjay Gupta 	 * and program above SIDs in below newly added SID registers in XUSB
280bc019041SAjay Gupta 	 * PADCTL MMIO space. These registers are TZ protected and so need to
281bc019041SAjay Gupta 	 * be done in ATF.
282bc019041SAjay Gupta 	 * a) #define XUSB_PADCTL_HOST_AXI_STREAMID_PF_0 (0x136cU)
283bc019041SAjay Gupta 	 * b) #define XUSB_PADCTL_DEV_AXI_STREAMID_PF_0  (0x139cU)
284bc019041SAjay Gupta 	 * c) #define XUSB_PADCTL_HOST_AXI_STREAMID_VF_0 (0x1370U)
285bc019041SAjay Gupta 	 * d) #define XUSB_PADCTL_HOST_AXI_STREAMID_VF_1 (0x1374U)
286bc019041SAjay Gupta 	 * e) #define XUSB_PADCTL_HOST_AXI_STREAMID_VF_2 (0x1378U)
287bc019041SAjay Gupta 	 * f) #define XUSB_PADCTL_HOST_AXI_STREAMID_VF_3 (0x137cU)
288bc019041SAjay Gupta 	 *
289bc019041SAjay Gupta 	 * This change disables SID override and programs XUSB SIDs in
29026c1a1e7SVarun Wadekar 	 * above registers to support both virtualization and
29126c1a1e7SVarun Wadekar 	 * non-virtualization platforms
292bc019041SAjay Gupta 	 */
293db891f32SVarun Wadekar 	if (tegra_platform_is_silicon() || tegra_platform_is_fpga()) {
294db891f32SVarun Wadekar 
295bc019041SAjay Gupta 		mmio_write_32(TEGRA_XUSB_PADCTL_BASE +
296bc019041SAjay Gupta 			XUSB_PADCTL_HOST_AXI_STREAMID_PF_0, TEGRA_SID_XUSB_HOST);
2972561cb50SAnthony Zhou 		assert(mmio_read_32(TEGRA_XUSB_PADCTL_BASE +
2982561cb50SAnthony Zhou 			XUSB_PADCTL_HOST_AXI_STREAMID_PF_0) == TEGRA_SID_XUSB_HOST);
299bc019041SAjay Gupta 		mmio_write_32(TEGRA_XUSB_PADCTL_BASE +
300bc019041SAjay Gupta 			XUSB_PADCTL_HOST_AXI_STREAMID_VF_0, TEGRA_SID_XUSB_VF0);
3012561cb50SAnthony Zhou 		assert(mmio_read_32(TEGRA_XUSB_PADCTL_BASE +
3022561cb50SAnthony Zhou 			XUSB_PADCTL_HOST_AXI_STREAMID_VF_0) == TEGRA_SID_XUSB_VF0);
303bc019041SAjay Gupta 		mmio_write_32(TEGRA_XUSB_PADCTL_BASE +
304bc019041SAjay Gupta 			XUSB_PADCTL_HOST_AXI_STREAMID_VF_1, TEGRA_SID_XUSB_VF1);
3052561cb50SAnthony Zhou 		assert(mmio_read_32(TEGRA_XUSB_PADCTL_BASE +
3062561cb50SAnthony Zhou 			XUSB_PADCTL_HOST_AXI_STREAMID_VF_1) == TEGRA_SID_XUSB_VF1);
307bc019041SAjay Gupta 		mmio_write_32(TEGRA_XUSB_PADCTL_BASE +
308bc019041SAjay Gupta 			XUSB_PADCTL_HOST_AXI_STREAMID_VF_2, TEGRA_SID_XUSB_VF2);
3092561cb50SAnthony Zhou 		assert(mmio_read_32(TEGRA_XUSB_PADCTL_BASE +
3102561cb50SAnthony Zhou 			XUSB_PADCTL_HOST_AXI_STREAMID_VF_2) == TEGRA_SID_XUSB_VF2);
311bc019041SAjay Gupta 		mmio_write_32(TEGRA_XUSB_PADCTL_BASE +
312bc019041SAjay Gupta 			XUSB_PADCTL_HOST_AXI_STREAMID_VF_3, TEGRA_SID_XUSB_VF3);
3132561cb50SAnthony Zhou 		assert(mmio_read_32(TEGRA_XUSB_PADCTL_BASE +
3142561cb50SAnthony Zhou 			XUSB_PADCTL_HOST_AXI_STREAMID_VF_3) == TEGRA_SID_XUSB_VF3);
315bc019041SAjay Gupta 		mmio_write_32(TEGRA_XUSB_PADCTL_BASE +
316bc019041SAjay Gupta 			XUSB_PADCTL_DEV_AXI_STREAMID_PF_0, TEGRA_SID_XUSB_DEV);
3172561cb50SAnthony Zhou 		assert(mmio_read_32(TEGRA_XUSB_PADCTL_BASE +
3182561cb50SAnthony Zhou 			XUSB_PADCTL_DEV_AXI_STREAMID_PF_0) == TEGRA_SID_XUSB_DEV);
31941612559SVarun Wadekar 	}
320d55b8f6aSKalyani Chidambaram 
321d55b8f6aSKalyani Chidambaram 	/*
322d55b8f6aSKalyani Chidambaram 	 * Enable dual execution optimized translations for all ELx.
323d55b8f6aSKalyani Chidambaram 	 */
324d55b8f6aSKalyani Chidambaram 	if (enable_ccplex_lock_step != 0U) {
325d55b8f6aSKalyani Chidambaram 		actlr_elx = read_actlr_el3();
326d55b8f6aSKalyani Chidambaram 		actlr_elx |= DENVER_CPU_ENABLE_DUAL_EXEC_EL3;
327d55b8f6aSKalyani Chidambaram 		write_actlr_el3(actlr_elx);
328e26810aaSKalyani Chidambaram Vaidyanathan 		/* check if the bit is actually set */
329e26810aaSKalyani Chidambaram Vaidyanathan 		assert((read_actlr_el3() & DENVER_CPU_ENABLE_DUAL_EXEC_EL3) != 0ULL);
330d55b8f6aSKalyani Chidambaram 
331d55b8f6aSKalyani Chidambaram 		actlr_elx = read_actlr_el2();
332d55b8f6aSKalyani Chidambaram 		actlr_elx |= DENVER_CPU_ENABLE_DUAL_EXEC_EL2;
333d55b8f6aSKalyani Chidambaram 		write_actlr_el2(actlr_elx);
334e26810aaSKalyani Chidambaram Vaidyanathan 		/* check if the bit is actually set */
335e26810aaSKalyani Chidambaram Vaidyanathan 		assert((read_actlr_el2() & DENVER_CPU_ENABLE_DUAL_EXEC_EL2) != 0ULL);
336d55b8f6aSKalyani Chidambaram 
337d55b8f6aSKalyani Chidambaram 		actlr_elx = read_actlr_el1();
338d55b8f6aSKalyani Chidambaram 		actlr_elx |= DENVER_CPU_ENABLE_DUAL_EXEC_EL1;
339d55b8f6aSKalyani Chidambaram 		write_actlr_el1(actlr_elx);
340e26810aaSKalyani Chidambaram Vaidyanathan 		/* check if the bit is actually set */
341e26810aaSKalyani Chidambaram Vaidyanathan 		assert((read_actlr_el1() & DENVER_CPU_ENABLE_DUAL_EXEC_EL1) != 0ULL);
342d55b8f6aSKalyani Chidambaram 	}
343db891f32SVarun Wadekar }
34441612559SVarun Wadekar 
3451c62509eSVarun Wadekar /* Secure IRQs for Tegra194 */
3461c62509eSVarun Wadekar static const interrupt_prop_t tegra194_interrupt_props[] = {
347d886628dSVarun Wadekar 	INTR_PROP_DESC(TEGRA_SDEI_SGI_PRIVATE, PLAT_SDEI_CRITICAL_PRI,
348d886628dSVarun Wadekar 			GICV2_INTR_GROUP0, GIC_INTR_CFG_EDGE),
349adb20a17SVarun Wadekar 	INTR_PROP_DESC(TEGRA194_TOP_WDT_IRQ, PLAT_TEGRA_WDT_PRIO,
3501c62509eSVarun Wadekar 			GICV2_INTR_GROUP0, GIC_INTR_CFG_EDGE)
35141612559SVarun Wadekar };
35241612559SVarun Wadekar 
35341612559SVarun Wadekar /*******************************************************************************
35441612559SVarun Wadekar  * Initialize the GIC and SGIs
35541612559SVarun Wadekar  ******************************************************************************/
plat_gic_setup(void)35641612559SVarun Wadekar void plat_gic_setup(void)
35741612559SVarun Wadekar {
3581c62509eSVarun Wadekar 	tegra_gic_setup(tegra194_interrupt_props, ARRAY_SIZE(tegra194_interrupt_props));
3591c62509eSVarun Wadekar 	tegra_gic_init();
36041612559SVarun Wadekar 
36141612559SVarun Wadekar 	/*
3621c62509eSVarun Wadekar 	 * Initialize the FIQ handler
36341612559SVarun Wadekar 	 */
36441612559SVarun Wadekar 	tegra_fiq_handler_setup();
36541612559SVarun Wadekar }
36641612559SVarun Wadekar 
36741612559SVarun Wadekar /*******************************************************************************
36841612559SVarun Wadekar  * Return pointer to the BL31 params from previous bootloader
36941612559SVarun Wadekar  ******************************************************************************/
plat_get_bl31_params(void)37041612559SVarun Wadekar struct tegra_bl31_params *plat_get_bl31_params(void)
37141612559SVarun Wadekar {
37233a8ba6aSSteven Kao 	uint64_t val;
37341612559SVarun Wadekar 
37433a8ba6aSSteven Kao 	val = (mmio_read_32(TEGRA_SCRATCH_BASE + SCRATCH_BL31_PARAMS_HI_ADDR) &
37533a8ba6aSSteven Kao 		SCRATCH_BL31_PARAMS_HI_ADDR_MASK) >> SCRATCH_BL31_PARAMS_HI_ADDR_SHIFT;
37633a8ba6aSSteven Kao 	val <<= 32;
37733a8ba6aSSteven Kao 	val |= mmio_read_32(TEGRA_SCRATCH_BASE + SCRATCH_BL31_PARAMS_LO_ADDR);
37841612559SVarun Wadekar 
37941612559SVarun Wadekar 	return (struct tegra_bl31_params *)(uintptr_t)val;
38041612559SVarun Wadekar }
38141612559SVarun Wadekar 
38241612559SVarun Wadekar /*******************************************************************************
38341612559SVarun Wadekar  * Return pointer to the BL31 platform params from previous bootloader
38441612559SVarun Wadekar  ******************************************************************************/
plat_get_bl31_plat_params(void)38541612559SVarun Wadekar plat_params_from_bl2_t *plat_get_bl31_plat_params(void)
38641612559SVarun Wadekar {
38733a8ba6aSSteven Kao 	uint64_t val;
38841612559SVarun Wadekar 
38933a8ba6aSSteven Kao 	val = (mmio_read_32(TEGRA_SCRATCH_BASE + SCRATCH_BL31_PLAT_PARAMS_HI_ADDR) &
39033a8ba6aSSteven Kao 		SCRATCH_BL31_PLAT_PARAMS_HI_ADDR_MASK) >> SCRATCH_BL31_PLAT_PARAMS_HI_ADDR_SHIFT;
39133a8ba6aSSteven Kao 	val <<= 32;
39233a8ba6aSSteven Kao 	val |= mmio_read_32(TEGRA_SCRATCH_BASE + SCRATCH_BL31_PLAT_PARAMS_LO_ADDR);
39341612559SVarun Wadekar 
39441612559SVarun Wadekar 	return (plat_params_from_bl2_t *)(uintptr_t)val;
39541612559SVarun Wadekar }
396ac252f95SDilan Lee 
3975d52aea8SVarun Wadekar /*******************************************************************************
3985d52aea8SVarun Wadekar  * Handler for late platform setup
3995d52aea8SVarun Wadekar  ******************************************************************************/
plat_late_platform_setup(void)400ac252f95SDilan Lee void plat_late_platform_setup(void)
401ac252f95SDilan Lee {
402a3c2c0e9SSteven Kao #if ENABLE_STRICT_CHECKING_MODE
403ac252f95SDilan Lee 	/*
404ac252f95SDilan Lee 	 * Enable strict checking after programming the GSC for
405ac252f95SDilan Lee 	 * enabling TZSRAM and TZDRAM
406ac252f95SDilan Lee 	 */
407ac252f95SDilan Lee 	mce_enable_strict_checking();
4085ce05d6bSAnthony Zhou 	mce_verify_strict_checking();
409a3c2c0e9SSteven Kao #endif
410ac252f95SDilan Lee }
4115d52aea8SVarun Wadekar 
4125d52aea8SVarun Wadekar /*******************************************************************************
4135d52aea8SVarun Wadekar  * Handler to indicate support for System Suspend
4145d52aea8SVarun Wadekar  ******************************************************************************/
plat_supports_system_suspend(void)4155d52aea8SVarun Wadekar bool plat_supports_system_suspend(void)
4165d52aea8SVarun Wadekar {
4175d52aea8SVarun Wadekar 	return true;
4185d52aea8SVarun Wadekar }
4193ff448f9SKalyani Chidambaram Vaidyanathan 
4203ff448f9SKalyani Chidambaram Vaidyanathan /*******************************************************************************
4213ff448f9SKalyani Chidambaram Vaidyanathan  * Platform specific runtime setup.
4223ff448f9SKalyani Chidambaram Vaidyanathan  ******************************************************************************/
plat_runtime_setup(void)4233ff448f9SKalyani Chidambaram Vaidyanathan void plat_runtime_setup(void)
4243ff448f9SKalyani Chidambaram Vaidyanathan {
4253ff448f9SKalyani Chidambaram Vaidyanathan 	/*
4263ff448f9SKalyani Chidambaram Vaidyanathan 	 * During cold boot, it is observed that the arbitration
4273ff448f9SKalyani Chidambaram Vaidyanathan 	 * bit is set in the Memory controller leading to false
4283ff448f9SKalyani Chidambaram Vaidyanathan 	 * error interrupts in the non-secure world. To avoid
4293ff448f9SKalyani Chidambaram Vaidyanathan 	 * this, clean the interrupt status register before
4303ff448f9SKalyani Chidambaram Vaidyanathan 	 * booting into the non-secure world
4313ff448f9SKalyani Chidambaram Vaidyanathan 	 */
4323ff448f9SKalyani Chidambaram Vaidyanathan 	tegra_memctrl_clear_pending_interrupts();
4333ff448f9SKalyani Chidambaram Vaidyanathan 
4343ff448f9SKalyani Chidambaram Vaidyanathan 	/*
4353ff448f9SKalyani Chidambaram Vaidyanathan 	 * During boot, USB3 and flash media (SDMMC/SATA) devices need
4363ff448f9SKalyani Chidambaram Vaidyanathan 	 * access to IRAM. Because these clients connect to the MC and
4373ff448f9SKalyani Chidambaram Vaidyanathan 	 * do not have a direct path to the IRAM, the MC implements AHB
4383ff448f9SKalyani Chidambaram Vaidyanathan 	 * redirection during boot to allow path to IRAM. In this mode
4393ff448f9SKalyani Chidambaram Vaidyanathan 	 * accesses to a programmed memory address aperture are directed
4403ff448f9SKalyani Chidambaram Vaidyanathan 	 * to the AHB bus, allowing access to the IRAM. This mode must be
4413ff448f9SKalyani Chidambaram Vaidyanathan 	 * disabled before we jump to the non-secure world.
4423ff448f9SKalyani Chidambaram Vaidyanathan 	 */
4433ff448f9SKalyani Chidambaram Vaidyanathan 	tegra_memctrl_disable_ahb_redirection();
4443ff448f9SKalyani Chidambaram Vaidyanathan 
4453ff448f9SKalyani Chidambaram Vaidyanathan 	/*
4463ff448f9SKalyani Chidambaram Vaidyanathan 	 * Verify the integrity of the previously configured SMMU(s) settings
4473ff448f9SKalyani Chidambaram Vaidyanathan 	 */
4483ff448f9SKalyani Chidambaram Vaidyanathan 	tegra_smmu_verify();
4493ff448f9SKalyani Chidambaram Vaidyanathan }
450