2 * (C) Copyright 2010-2015
3 * NVIDIA Corporation <www.nvidia.com>
5 * SPDX-License-Identifier: GPL-2.0+
11 #include <asm/arch/clock.h>
12 #include <asm/arch/funcmux.h>
13 #include <asm/arch/mc.h>
14 #include <asm/arch/tegra.h>
15 #include <asm/arch-tegra/ap.h>
16 #include <asm/arch-tegra/board.h>
17 #include <asm/arch-tegra/pmc.h>
18 #include <asm/arch-tegra/sys_proto.h>
19 #include <asm/arch-tegra/warmboot.h>
21 void save_boot_params_ret(void);
23 DECLARE_GLOBAL_DATA_PTR
;
26 /* UARTs which we can enable */
35 static bool from_spl
__attribute__ ((section(".data")));
37 #ifndef CONFIG_SPL_BUILD
38 void save_boot_params(u32 r0
, u32 r1
, u32 r2
, u32 r3
)
40 from_spl
= r0
!= UBOOT_NOT_LOADED_FROM_SPL
;
41 save_boot_params_ret();
45 bool spl_was_boot_source(void)
50 #if defined(CONFIG_TEGRA_SUPPORT_NON_SECURE)
51 #if !defined(CONFIG_TEGRA124)
52 #error tegra_cpu_is_non_secure has only been validated on Tegra124
54 bool tegra_cpu_is_non_secure(void)
57 * This register reads 0xffffffff in non-secure mode. This register
58 * only implements bits 31:20, so the lower bits will always read 0 in
59 * secure mode. Thus, the lower bits are an indicator for secure vs.
62 struct mc_ctlr
*mc
= (struct mc_ctlr
*)NV_PA_MC_BASE
;
63 uint32_t mc_s_cfg0
= readl(&mc
->mc_security_cfg0
);
64 return (mc_s_cfg0
& 1) == 1;
68 /* Read the RAM size directly from the memory controller */
69 unsigned int query_sdram_size(void)
71 struct mc_ctlr
*const mc
= (struct mc_ctlr
*)NV_PA_MC_BASE
;
72 u32 emem_cfg
, size_bytes
;
74 emem_cfg
= readl(&mc
->mc_emem_cfg
);
75 #if defined(CONFIG_TEGRA20)
76 debug("mc->mc_emem_cfg (MEM_SIZE_KB) = 0x%08x\n", emem_cfg
);
77 size_bytes
= get_ram_size((void *)PHYS_SDRAM_1
, emem_cfg
* 1024);
79 debug("mc->mc_emem_cfg (MEM_SIZE_MB) = 0x%08x\n", emem_cfg
);
81 * If >=4GB RAM is present, the byte RAM size won't fit into 32-bits
82 * and will wrap. Clip the reported size to the maximum that a 32-bit
83 * variable can represent (rounded to a page).
85 if (emem_cfg
>= 4096) {
86 size_bytes
= U32_MAX
& ~(0x1000 - 1);
88 /* RAM size EMC is programmed to. */
89 size_bytes
= emem_cfg
* 1024 * 1024;
91 * If all RAM fits within 32-bits, it can be accessed without
92 * LPAE, so go test the RAM size. Otherwise, we can't access
93 * all the RAM, and get_ram_size() would get confused, so
94 * avoid using it. There's no reason we should need this
95 * validation step anyway.
97 if (emem_cfg
<= (0 - PHYS_SDRAM_1
) / (1024 * 1024))
98 size_bytes
= get_ram_size((void *)PHYS_SDRAM_1
,
103 #if defined(CONFIG_TEGRA30) || defined(CONFIG_TEGRA114)
104 /* External memory limited to 2047 MB due to IROM/HI-VEC */
105 if (size_bytes
== SZ_2G
)
114 /* We do not initialise DRAM here. We just query the size */
115 gd
->ram_size
= query_sdram_size();
119 static int uart_configs
[] = {
120 #if defined(CONFIG_TEGRA20)
121 #if defined(CONFIG_TEGRA_UARTA_UAA_UAB)
122 FUNCMUX_UART1_UAA_UAB
,
123 #elif defined(CONFIG_TEGRA_UARTA_GPU)
125 #elif defined(CONFIG_TEGRA_UARTA_SDIO1)
128 FUNCMUX_UART1_IRRX_IRTX
,
134 #elif defined(CONFIG_TEGRA30)
135 FUNCMUX_UART1_ULPI
, /* UARTA */
140 #elif defined(CONFIG_TEGRA114)
144 FUNCMUX_UART4_GMI
, /* UARTD */
146 #elif defined(CONFIG_TEGRA124)
147 FUNCMUX_UART1_KBC
, /* UARTA */
150 FUNCMUX_UART4_GPIO
, /* UARTD */
153 FUNCMUX_UART1_UART1
, /* UARTA */
156 FUNCMUX_UART4_UART4
, /* UARTD */
162 * Set up the specified uarts
164 * @param uarts_ids Mask containing UARTs to init (UARTx)
166 static void setup_uarts(int uart_ids
)
168 static enum periph_id id_for_uart
[] = {
177 for (i
= 0; i
< UART_COUNT
; i
++) {
178 if (uart_ids
& (1 << i
)) {
179 enum periph_id id
= id_for_uart
[i
];
181 funcmux_select(id
, uart_configs
[i
]);
182 clock_ll_start_uart(id
);
187 void board_init_uart_f(void)
189 int uart_ids
= 0; /* bit mask of which UART ids to enable */
191 #ifdef CONFIG_TEGRA_ENABLE_UARTA
194 #ifdef CONFIG_TEGRA_ENABLE_UARTB
197 #ifdef CONFIG_TEGRA_ENABLE_UARTC
200 #ifdef CONFIG_TEGRA_ENABLE_UARTD
203 #ifdef CONFIG_TEGRA_ENABLE_UARTE
206 setup_uarts(uart_ids
);
209 #if !defined(CONFIG_SYS_DCACHE_OFF) && !defined(CONFIG_ARM64)
210 void enable_caches(void)
212 /* Enable D-cache. I-cache is already enabled in start.S */