/* * (C) Copyright 2015 Google, Inc * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #include #include #include DECLARE_GLOBAL_DATA_PTR; /* track how often we were entered */ static int rk3188_num_entries __attribute__ ((section(".data"))); #define PMU_BASE 0x20004000 #define SPL_ENTRY 0x10080C00 static void jump_to_spl(void) { typedef void __noreturn (*image_entry_noargs_t)(void); struct rk3188_pmu * const pmu = (void *)PMU_BASE; image_entry_noargs_t tpl_entry = (image_entry_noargs_t)(unsigned long)SPL_ENTRY; /* Store the SAVE_SP_ADDR in a location shared with SPL. */ writel(SAVE_SP_ADDR, &pmu->sys_reg[2]); tpl_entry(); } void board_init_f(ulong dummy) { /* Example code showing how to enable the debug UART on RK3188 */ #ifdef EARLY_UART #include /* Enable early UART on the RK3188 */ #define GRF_BASE 0x20008000 struct rk3188_grf * const grf = (void *)GRF_BASE; rk_clrsetreg(&grf->gpio1b_iomux, GPIO1B1_MASK << GPIO1B1_SHIFT | GPIO1B0_MASK << GPIO1B0_SHIFT, GPIO1B1_UART2_SOUT << GPIO1B1_SHIFT | GPIO1B0_UART2_SIN << GPIO1B0_SHIFT); /* * Debug UART can be used from here if required: * * debug_uart_init(); * printch('a'); * printhex8(0x1234); * printascii("string"); */ debug_uart_init(); printch('t'); printch('p'); printch('l'); printch('-'); printch(rk3188_num_entries + 1 + '0'); printch('\n'); #endif rk3188_num_entries++; if (rk3188_num_entries == 1) { /* * The original loader did some very basic integrity * checking at this point, but the remaining few bytes * could be used for any improvement making sense * really early on. */ back_to_bootrom(); } else { /* * TPL part of the loader should now wait for us * at offset 0xC00 in the sram. Should never return * from there. */ jump_to_spl(); } }