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#include <asm/arch-tegra/xusb-padctl.h>
36#include <power/as3722.h>
37#include <i2c.h>
38#include <spi.h>
39#include "emc.h"
40
41DECLARE_GLOBAL_DATA_PTR;
42
43#ifdef CONFIG_SPL_BUILD
44
45U_BOOT_DEVICE(tegra_gpios) = {
46 "gpio_tegra"
47};
48#endif
49
50__weak void pinmux_init(void) {}
51__weak void pin_mux_usb(void) {}
52__weak void pin_mux_spi(void) {}
53__weak void pin_mux_mmc(void) {}
54__weak void gpio_early_init_uart(void) {}
55__weak void pin_mux_display(void) {}
56__weak void start_cpu_fan(void) {}
57
58#if defined(CONFIG_TEGRA_NAND)
59__weak void pin_mux_nand(void)
60{
61 funcmux_select(PERIPH_ID_NDFLASH, FUNCMUX_DEFAULT);
62}
63#endif
64
65
66
67
68
69static void power_det_init(void)
70{
71#if defined(CONFIG_TEGRA20)
72 struct pmc_ctlr *const pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE;
73
74
75 writel(0, &pmc->pmc_pwr_det_latch);
76 writel(0, &pmc->pmc_pwr_det);
77#endif
78}
79
80__weak int tegra_board_id(void)
81{
82 return -1;
83}
84
85#ifdef CONFIG_DISPLAY_BOARDINFO
86int checkboard(void)
87{
88 int board_id = tegra_board_id();
89
90 printf("Board: %s", CONFIG_TEGRA_BOARD_STRING);
91 if (board_id != -1)
92 printf(", ID: %d\n", board_id);
93 printf("\n");
94
95 return 0;
96}
97#endif
98
99__weak int tegra_lcd_pmic_init(int board_it)
100{
101 return 0;
102}
103
104__weak int nvidia_board_init(void)
105{
106 return 0;
107}
108
109
110
111
112
113int board_init(void)
114{
115 __maybe_unused int err;
116 __maybe_unused int board_id;
117
118
119 clock_init();
120 clock_verify();
121
122 tegra_gpu_config();
123
124#ifdef CONFIG_TEGRA_SPI
125 pin_mux_spi();
126#endif
127
128#ifdef CONFIG_MMC_SDHCI_TEGRA
129 pin_mux_mmc();
130#endif
131
132
133#if defined(CONFIG_DM_VIDEO)
134 pin_mux_display();
135#endif
136
137 gd->bd->bi_boot_params = (NV_PA_SDRAM_BASE + 0x100);
138
139 power_det_init();
140
141#ifdef CONFIG_SYS_I2C_TEGRA
142# ifdef CONFIG_TEGRA_PMU
143 if (pmu_set_nominal())
144 debug("Failed to select nominal voltages\n");
145# ifdef CONFIG_TEGRA_CLOCK_SCALING
146 err = board_emc_init();
147 if (err)
148 debug("Memory controller init failed: %d\n", err);
149# endif
150# endif
151#ifdef CONFIG_AS3722_POWER
152 err = as3722_init(NULL);
153 if (err && err != -ENODEV)
154 return err;
155#endif
156#endif
157
158#ifdef CONFIG_USB_EHCI_TEGRA
159 pin_mux_usb();
160#endif
161
162#if defined(CONFIG_DM_VIDEO)
163 board_id = tegra_board_id();
164 err = tegra_lcd_pmic_init(board_id);
165 if (err)
166 return err;
167#endif
168
169#ifdef CONFIG_TEGRA_NAND
170 pin_mux_nand();
171#endif
172
173 tegra_xusb_padctl_init(gd->fdt_blob);
174
175#ifdef CONFIG_TEGRA_LP0
176
177 warmboot_save_sdram_params();
178
179
180 warmboot_prepare_code(TEGRA_LP0_ADDR, TEGRA_LP0_SIZE);
181#endif
182 return nvidia_board_init();
183}
184
185#ifdef CONFIG_BOARD_EARLY_INIT_F
186static void __gpio_early_init(void)
187{
188}
189
190void gpio_early_init(void) __attribute__((weak, alias("__gpio_early_init")));
191
192int board_early_init_f(void)
193{
194#if defined(CONFIG_TEGRA_DISCONNECT_UDC_ON_BOOT)
195#define USBCMD_FS2 (1 << 15)
196 {
197 struct usb_ctlr *usbctlr = (struct usb_ctlr *)0x7d000000;
198 writel(USBCMD_FS2, &usbctlr->usb_cmd);
199 }
200#endif
201
202
203#if defined(CONFIG_TEGRA_SUPPORT_NON_SECURE)
204 if (!tegra_cpu_is_non_secure())
205#endif
206 arch_timer_init();
207
208 pinmux_init();
209 board_init_uart_f();
210
211
212 gpio_early_init();
213 gpio_early_init_uart();
214
215 return 0;
216}
217#endif
218
219int board_late_init(void)
220{
221#if defined(CONFIG_TEGRA_SUPPORT_NON_SECURE)
222 if (tegra_cpu_is_non_secure()) {
223 printf("CPU is in NS mode\n");
224 setenv("cpu_ns_mode", "1");
225 } else {
226 setenv("cpu_ns_mode", "");
227 }
228#endif
229 start_cpu_fan();
230
231 return 0;
232}
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256static ulong carveout_size(void)
257{
258#ifdef CONFIG_ARM64
259 return SZ_512M;
260#else
261 return 0;
262#endif
263}
264
265
266
267
268
269static ulong usable_ram_size_below_4g(void)
270{
271 ulong total_size_below_4g;
272 ulong usable_size_below_4g;
273
274
275
276
277
278
279 if (gd->ram_size < SZ_2G)
280 total_size_below_4g = gd->ram_size;
281 else
282 total_size_below_4g = SZ_2G;
283
284
285 usable_size_below_4g = total_size_below_4g - carveout_size();
286
287 return usable_size_below_4g;
288}
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318void dram_init_banksize(void)
319{
320 gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
321 gd->bd->bi_dram[0].size = usable_ram_size_below_4g();
322
323#ifdef CONFIG_PCI
324 gd->pci_ram_top = gd->bd->bi_dram[0].start + gd->bd->bi_dram[0].size;
325#endif
326
327#ifdef CONFIG_PHYS_64BIT
328 if (gd->ram_size > SZ_2G) {
329 gd->bd->bi_dram[1].start = 0x100000000;
330 gd->bd->bi_dram[1].size = gd->ram_size - SZ_2G;
331 } else
332#endif
333 {
334 gd->bd->bi_dram[1].start = 0;
335 gd->bd->bi_dram[1].size = 0;
336 }
337}
338
339
340
341
342
343
344
345
346
347
348
349ulong board_get_usable_ram_top(ulong total_size)
350{
351 return CONFIG_SYS_SDRAM_BASE + usable_ram_size_below_4g();
352}
353