1*09f455dcSMasahiro Yamada /* 2*09f455dcSMasahiro Yamada * (C) Copyright 2010-2014 3*09f455dcSMasahiro Yamada * NVIDIA Corporation <www.nvidia.com> 4*09f455dcSMasahiro Yamada * 5*09f455dcSMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 6*09f455dcSMasahiro Yamada */ 7*09f455dcSMasahiro Yamada 8*09f455dcSMasahiro Yamada #include <common.h> 9*09f455dcSMasahiro Yamada #include <asm/io.h> 10*09f455dcSMasahiro Yamada #include <asm/arch/clock.h> 11*09f455dcSMasahiro Yamada #include <asm/arch/funcmux.h> 12*09f455dcSMasahiro Yamada #include <asm/arch/mc.h> 13*09f455dcSMasahiro Yamada #include <asm/arch/tegra.h> 14*09f455dcSMasahiro Yamada #include <asm/arch-tegra/board.h> 15*09f455dcSMasahiro Yamada #include <asm/arch-tegra/pmc.h> 16*09f455dcSMasahiro Yamada #include <asm/arch-tegra/sys_proto.h> 17*09f455dcSMasahiro Yamada #include <asm/arch-tegra/warmboot.h> 18*09f455dcSMasahiro Yamada 19*09f455dcSMasahiro Yamada DECLARE_GLOBAL_DATA_PTR; 20*09f455dcSMasahiro Yamada 21*09f455dcSMasahiro Yamada enum { 22*09f455dcSMasahiro Yamada /* UARTs which we can enable */ 23*09f455dcSMasahiro Yamada UARTA = 1 << 0, 24*09f455dcSMasahiro Yamada UARTB = 1 << 1, 25*09f455dcSMasahiro Yamada UARTC = 1 << 2, 26*09f455dcSMasahiro Yamada UARTD = 1 << 3, 27*09f455dcSMasahiro Yamada UARTE = 1 << 4, 28*09f455dcSMasahiro Yamada UART_COUNT = 5, 29*09f455dcSMasahiro Yamada }; 30*09f455dcSMasahiro Yamada 31*09f455dcSMasahiro Yamada /* Read the RAM size directly from the memory controller */ 32*09f455dcSMasahiro Yamada unsigned int query_sdram_size(void) 33*09f455dcSMasahiro Yamada { 34*09f455dcSMasahiro Yamada struct mc_ctlr *const mc = (struct mc_ctlr *)NV_PA_MC_BASE; 35*09f455dcSMasahiro Yamada u32 size_mb; 36*09f455dcSMasahiro Yamada 37*09f455dcSMasahiro Yamada size_mb = readl(&mc->mc_emem_cfg); 38*09f455dcSMasahiro Yamada #if defined(CONFIG_TEGRA20) 39*09f455dcSMasahiro Yamada debug("mc->mc_emem_cfg (MEM_SIZE_KB) = 0x%08x\n", size_mb); 40*09f455dcSMasahiro Yamada size_mb = get_ram_size((void *)PHYS_SDRAM_1, size_mb * 1024); 41*09f455dcSMasahiro Yamada #else 42*09f455dcSMasahiro Yamada debug("mc->mc_emem_cfg (MEM_SIZE_MB) = 0x%08x\n", size_mb); 43*09f455dcSMasahiro Yamada size_mb = get_ram_size((void *)PHYS_SDRAM_1, size_mb * 1024 * 1024); 44*09f455dcSMasahiro Yamada #endif 45*09f455dcSMasahiro Yamada 46*09f455dcSMasahiro Yamada #if defined(CONFIG_TEGRA30) || defined(CONFIG_TEGRA114) 47*09f455dcSMasahiro Yamada /* External memory limited to 2047 MB due to IROM/HI-VEC */ 48*09f455dcSMasahiro Yamada if (size_mb == SZ_2G) size_mb -= SZ_1M; 49*09f455dcSMasahiro Yamada #endif 50*09f455dcSMasahiro Yamada 51*09f455dcSMasahiro Yamada return size_mb; 52*09f455dcSMasahiro Yamada } 53*09f455dcSMasahiro Yamada 54*09f455dcSMasahiro Yamada int dram_init(void) 55*09f455dcSMasahiro Yamada { 56*09f455dcSMasahiro Yamada /* We do not initialise DRAM here. We just query the size */ 57*09f455dcSMasahiro Yamada gd->ram_size = query_sdram_size(); 58*09f455dcSMasahiro Yamada return 0; 59*09f455dcSMasahiro Yamada } 60*09f455dcSMasahiro Yamada 61*09f455dcSMasahiro Yamada #ifdef CONFIG_DISPLAY_BOARDINFO 62*09f455dcSMasahiro Yamada int checkboard(void) 63*09f455dcSMasahiro Yamada { 64*09f455dcSMasahiro Yamada printf("Board: %s\n", sysinfo.board_string); 65*09f455dcSMasahiro Yamada return 0; 66*09f455dcSMasahiro Yamada } 67*09f455dcSMasahiro Yamada #endif /* CONFIG_DISPLAY_BOARDINFO */ 68*09f455dcSMasahiro Yamada 69*09f455dcSMasahiro Yamada static int uart_configs[] = { 70*09f455dcSMasahiro Yamada #if defined(CONFIG_TEGRA20) 71*09f455dcSMasahiro Yamada #if defined(CONFIG_TEGRA_UARTA_UAA_UAB) 72*09f455dcSMasahiro Yamada FUNCMUX_UART1_UAA_UAB, 73*09f455dcSMasahiro Yamada #elif defined(CONFIG_TEGRA_UARTA_GPU) 74*09f455dcSMasahiro Yamada FUNCMUX_UART1_GPU, 75*09f455dcSMasahiro Yamada #elif defined(CONFIG_TEGRA_UARTA_SDIO1) 76*09f455dcSMasahiro Yamada FUNCMUX_UART1_SDIO1, 77*09f455dcSMasahiro Yamada #else 78*09f455dcSMasahiro Yamada FUNCMUX_UART1_IRRX_IRTX, 79*09f455dcSMasahiro Yamada #endif 80*09f455dcSMasahiro Yamada FUNCMUX_UART2_UAD, 81*09f455dcSMasahiro Yamada -1, 82*09f455dcSMasahiro Yamada FUNCMUX_UART4_GMC, 83*09f455dcSMasahiro Yamada -1, 84*09f455dcSMasahiro Yamada #elif defined(CONFIG_TEGRA30) 85*09f455dcSMasahiro Yamada FUNCMUX_UART1_ULPI, /* UARTA */ 86*09f455dcSMasahiro Yamada -1, 87*09f455dcSMasahiro Yamada -1, 88*09f455dcSMasahiro Yamada -1, 89*09f455dcSMasahiro Yamada -1, 90*09f455dcSMasahiro Yamada #elif defined(CONFIG_TEGRA114) 91*09f455dcSMasahiro Yamada -1, 92*09f455dcSMasahiro Yamada -1, 93*09f455dcSMasahiro Yamada -1, 94*09f455dcSMasahiro Yamada FUNCMUX_UART4_GMI, /* UARTD */ 95*09f455dcSMasahiro Yamada -1, 96*09f455dcSMasahiro Yamada #else /* Tegra124 */ 97*09f455dcSMasahiro Yamada FUNCMUX_UART1_KBC, /* UARTA */ 98*09f455dcSMasahiro Yamada -1, 99*09f455dcSMasahiro Yamada -1, 100*09f455dcSMasahiro Yamada FUNCMUX_UART4_GPIO, /* UARTD */ 101*09f455dcSMasahiro Yamada -1, 102*09f455dcSMasahiro Yamada #endif 103*09f455dcSMasahiro Yamada }; 104*09f455dcSMasahiro Yamada 105*09f455dcSMasahiro Yamada /** 106*09f455dcSMasahiro Yamada * Set up the specified uarts 107*09f455dcSMasahiro Yamada * 108*09f455dcSMasahiro Yamada * @param uarts_ids Mask containing UARTs to init (UARTx) 109*09f455dcSMasahiro Yamada */ 110*09f455dcSMasahiro Yamada static void setup_uarts(int uart_ids) 111*09f455dcSMasahiro Yamada { 112*09f455dcSMasahiro Yamada static enum periph_id id_for_uart[] = { 113*09f455dcSMasahiro Yamada PERIPH_ID_UART1, 114*09f455dcSMasahiro Yamada PERIPH_ID_UART2, 115*09f455dcSMasahiro Yamada PERIPH_ID_UART3, 116*09f455dcSMasahiro Yamada PERIPH_ID_UART4, 117*09f455dcSMasahiro Yamada PERIPH_ID_UART5, 118*09f455dcSMasahiro Yamada }; 119*09f455dcSMasahiro Yamada size_t i; 120*09f455dcSMasahiro Yamada 121*09f455dcSMasahiro Yamada for (i = 0; i < UART_COUNT; i++) { 122*09f455dcSMasahiro Yamada if (uart_ids & (1 << i)) { 123*09f455dcSMasahiro Yamada enum periph_id id = id_for_uart[i]; 124*09f455dcSMasahiro Yamada 125*09f455dcSMasahiro Yamada funcmux_select(id, uart_configs[i]); 126*09f455dcSMasahiro Yamada clock_ll_start_uart(id); 127*09f455dcSMasahiro Yamada } 128*09f455dcSMasahiro Yamada } 129*09f455dcSMasahiro Yamada } 130*09f455dcSMasahiro Yamada 131*09f455dcSMasahiro Yamada void board_init_uart_f(void) 132*09f455dcSMasahiro Yamada { 133*09f455dcSMasahiro Yamada int uart_ids = 0; /* bit mask of which UART ids to enable */ 134*09f455dcSMasahiro Yamada 135*09f455dcSMasahiro Yamada #ifdef CONFIG_TEGRA_ENABLE_UARTA 136*09f455dcSMasahiro Yamada uart_ids |= UARTA; 137*09f455dcSMasahiro Yamada #endif 138*09f455dcSMasahiro Yamada #ifdef CONFIG_TEGRA_ENABLE_UARTB 139*09f455dcSMasahiro Yamada uart_ids |= UARTB; 140*09f455dcSMasahiro Yamada #endif 141*09f455dcSMasahiro Yamada #ifdef CONFIG_TEGRA_ENABLE_UARTC 142*09f455dcSMasahiro Yamada uart_ids |= UARTC; 143*09f455dcSMasahiro Yamada #endif 144*09f455dcSMasahiro Yamada #ifdef CONFIG_TEGRA_ENABLE_UARTD 145*09f455dcSMasahiro Yamada uart_ids |= UARTD; 146*09f455dcSMasahiro Yamada #endif 147*09f455dcSMasahiro Yamada #ifdef CONFIG_TEGRA_ENABLE_UARTE 148*09f455dcSMasahiro Yamada uart_ids |= UARTE; 149*09f455dcSMasahiro Yamada #endif 150*09f455dcSMasahiro Yamada setup_uarts(uart_ids); 151*09f455dcSMasahiro Yamada } 152*09f455dcSMasahiro Yamada 153*09f455dcSMasahiro Yamada #ifndef CONFIG_SYS_DCACHE_OFF 154*09f455dcSMasahiro Yamada void enable_caches(void) 155*09f455dcSMasahiro Yamada { 156*09f455dcSMasahiro Yamada /* Enable D-cache. I-cache is already enabled in start.S */ 157*09f455dcSMasahiro Yamada dcache_enable(); 158*09f455dcSMasahiro Yamada } 159*09f455dcSMasahiro Yamada #endif 160