blob: 6a6faf4b2760ed96452cd5d251b0536818629d19 [file] [log] [blame]
Tom Warren41b68382011-01-27 10:58:05 +00001/*
Tom Warrene5ffffd2014-01-24 12:46:16 -07002 * (C) Copyright 2010-2014
Tom Warren41b68382011-01-27 10:58:05 +00003 * NVIDIA Corporation <www.nvidia.com>
4 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02005 * SPDX-License-Identifier: GPL-2.0+
Tom Warren41b68382011-01-27 10:58:05 +00006 */
7
8#include <common.h>
9#include <asm/io.h>
Simon Glass96b7c432011-11-28 15:04:39 +000010#include <asm/arch/clock.h>
11#include <asm/arch/funcmux.h>
Tom Warrenab371962012-09-19 15:50:56 -070012#include <asm/arch/tegra.h>
Lucas Stache80f7ca2012-09-29 10:02:08 +000013#include <asm/arch-tegra/board.h>
Tom Warrenab371962012-09-19 15:50:56 -070014#include <asm/arch-tegra/pmc.h>
15#include <asm/arch-tegra/sys_proto.h>
16#include <asm/arch-tegra/warmboot.h>
Tom Warren41b68382011-01-27 10:58:05 +000017
18DECLARE_GLOBAL_DATA_PTR;
19
Simon Glass96b7c432011-11-28 15:04:39 +000020enum {
21 /* UARTs which we can enable */
22 UARTA = 1 << 0,
23 UARTB = 1 << 1,
Tom Warrene3d95bc2013-01-28 13:32:10 +000024 UARTC = 1 << 2,
Simon Glass96b7c432011-11-28 15:04:39 +000025 UARTD = 1 << 3,
Tom Warrene3d95bc2013-01-28 13:32:10 +000026 UARTE = 1 << 4,
27 UART_COUNT = 5,
Simon Glass96b7c432011-11-28 15:04:39 +000028};
29
Tom Warren41b68382011-01-27 10:58:05 +000030/*
31 * Boot ROM initializes the odmdata in APBDEV_PMC_SCRATCH20_0,
32 * so we are using this value to identify memory size.
33 */
34
35unsigned int query_sdram_size(void)
36{
Tom Warren22562a42012-09-04 17:00:24 -070037 struct pmc_ctlr *const pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE;
Tom Warren41b68382011-01-27 10:58:05 +000038 u32 reg;
39
40 reg = readl(&pmc->pmc_scratch20);
Marek Vasut8148e112011-10-24 23:41:39 +000041 debug("pmc->pmc_scratch20 (ODMData) = 0x%08x\n", reg);
Tom Warren41b68382011-01-27 10:58:05 +000042
Tom Warren61c6d0e2012-12-11 13:34:15 +000043#if defined(CONFIG_TEGRA20)
44 /* bits 30:28 in OdmData are used for RAM size on T20 */
45 reg &= 0x70000000;
46
Tom Warren41b68382011-01-27 10:58:05 +000047 switch ((reg) >> 28) {
48 case 1:
49 return 0x10000000; /* 256 MB */
Tom Warren61c6d0e2012-12-11 13:34:15 +000050 case 0:
Tom Warren41b68382011-01-27 10:58:05 +000051 case 2:
Stephen Warrenb60fa392012-01-06 12:14:41 +000052 default:
Tom Warren41b68382011-01-27 10:58:05 +000053 return 0x20000000; /* 512 MB */
54 case 3:
Tom Warren41b68382011-01-27 10:58:05 +000055 return 0x40000000; /* 1GB */
56 }
Tom Warrene3d95bc2013-01-28 13:32:10 +000057#else /* Tegra30/Tegra114 */
Tom Warren61c6d0e2012-12-11 13:34:15 +000058 /* bits 31:28 in OdmData are used for RAM size on T30 */
59 switch ((reg) >> 28) {
60 case 0:
61 case 1:
62 default:
63 return 0x10000000; /* 256 MB */
64 case 2:
65 return 0x20000000; /* 512 MB */
66 case 3:
67 return 0x30000000; /* 768 MB */
68 case 4:
69 return 0x40000000; /* 1GB */
70 case 8:
71 return 0x7ff00000; /* 2GB - 1MB */
72 }
73#endif
Tom Warren41b68382011-01-27 10:58:05 +000074}
75
Tom Warren41b68382011-01-27 10:58:05 +000076int dram_init(void)
77{
Tom Warren41b68382011-01-27 10:58:05 +000078 /* We do not initialise DRAM here. We just query the size */
Simon Glassf6fcbbd2011-11-05 03:56:57 +000079 gd->ram_size = query_sdram_size();
Tom Warren41b68382011-01-27 10:58:05 +000080 return 0;
81}
82
83#ifdef CONFIG_DISPLAY_BOARDINFO
84int checkboard(void)
85{
86 printf("Board: %s\n", sysinfo.board_string);
87 return 0;
88}
89#endif /* CONFIG_DISPLAY_BOARDINFO */
Simon Glass5f3a8992011-11-05 03:56:49 +000090
Stephen Warren59f90102012-05-14 13:13:45 +000091static int uart_configs[] = {
Tom Warren61c6d0e2012-12-11 13:34:15 +000092#if defined(CONFIG_TEGRA20)
93 #if defined(CONFIG_TEGRA_UARTA_UAA_UAB)
Stephen Warren59f90102012-05-14 13:13:45 +000094 FUNCMUX_UART1_UAA_UAB,
Tom Warren61c6d0e2012-12-11 13:34:15 +000095 #elif defined(CONFIG_TEGRA_UARTA_GPU)
Stephen Warrene4c01a82012-05-16 05:59:59 +000096 FUNCMUX_UART1_GPU,
Tom Warren61c6d0e2012-12-11 13:34:15 +000097 #elif defined(CONFIG_TEGRA_UARTA_SDIO1)
Lucas Stach4de6eec2012-05-16 08:21:02 +000098 FUNCMUX_UART1_SDIO1,
Tom Warren61c6d0e2012-12-11 13:34:15 +000099 #else
Stephen Warren59f90102012-05-14 13:13:45 +0000100 FUNCMUX_UART1_IRRX_IRTX,
Stephen Warren811af732013-01-22 06:20:08 +0000101#endif
102 FUNCMUX_UART2_UAD,
Stephen Warren59f90102012-05-14 13:13:45 +0000103 -1,
104 FUNCMUX_UART4_GMC,
105 -1,
Tom Warrene3d95bc2013-01-28 13:32:10 +0000106#elif defined(CONFIG_TEGRA30)
Tom Warren61c6d0e2012-12-11 13:34:15 +0000107 FUNCMUX_UART1_ULPI, /* UARTA */
108 -1,
109 -1,
110 -1,
111 -1,
Tom Warrene5ffffd2014-01-24 12:46:16 -0700112#elif defined(CONFIG_TEGRA114)
Tom Warrene3d95bc2013-01-28 13:32:10 +0000113 -1,
114 -1,
115 -1,
116 FUNCMUX_UART4_GMI, /* UARTD */
117 -1,
Tom Warrene5ffffd2014-01-24 12:46:16 -0700118#else /* Tegra124 */
119 FUNCMUX_UART1_KBC, /* UARTA */
120 -1,
121 -1,
122 FUNCMUX_UART4_GPIO, /* UARTD */
123 -1,
Tom Warren61c6d0e2012-12-11 13:34:15 +0000124#endif
Stephen Warren59f90102012-05-14 13:13:45 +0000125};
126
Simon Glass96b7c432011-11-28 15:04:39 +0000127/**
128 * Set up the specified uarts
129 *
130 * @param uarts_ids Mask containing UARTs to init (UARTx)
131 */
132static void setup_uarts(int uart_ids)
133{
134 static enum periph_id id_for_uart[] = {
135 PERIPH_ID_UART1,
136 PERIPH_ID_UART2,
137 PERIPH_ID_UART3,
138 PERIPH_ID_UART4,
Tom Warrene3d95bc2013-01-28 13:32:10 +0000139 PERIPH_ID_UART5,
Simon Glass96b7c432011-11-28 15:04:39 +0000140 };
141 size_t i;
142
143 for (i = 0; i < UART_COUNT; i++) {
144 if (uart_ids & (1 << i)) {
145 enum periph_id id = id_for_uart[i];
146
Stephen Warren59f90102012-05-14 13:13:45 +0000147 funcmux_select(id, uart_configs[i]);
Simon Glass96b7c432011-11-28 15:04:39 +0000148 clock_ll_start_uart(id);
149 }
150 }
151}
152
153void board_init_uart_f(void)
154{
155 int uart_ids = 0; /* bit mask of which UART ids to enable */
156
Tom Warren22562a42012-09-04 17:00:24 -0700157#ifdef CONFIG_TEGRA_ENABLE_UARTA
Simon Glass96b7c432011-11-28 15:04:39 +0000158 uart_ids |= UARTA;
159#endif
Tom Warren22562a42012-09-04 17:00:24 -0700160#ifdef CONFIG_TEGRA_ENABLE_UARTB
Simon Glass96b7c432011-11-28 15:04:39 +0000161 uart_ids |= UARTB;
162#endif
Tom Warrene3d95bc2013-01-28 13:32:10 +0000163#ifdef CONFIG_TEGRA_ENABLE_UARTC
164 uart_ids |= UARTC;
165#endif
Tom Warren22562a42012-09-04 17:00:24 -0700166#ifdef CONFIG_TEGRA_ENABLE_UARTD
Simon Glass96b7c432011-11-28 15:04:39 +0000167 uart_ids |= UARTD;
168#endif
Tom Warrene3d95bc2013-01-28 13:32:10 +0000169#ifdef CONFIG_TEGRA_ENABLE_UARTE
170 uart_ids |= UARTE;
171#endif
Simon Glass96b7c432011-11-28 15:04:39 +0000172 setup_uarts(uart_ids);
173}
Simon Glass410012f2012-01-09 13:22:15 +0000174
175#ifndef CONFIG_SYS_DCACHE_OFF
176void enable_caches(void)
177{
178 /* Enable D-cache. I-cache is already enabled in start.S */
179 dcache_enable();
180}
181#endif