X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=arch%2Farm%2Flib%2Fspl.c;h=33cc76ba3de3cb2d94dff85fce1cbbe9ff600814;hb=83d290c56fab2d38cd1ab4c4cc7099559c1d5046;hp=bd8c7d2ede0c589aaf7526252dc92e95d2f8dc98;hpb=02ebe6f702ec8d025926b0ea7c2088e302c5a302;p=oweals%2Fu-boot.git diff --git a/arch/arm/lib/spl.c b/arch/arm/lib/spl.c index bd8c7d2ede..33cc76ba3d 100644 --- a/arch/arm/lib/spl.c +++ b/arch/arm/lib/spl.c @@ -1,19 +1,20 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * (C) Copyright 2010-2012 * Texas Instruments, * * Aneesh V * Tom Rini - * - * SPDX-License-Identifier: GPL-2.0+ */ + #include #include #include #include #include +#include -#ifndef CONFIG_DM +#ifndef CONFIG_SPL_DM /* Pointer to as well as the global data structure for SPL */ DECLARE_GLOBAL_DATA_PTR; @@ -25,43 +26,50 @@ gd_t gdata __attribute__ ((section(".data"))); #endif /* - * In the context of SPL, board_init_f must ensure that any clocks/etc for - * DDR are enabled, ensure that the stack pointer is valid, clear the BSS - * and call board_init_f. We provide this version by default but mark it - * as __weak to allow for platforms to do this in their own way if needed. + * In the context of SPL, board_init_f() prepares the hardware for execution + * from system RAM (DRAM, DDR...). As system RAM may not be available yet, + * board_init_f() must use the current GD to store any data which must be + * passed on to later stages. These data include the relocation destination, + * the future stack, and the future GD location. BSS is cleared after this + * function (and therefore must be accessible). + * + * We provide this version by default but mark it as __weak to allow for + * platforms to do this in their own way if needed. Please see the top + * level U-Boot README "Board Initialization Flow" section for info on what + * to put in this function. */ void __weak board_init_f(ulong dummy) { - /* Clear the BSS. */ - memset(__bss_start, 0, __bss_end - __bss_start); - -#ifndef CONFIG_DM - /* TODO: Remove settings of the global data pointer here */ - gd = &gdata; -#endif - - board_init_r(NULL, 0); } /* * This function jumps to an image with argument. Normally an FDT or ATAGS * image. - * arg: Pointer to paramter image in RAM */ #ifdef CONFIG_SPL_OS_BOOT -void __noreturn jump_to_image_linux(void *arg) +#ifdef CONFIG_ARM64 +void __noreturn jump_to_image_linux(struct spl_image_info *spl_image) +{ + debug("Entering kernel arg pointer: 0x%p\n", spl_image->arg); + cleanup_before_linux(); + armv8_switch_to_el2((u64)spl_image->arg, 0, 0, 0, + spl_image->entry_point, ES_TO_AARCH64); +} +#else +void __noreturn jump_to_image_linux(struct spl_image_info *spl_image) { unsigned long machid = 0xffffffff; #ifdef CONFIG_MACH_TYPE machid = CONFIG_MACH_TYPE; #endif - debug("Entering kernel arg pointer: 0x%p\n", arg); + debug("Entering kernel arg pointer: 0x%p\n", spl_image->arg); typedef void (*image_entry_arg_t)(int, int, void *) __attribute__ ((noreturn)); image_entry_arg_t image_entry = - (image_entry_arg_t) spl_image.entry_point; + (image_entry_arg_t)(uintptr_t) spl_image->entry_point; cleanup_before_linux(); - image_entry(0, machid, arg); + image_entry(0, machid, spl_image->arg); } +#endif /* CONFIG_ARM64 */ #endif