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