109f455dcSMasahiro Yamada /* 209f455dcSMasahiro Yamada * (C) Copyright 2010-2014 309f455dcSMasahiro Yamada * NVIDIA Corporation <www.nvidia.com> 409f455dcSMasahiro Yamada * 509f455dcSMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 609f455dcSMasahiro Yamada */ 709f455dcSMasahiro Yamada 809f455dcSMasahiro Yamada #include <common.h> 909f455dcSMasahiro Yamada #include <asm/io.h> 1009f455dcSMasahiro Yamada #include <asm/arch/clock.h> 1109f455dcSMasahiro Yamada #include <asm/arch/funcmux.h> 1209f455dcSMasahiro Yamada #include <asm/arch/mc.h> 1309f455dcSMasahiro Yamada #include <asm/arch/tegra.h> 1409f455dcSMasahiro Yamada #include <asm/arch-tegra/board.h> 1509f455dcSMasahiro Yamada #include <asm/arch-tegra/pmc.h> 1609f455dcSMasahiro Yamada #include <asm/arch-tegra/sys_proto.h> 1709f455dcSMasahiro Yamada #include <asm/arch-tegra/warmboot.h> 1809f455dcSMasahiro Yamada 1909f455dcSMasahiro Yamada DECLARE_GLOBAL_DATA_PTR; 2009f455dcSMasahiro Yamada 2109f455dcSMasahiro Yamada enum { 2209f455dcSMasahiro Yamada /* UARTs which we can enable */ 2309f455dcSMasahiro Yamada UARTA = 1 << 0, 2409f455dcSMasahiro Yamada UARTB = 1 << 1, 2509f455dcSMasahiro Yamada UARTC = 1 << 2, 2609f455dcSMasahiro Yamada UARTD = 1 << 3, 2709f455dcSMasahiro Yamada UARTE = 1 << 4, 2809f455dcSMasahiro Yamada UART_COUNT = 5, 2909f455dcSMasahiro Yamada }; 3009f455dcSMasahiro Yamada 3109f455dcSMasahiro Yamada /* Read the RAM size directly from the memory controller */ 3209f455dcSMasahiro Yamada unsigned int query_sdram_size(void) 3309f455dcSMasahiro Yamada { 3409f455dcSMasahiro Yamada struct mc_ctlr *const mc = (struct mc_ctlr *)NV_PA_MC_BASE; 35*3a2cab51SStephen Warren u32 emem_cfg, size_bytes; 3609f455dcSMasahiro Yamada 37*3a2cab51SStephen Warren emem_cfg = readl(&mc->mc_emem_cfg); 3809f455dcSMasahiro Yamada #if defined(CONFIG_TEGRA20) 39*3a2cab51SStephen Warren debug("mc->mc_emem_cfg (MEM_SIZE_KB) = 0x%08x\n", emem_cfg); 40*3a2cab51SStephen Warren size_bytes = get_ram_size((void *)PHYS_SDRAM_1, emem_cfg * 1024); 4109f455dcSMasahiro Yamada #else 42*3a2cab51SStephen Warren debug("mc->mc_emem_cfg (MEM_SIZE_MB) = 0x%08x\n", emem_cfg); 43*3a2cab51SStephen Warren size_bytes = get_ram_size((void *)PHYS_SDRAM_1, emem_cfg * 1024 * 1024); 4409f455dcSMasahiro Yamada #endif 4509f455dcSMasahiro Yamada 4609f455dcSMasahiro Yamada #if defined(CONFIG_TEGRA30) || defined(CONFIG_TEGRA114) 4709f455dcSMasahiro Yamada /* External memory limited to 2047 MB due to IROM/HI-VEC */ 48*3a2cab51SStephen Warren if (size_bytes == SZ_2G) 49*3a2cab51SStephen Warren size_bytes -= SZ_1M; 5009f455dcSMasahiro Yamada #endif 5109f455dcSMasahiro Yamada 52*3a2cab51SStephen Warren return size_bytes; 5309f455dcSMasahiro Yamada } 5409f455dcSMasahiro Yamada 5509f455dcSMasahiro Yamada int dram_init(void) 5609f455dcSMasahiro Yamada { 5709f455dcSMasahiro Yamada /* We do not initialise DRAM here. We just query the size */ 5809f455dcSMasahiro Yamada gd->ram_size = query_sdram_size(); 5909f455dcSMasahiro Yamada return 0; 6009f455dcSMasahiro Yamada } 6109f455dcSMasahiro Yamada 6209f455dcSMasahiro Yamada #ifdef CONFIG_DISPLAY_BOARDINFO 6309f455dcSMasahiro Yamada int checkboard(void) 6409f455dcSMasahiro Yamada { 6509f455dcSMasahiro Yamada printf("Board: %s\n", sysinfo.board_string); 6609f455dcSMasahiro Yamada return 0; 6709f455dcSMasahiro Yamada } 6809f455dcSMasahiro Yamada #endif /* CONFIG_DISPLAY_BOARDINFO */ 6909f455dcSMasahiro Yamada 7009f455dcSMasahiro Yamada static int uart_configs[] = { 7109f455dcSMasahiro Yamada #if defined(CONFIG_TEGRA20) 7209f455dcSMasahiro Yamada #if defined(CONFIG_TEGRA_UARTA_UAA_UAB) 7309f455dcSMasahiro Yamada FUNCMUX_UART1_UAA_UAB, 7409f455dcSMasahiro Yamada #elif defined(CONFIG_TEGRA_UARTA_GPU) 7509f455dcSMasahiro Yamada FUNCMUX_UART1_GPU, 7609f455dcSMasahiro Yamada #elif defined(CONFIG_TEGRA_UARTA_SDIO1) 7709f455dcSMasahiro Yamada FUNCMUX_UART1_SDIO1, 7809f455dcSMasahiro Yamada #else 7909f455dcSMasahiro Yamada FUNCMUX_UART1_IRRX_IRTX, 8009f455dcSMasahiro Yamada #endif 8109f455dcSMasahiro Yamada FUNCMUX_UART2_UAD, 8209f455dcSMasahiro Yamada -1, 8309f455dcSMasahiro Yamada FUNCMUX_UART4_GMC, 8409f455dcSMasahiro Yamada -1, 8509f455dcSMasahiro Yamada #elif defined(CONFIG_TEGRA30) 8609f455dcSMasahiro Yamada FUNCMUX_UART1_ULPI, /* UARTA */ 8709f455dcSMasahiro Yamada -1, 8809f455dcSMasahiro Yamada -1, 8909f455dcSMasahiro Yamada -1, 9009f455dcSMasahiro Yamada -1, 9109f455dcSMasahiro Yamada #elif defined(CONFIG_TEGRA114) 9209f455dcSMasahiro Yamada -1, 9309f455dcSMasahiro Yamada -1, 9409f455dcSMasahiro Yamada -1, 9509f455dcSMasahiro Yamada FUNCMUX_UART4_GMI, /* UARTD */ 9609f455dcSMasahiro Yamada -1, 9709f455dcSMasahiro Yamada #else /* Tegra124 */ 9809f455dcSMasahiro Yamada FUNCMUX_UART1_KBC, /* UARTA */ 9909f455dcSMasahiro Yamada -1, 10009f455dcSMasahiro Yamada -1, 10109f455dcSMasahiro Yamada FUNCMUX_UART4_GPIO, /* UARTD */ 10209f455dcSMasahiro Yamada -1, 10309f455dcSMasahiro Yamada #endif 10409f455dcSMasahiro Yamada }; 10509f455dcSMasahiro Yamada 10609f455dcSMasahiro Yamada /** 10709f455dcSMasahiro Yamada * Set up the specified uarts 10809f455dcSMasahiro Yamada * 10909f455dcSMasahiro Yamada * @param uarts_ids Mask containing UARTs to init (UARTx) 11009f455dcSMasahiro Yamada */ 11109f455dcSMasahiro Yamada static void setup_uarts(int uart_ids) 11209f455dcSMasahiro Yamada { 11309f455dcSMasahiro Yamada static enum periph_id id_for_uart[] = { 11409f455dcSMasahiro Yamada PERIPH_ID_UART1, 11509f455dcSMasahiro Yamada PERIPH_ID_UART2, 11609f455dcSMasahiro Yamada PERIPH_ID_UART3, 11709f455dcSMasahiro Yamada PERIPH_ID_UART4, 11809f455dcSMasahiro Yamada PERIPH_ID_UART5, 11909f455dcSMasahiro Yamada }; 12009f455dcSMasahiro Yamada size_t i; 12109f455dcSMasahiro Yamada 12209f455dcSMasahiro Yamada for (i = 0; i < UART_COUNT; i++) { 12309f455dcSMasahiro Yamada if (uart_ids & (1 << i)) { 12409f455dcSMasahiro Yamada enum periph_id id = id_for_uart[i]; 12509f455dcSMasahiro Yamada 12609f455dcSMasahiro Yamada funcmux_select(id, uart_configs[i]); 12709f455dcSMasahiro Yamada clock_ll_start_uart(id); 12809f455dcSMasahiro Yamada } 12909f455dcSMasahiro Yamada } 13009f455dcSMasahiro Yamada } 13109f455dcSMasahiro Yamada 13209f455dcSMasahiro Yamada void board_init_uart_f(void) 13309f455dcSMasahiro Yamada { 13409f455dcSMasahiro Yamada int uart_ids = 0; /* bit mask of which UART ids to enable */ 13509f455dcSMasahiro Yamada 13609f455dcSMasahiro Yamada #ifdef CONFIG_TEGRA_ENABLE_UARTA 13709f455dcSMasahiro Yamada uart_ids |= UARTA; 13809f455dcSMasahiro Yamada #endif 13909f455dcSMasahiro Yamada #ifdef CONFIG_TEGRA_ENABLE_UARTB 14009f455dcSMasahiro Yamada uart_ids |= UARTB; 14109f455dcSMasahiro Yamada #endif 14209f455dcSMasahiro Yamada #ifdef CONFIG_TEGRA_ENABLE_UARTC 14309f455dcSMasahiro Yamada uart_ids |= UARTC; 14409f455dcSMasahiro Yamada #endif 14509f455dcSMasahiro Yamada #ifdef CONFIG_TEGRA_ENABLE_UARTD 14609f455dcSMasahiro Yamada uart_ids |= UARTD; 14709f455dcSMasahiro Yamada #endif 14809f455dcSMasahiro Yamada #ifdef CONFIG_TEGRA_ENABLE_UARTE 14909f455dcSMasahiro Yamada uart_ids |= UARTE; 15009f455dcSMasahiro Yamada #endif 15109f455dcSMasahiro Yamada setup_uarts(uart_ids); 15209f455dcSMasahiro Yamada } 15309f455dcSMasahiro Yamada 15409f455dcSMasahiro Yamada #ifndef CONFIG_SYS_DCACHE_OFF 15509f455dcSMasahiro Yamada void enable_caches(void) 15609f455dcSMasahiro Yamada { 15709f455dcSMasahiro Yamada /* Enable D-cache. I-cache is already enabled in start.S */ 15809f455dcSMasahiro Yamada dcache_enable(); 15909f455dcSMasahiro Yamada } 16009f455dcSMasahiro Yamada #endif 161