1
2
3
4
5
6
7
8#include <common.h>
9#include <dm.h>
10#include <errno.h>
11#include <ns16550.h>
12#include <linux/compiler.h>
13#include <linux/sizes.h>
14#include <asm/io.h>
15#include <asm/arch/clock.h>
16#include <asm/arch/funcmux.h>
17#include <asm/arch/pinmux.h>
18#include <asm/arch/pmu.h>
19#include <asm/arch/tegra.h>
20#include <asm/arch-tegra/ap.h>
21#include <asm/arch-tegra/board.h>
22#include <asm/arch-tegra/clk_rst.h>
23#include <asm/arch-tegra/pmc.h>
24#include <asm/arch-tegra/sys_proto.h>
25#include <asm/arch-tegra/uart.h>
26#include <asm/arch-tegra/warmboot.h>
27#include <asm/arch-tegra/gpu.h>
28#ifdef CONFIG_TEGRA_CLOCK_SCALING
29#include <asm/arch/emc.h>
30#endif
31#include <asm/arch-tegra/usb.h>
32#ifdef CONFIG_USB_EHCI_TEGRA
33#include <usb.h>
34#endif
35#ifdef CONFIG_TEGRA_MMC
36#include <asm/arch-tegra/tegra_mmc.h>
37#include <asm/arch-tegra/mmc.h>
38#endif
39#include <asm/arch-tegra/xusb-padctl.h>
40#include <power/as3722.h>
41#include <i2c.h>
42#include <spi.h>
43#include "emc.h"
44
45DECLARE_GLOBAL_DATA_PTR;
46
47#ifdef CONFIG_SPL_BUILD
48
49U_BOOT_DEVICE(tegra_gpios) = {
50 "gpio_tegra"
51};
52#endif
53
54__weak void pinmux_init(void) {}
55__weak void pin_mux_usb(void) {}
56__weak void pin_mux_spi(void) {}
57__weak void gpio_early_init_uart(void) {}
58__weak void pin_mux_display(void) {}
59__weak void start_cpu_fan(void) {}
60
61#if defined(CONFIG_TEGRA_NAND)
62__weak void pin_mux_nand(void)
63{
64 funcmux_select(PERIPH_ID_NDFLASH, FUNCMUX_DEFAULT);
65}
66#endif
67
68
69
70
71
72static void power_det_init(void)
73{
74#if defined(CONFIG_TEGRA20)
75 struct pmc_ctlr *const pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE;
76
77
78 writel(0, &pmc->pmc_pwr_det_latch);
79 writel(0, &pmc->pmc_pwr_det);
80#endif
81}
82
83__weak int tegra_board_id(void)
84{
85 return -1;
86}
87
88#ifdef CONFIG_DISPLAY_BOARDINFO
89int checkboard(void)
90{
91 int board_id = tegra_board_id();
92
93 printf("Board: %s", CONFIG_TEGRA_BOARD_STRING);
94 if (board_id != -1)
95 printf(", ID: %d\n", board_id);
96 printf("\n");
97
98 return 0;
99}
100#endif
101
102__weak int tegra_lcd_pmic_init(int board_it)
103{
104 return 0;
105}
106
107__weak int nvidia_board_init(void)
108{
109 return 0;
110}
111
112
113
114
115
116int board_init(void)
117{
118 __maybe_unused int err;
119 __maybe_unused int board_id;
120
121
122 clock_init();
123 clock_verify();
124
125 tegra_gpu_config();
126
127#ifdef CONFIG_TEGRA_SPI
128 pin_mux_spi();
129#endif
130
131
132#if defined(CONFIG_DM_VIDEO)
133 pin_mux_display();
134#endif
135
136 gd->bd->bi_boot_params = (NV_PA_SDRAM_BASE + 0x100);
137
138 power_det_init();
139
140#ifdef CONFIG_SYS_I2C_TEGRA
141# ifdef CONFIG_TEGRA_PMU
142 if (pmu_set_nominal())
143 debug("Failed to select nominal voltages\n");
144# ifdef CONFIG_TEGRA_CLOCK_SCALING
145 err = board_emc_init();
146 if (err)
147 debug("Memory controller init failed: %d\n", err);
148# endif
149# endif
150#ifdef CONFIG_AS3722_POWER
151 err = as3722_init(NULL);
152 if (err && err != -ENODEV)
153 return err;
154#endif
155#endif
156
157#ifdef CONFIG_USB_EHCI_TEGRA
158 pin_mux_usb();
159#endif
160
161#if defined(CONFIG_DM_VIDEO)
162 board_id = tegra_board_id();
163 err = tegra_lcd_pmic_init(board_id);
164 if (err)
165 return err;
166#endif
167
168#ifdef CONFIG_TEGRA_NAND
169 pin_mux_nand();
170#endif
171
172 tegra_xusb_padctl_init(gd->fdt_blob);
173
174#ifdef CONFIG_TEGRA_LP0
175
176 warmboot_save_sdram_params();
177
178
179 warmboot_prepare_code(TEGRA_LP0_ADDR, TEGRA_LP0_SIZE);
180#endif
181 return nvidia_board_init();
182}
183
184#ifdef CONFIG_BOARD_EARLY_INIT_F
185static void __gpio_early_init(void)
186{
187}
188
189void gpio_early_init(void) __attribute__((weak, alias("__gpio_early_init")));
190
191int board_early_init_f(void)
192{
193#if defined(CONFIG_TEGRA_DISCONNECT_UDC_ON_BOOT)
194#define USBCMD_FS2 (1 << 15)
195 {
196 struct usb_ctlr *usbctlr = (struct usb_ctlr *)0x7d000000;
197 writel(USBCMD_FS2, &usbctlr->usb_cmd);
198 }
199#endif
200
201
202#if defined(CONFIG_TEGRA_SUPPORT_NON_SECURE)
203 if (!tegra_cpu_is_non_secure())
204#endif
205 arch_timer_init();
206
207 pinmux_init();
208 board_init_uart_f();
209
210
211 gpio_early_init();
212 gpio_early_init_uart();
213
214 return 0;
215}
216#endif
217
218int board_late_init(void)
219{
220#if defined(CONFIG_TEGRA_SUPPORT_NON_SECURE)
221 if (tegra_cpu_is_non_secure()) {
222 printf("CPU is in NS mode\n");
223 setenv("cpu_ns_mode", "1");
224 } else {
225 setenv("cpu_ns_mode", "");
226 }
227#endif
228 start_cpu_fan();
229
230 return 0;
231}
232
233#if defined(CONFIG_TEGRA_MMC)
234__weak void pin_mux_mmc(void)
235{
236}
237
238
239int board_mmc_init(bd_t *bd)
240{
241 debug("%s called\n", __func__);
242
243
244 pin_mux_mmc();
245
246 debug("%s: init MMC\n", __func__);
247 tegra_mmc_init();
248
249 return 0;
250}
251
252void pad_init_mmc(struct mmc_host *host)
253{
254#if defined(CONFIG_TEGRA30)
255 enum periph_id id = host->mmc_id;
256 u32 val;
257
258 debug("%s: sdmmc address = %08x, id = %d\n", __func__,
259 (unsigned int)host->reg, id);
260
261
262 if (id != PERIPH_ID_SDMMC1 && id != PERIPH_ID_SDMMC3) {
263 debug("%s: settings are only valid for SDMMC1/SDMMC3!\n",
264 __func__);
265 return;
266 }
267
268 val = readl(&host->reg->sdmemcmppadctl);
269 val &= 0xFFFFFFF0;
270 val |= MEMCOMP_PADCTRL_VREF;
271 writel(val, &host->reg->sdmemcmppadctl);
272
273 val = readl(&host->reg->autocalcfg);
274 val &= 0xFFFF0000;
275 val |= AUTO_CAL_PU_OFFSET | AUTO_CAL_PD_OFFSET | AUTO_CAL_ENABLED;
276 writel(val, &host->reg->autocalcfg);
277#endif
278}
279#endif
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303static ulong carveout_size(void)
304{
305#ifdef CONFIG_ARM64
306 return SZ_512M;
307#else
308 return 0;
309#endif
310}
311
312
313
314
315
316static ulong usable_ram_size_below_4g(void)
317{
318 ulong total_size_below_4g;
319 ulong usable_size_below_4g;
320
321
322
323
324
325
326 if (gd->ram_size < SZ_2G)
327 total_size_below_4g = gd->ram_size;
328 else
329 total_size_below_4g = SZ_2G;
330
331
332 usable_size_below_4g = total_size_below_4g - carveout_size();
333
334 return usable_size_below_4g;
335}
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365void dram_init_banksize(void)
366{
367 gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
368 gd->bd->bi_dram[0].size = usable_ram_size_below_4g();
369
370#ifdef CONFIG_PCI
371 gd->pci_ram_top = gd->bd->bi_dram[0].start + gd->bd->bi_dram[0].size;
372#endif
373
374#ifdef CONFIG_PHYS_64BIT
375 if (gd->ram_size > SZ_2G) {
376 gd->bd->bi_dram[1].start = 0x100000000;
377 gd->bd->bi_dram[1].size = gd->ram_size - SZ_2G;
378 } else
379#endif
380 {
381 gd->bd->bi_dram[1].start = 0;
382 gd->bd->bi_dram[1].size = 0;
383 }
384}
385
386
387
388
389
390
391
392
393
394
395
396ulong board_get_usable_ram_top(ulong total_size)
397{
398 return CONFIG_SYS_SDRAM_BASE + usable_ram_size_below_4g();
399}
400
401
402
403
404
405int ft_system_setup(void *blob, bd_t *bd)
406{
407 const char *gpu_path =
408#if defined(CONFIG_TEGRA124) || defined(CONFIG_TEGRA210)
409 "/gpu@0,57000000";
410#else
411 NULL;
412#endif
413
414
415 if (gpu_path != NULL)
416 return tegra_gpu_enable_node(blob, gpu_path);
417
418 return 0;
419}
420