blob: f7b134d15f82c30e8a6fc20df753c9dc4efd2e47 [file] [log] [blame]
Varun Wadekar0f3baa02015-07-16 11:36:33 +05301/*
Varun Wadekar84a775e2019-01-03 10:12:55 -08002 * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
Varun Wadekar7cf57d72018-05-17 09:36:38 -07003 * Copyright (c) 2020, NVIDIA Corporation. All rights reserved.
Varun Wadekar0f3baa02015-07-16 11:36:33 +05304 *
dp-armfa3cf0b2017-05-03 09:38:09 +01005 * SPDX-License-Identifier: BSD-3-Clause
Varun Wadekar0f3baa02015-07-16 11:36:33 +05306 */
7
Varun Wadekarb7b45752015-12-28 14:55:41 -08008#include <arch_helpers.h>
kalyanic0a2cc612019-09-13 14:49:39 -07009#include <assert.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000010#include <common/bl_common.h>
Varun Wadekar9d15f7e2019-08-21 14:01:31 -070011#include <drivers/console.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000012#include <lib/xlat_tables/xlat_tables_v2.h>
Ambroise Vincentffbf32a2019-03-28 09:01:18 +000013#include <plat/common/platform.h>
Varun Wadekar0f3baa02015-07-16 11:36:33 +053014#include <tegra_def.h>
Varun Wadekar9d15f7e2019-08-21 14:01:31 -070015#include <tegra_platform.h>
Varun Wadekarb7b45752015-12-28 14:55:41 -080016#include <tegra_private.h>
Varun Wadekar0f3baa02015-07-16 11:36:33 +053017
Varun Wadekar0f3baa02015-07-16 11:36:33 +053018/* sets of MMIO ranges setup */
19#define MMIO_RANGE_0_ADDR 0x50000000
20#define MMIO_RANGE_1_ADDR 0x60000000
21#define MMIO_RANGE_2_ADDR 0x70000000
22#define MMIO_RANGE_SIZE 0x200000
23
24/*
25 * Table of regions to map using the MMU.
26 */
27static const mmap_region_t tegra_mmap[] = {
28 MAP_REGION_FLAT(MMIO_RANGE_0_ADDR, MMIO_RANGE_SIZE,
29 MT_DEVICE | MT_RW | MT_SECURE),
30 MAP_REGION_FLAT(MMIO_RANGE_1_ADDR, MMIO_RANGE_SIZE,
31 MT_DEVICE | MT_RW | MT_SECURE),
32 MAP_REGION_FLAT(MMIO_RANGE_2_ADDR, MMIO_RANGE_SIZE,
33 MT_DEVICE | MT_RW | MT_SECURE),
34 {0}
35};
36
37/*******************************************************************************
38 * Set up the pagetables as per the platform memory map & initialize the MMU
39 ******************************************************************************/
40const mmap_region_t *plat_get_mmio_map(void)
41{
42 /* MMIO space */
43 return tegra_mmap;
44}
45
Varun Wadekare34bc3d2017-04-28 08:43:33 -070046/*******************************************************************************
47 * The Tegra power domain tree has a single system level power domain i.e. a
48 * single root node. The first entry in the power domain descriptor specifies
49 * the number of power domains at the highest power level.
50 *******************************************************************************
51 */
52const unsigned char tegra_power_domain_tree_desc[] = {
53 /* No of root nodes */
54 1,
55 /* No of clusters */
56 PLATFORM_CLUSTER_COUNT,
57 /* No of CPU cores */
58 PLATFORM_CORE_COUNT,
59};
60
61/*******************************************************************************
62 * This function returns the Tegra default topology tree information.
63 ******************************************************************************/
64const unsigned char *plat_get_power_domain_tree_desc(void)
65{
66 return tegra_power_domain_tree_desc;
67}
68
Antonio Nino Diaze82e29c2016-05-19 10:00:28 +010069unsigned int plat_get_syscnt_freq2(void)
Varun Wadekar0f3baa02015-07-16 11:36:33 +053070{
71 return 12000000;
72}
Varun Wadekard2014c62015-10-29 10:37:28 +053073
74/*******************************************************************************
75 * Maximum supported UART controllers
76 ******************************************************************************/
77#define TEGRA132_MAX_UART_PORTS 5
78
79/*******************************************************************************
80 * This variable holds the UART port base addresses
81 ******************************************************************************/
82static uint32_t tegra132_uart_addresses[TEGRA132_MAX_UART_PORTS + 1] = {
83 0, /* undefined - treated as an error case */
84 TEGRA_UARTA_BASE,
85 TEGRA_UARTB_BASE,
86 TEGRA_UARTC_BASE,
87 TEGRA_UARTD_BASE,
88 TEGRA_UARTE_BASE,
89};
90
91/*******************************************************************************
Varun Wadekar9d15f7e2019-08-21 14:01:31 -070092 * Enable console corresponding to the console ID
Varun Wadekard2014c62015-10-29 10:37:28 +053093 ******************************************************************************/
Varun Wadekar9d15f7e2019-08-21 14:01:31 -070094void plat_enable_console(int32_t id)
Varun Wadekard2014c62015-10-29 10:37:28 +053095{
Andre Przywara98b5a112020-01-25 00:58:35 +000096 static console_t uart_console;
Varun Wadekar9d15f7e2019-08-21 14:01:31 -070097 uint32_t console_clock;
98
99 if ((id > 0) && (id < TEGRA132_MAX_UART_PORTS)) {
100 /*
101 * Reference clock used by the FPGAs is a lot slower.
102 */
103 if (tegra_platform_is_fpga()) {
104 console_clock = TEGRA_BOOT_UART_CLK_13_MHZ;
105 } else {
106 console_clock = TEGRA_BOOT_UART_CLK_408_MHZ;
107 }
Varun Wadekard2014c62015-10-29 10:37:28 +0530108
Varun Wadekar9d15f7e2019-08-21 14:01:31 -0700109 (void)console_16550_register(tegra132_uart_addresses[id],
110 console_clock,
111 TEGRA_CONSOLE_BAUDRATE,
112 &uart_console);
Andre Przywara98b5a112020-01-25 00:58:35 +0000113 console_set_scope(&uart_console, CONSOLE_FLAG_BOOT |
Varun Wadekar9d15f7e2019-08-21 14:01:31 -0700114 CONSOLE_FLAG_RUNTIME | CONSOLE_FLAG_CRASH);
115 }
Varun Wadekard2014c62015-10-29 10:37:28 +0530116}
Varun Wadekarb7b45752015-12-28 14:55:41 -0800117
118/*******************************************************************************
119 * Initialize the GIC and SGIs
120 ******************************************************************************/
121void plat_gic_setup(void)
122{
123 tegra_gic_setup(NULL, 0);
Varun Wadekar84a775e2019-01-03 10:12:55 -0800124 tegra_gic_init();
Varun Wadekarb7b45752015-12-28 14:55:41 -0800125}
Varun Wadekar7cf57d72018-05-17 09:36:38 -0700126
127/*******************************************************************************
128 * Return pointer to the BL31 params from previous bootloader
129 ******************************************************************************/
130struct tegra_bl31_params *plat_get_bl31_params(void)
131{
132 return NULL;
133}
134
135/*******************************************************************************
136 * Return pointer to the BL31 platform params from previous bootloader
137 ******************************************************************************/
138plat_params_from_bl2_t *plat_get_bl31_plat_params(void)
139{
140 return NULL;
141}
142
143/*******************************************************************************
144 * Handler for early platform setup
145 ******************************************************************************/
146void plat_early_platform_setup(void)
147{
kalyanic0a2cc612019-09-13 14:49:39 -0700148 /* Verify chip id is t132 */
149 assert(tegra_chipid_is_t132());
Varun Wadekar7cf57d72018-05-17 09:36:38 -0700150}
151
152/*******************************************************************************
153 * Handler for late platform setup
154 ******************************************************************************/
155void plat_late_platform_setup(void)
156{
157 ; /* do nothing */
158}
Varun Wadekar8d7a02b2018-06-26 16:07:50 -0700159
160/*******************************************************************************
161 * Handler to indicate support for System Suspend
162 ******************************************************************************/
163bool plat_supports_system_suspend(void)
164{
165 return true;
166}