]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | // SPDX-License-Identifier: GPL-2.0+ |
6507f133 TR |
2 | /* |
3 | * (C) Copyright 2010-2012 | |
4 | * Texas Instruments, <www.ti.com> | |
5 | * | |
6 | * Aneesh V <aneesh@ti.com> | |
7 | * Tom Rini <trini@ti.com> | |
6507f133 | 8 | */ |
fb97b862 | 9 | |
d678a59d | 10 | #include <common.h> |
6507f133 | 11 | #include <config.h> |
691d719d | 12 | #include <init.h> |
f7ae49fc | 13 | #include <log.h> |
6507f133 TR |
14 | #include <spl.h> |
15 | #include <image.h> | |
90526e9f | 16 | #include <asm/cache.h> |
401d1c4f | 17 | #include <asm/global_data.h> |
6507f133 | 18 | #include <linux/compiler.h> |
c62db35d | 19 | #include <asm/mach-types.h> |
6507f133 | 20 | |
b5d92ba1 | 21 | #ifndef CONFIG_SPL_DM |
6507f133 TR |
22 | /* Pointer to as well as the global data structure for SPL */ |
23 | DECLARE_GLOBAL_DATA_PTR; | |
480ca13e SG |
24 | |
25 | /* | |
26 | * WARNING: This is going away very soon. Don't use it and don't submit | |
27 | * pafches that rely on it. The global_data area is set up in crt0.S. | |
28 | */ | |
236f2ec4 | 29 | gd_t gdata __section(".data"); |
fc8fdc76 | 30 | #endif |
6507f133 TR |
31 | |
32 | /* | |
b8cb51d0 JH |
33 | * In the context of SPL, board_init_f() prepares the hardware for execution |
34 | * from system RAM (DRAM, DDR...). As system RAM may not be available yet, | |
35 | * board_init_f() must use the current GD to store any data which must be | |
36 | * passed on to later stages. These data include the relocation destination, | |
37 | * the future stack, and the future GD location. BSS is cleared after this | |
38 | * function (and therefore must be accessible). | |
39 | * | |
40 | * We provide this version by default but mark it as __weak to allow for | |
41 | * platforms to do this in their own way if needed. Please see the top | |
42 | * level U-Boot README "Board Initialization Flow" section for info on what | |
43 | * to put in this function. | |
6507f133 TR |
44 | */ |
45 | void __weak board_init_f(ulong dummy) | |
46 | { | |
6507f133 TR |
47 | } |
48 | ||
49 | /* | |
50 | * This function jumps to an image with argument. Normally an FDT or ATAGS | |
51 | * image. | |
6507f133 | 52 | */ |
7115007c | 53 | #if CONFIG_IS_ENABLED(OS_BOOT) |
fb97b862 YS |
54 | #ifdef CONFIG_ARM64 |
55 | void __noreturn jump_to_image_linux(struct spl_image_info *spl_image) | |
56 | { | |
57 | debug("Entering kernel arg pointer: 0x%p\n", spl_image->arg); | |
58 | cleanup_before_linux(); | |
59 | armv8_switch_to_el2((u64)spl_image->arg, 0, 0, 0, | |
60 | spl_image->entry_point, ES_TO_AARCH64); | |
61 | } | |
62 | #else | |
5bf5250e | 63 | void __noreturn jump_to_image_linux(struct spl_image_info *spl_image) |
6507f133 | 64 | { |
ec101fdb TR |
65 | unsigned long machid = 0xffffffff; |
66 | #ifdef CONFIG_MACH_TYPE | |
67 | machid = CONFIG_MACH_TYPE; | |
68 | #endif | |
69 | ||
5bf5250e | 70 | debug("Entering kernel arg pointer: 0x%p\n", spl_image->arg); |
6507f133 TR |
71 | typedef void (*image_entry_arg_t)(int, int, void *) |
72 | __attribute__ ((noreturn)); | |
73 | image_entry_arg_t image_entry = | |
ca12e65c | 74 | (image_entry_arg_t)(uintptr_t) spl_image->entry_point; |
6507f133 | 75 | cleanup_before_linux(); |
5bf5250e | 76 | image_entry(0, machid, spl_image->arg); |
6507f133 | 77 | } |
fb97b862 | 78 | #endif /* CONFIG_ARM64 */ |
6507f133 | 79 | #endif |
949eb228 RS |
80 | |
81 | #if CONFIG_IS_ENABLED(OPTEE_IMAGE) | |
82 | void __noreturn jump_to_image_optee(struct spl_image_info *spl_image) | |
83 | { | |
84 | /* flush and turn off caches before jumping to OPTEE */ | |
85 | cleanup_before_linux(); | |
86 | ||
87 | spl_optee_entry(NULL, NULL, spl_image->fdt_addr, | |
88 | (void *)spl_image->entry_point); | |
89 | } | |
90 | #endif |