xref: /openbmc/u-boot/arch/arm/lib/spl.c (revision 70b26cd057f42c7126088b49d4285955c8a00eae)
1  /*
2   * (C) Copyright 2010-2012
3   * Texas Instruments, <www.ti.com>
4   *
5   * Aneesh V <aneesh@ti.com>
6   * Tom Rini <trini@ti.com>
7   *
8   * SPDX-License-Identifier:	GPL-2.0+
9   */
10  #include <common.h>
11  #include <config.h>
12  #include <spl.h>
13  #include <image.h>
14  #include <linux/compiler.h>
15  
16  #ifndef CONFIG_SPL_DM
17  /* Pointer to as well as the global data structure for SPL */
18  DECLARE_GLOBAL_DATA_PTR;
19  
20  /*
21   * WARNING: This is going away very soon. Don't use it and don't submit
22   * pafches that rely on it. The global_data area is set up in crt0.S.
23   */
24  gd_t gdata __attribute__ ((section(".data")));
25  #endif
26  
27  /*
28   * In the context of SPL, board_init_f() prepares the hardware for execution
29   * from system RAM (DRAM, DDR...). As system RAM may not be available yet,
30   * board_init_f() must use the current GD to store any data which must be
31   * passed on to later stages. These data include the relocation destination,
32   * the future stack, and the future GD location. BSS is cleared after this
33   * function (and therefore must be accessible).
34   *
35   * We provide this version by default but mark it as __weak to allow for
36   * platforms to do this in their own way if needed. Please see the top
37   * level U-Boot README "Board Initialization Flow" section for info on what
38   * to put in this function.
39   */
40  void __weak board_init_f(ulong dummy)
41  {
42  }
43  
44  /*
45   * This function jumps to an image with argument. Normally an FDT or ATAGS
46   * image.
47   * arg: Pointer to paramter image in RAM
48   */
49  #ifdef CONFIG_SPL_OS_BOOT
50  void __noreturn jump_to_image_linux(struct spl_image_info *spl_image, void *arg)
51  {
52  	unsigned long machid = 0xffffffff;
53  #ifdef CONFIG_MACH_TYPE
54  	machid = CONFIG_MACH_TYPE;
55  #endif
56  
57  	debug("Entering kernel arg pointer: 0x%p\n", arg);
58  	typedef void (*image_entry_arg_t)(int, int, void *)
59  		__attribute__ ((noreturn));
60  	image_entry_arg_t image_entry =
61  		(image_entry_arg_t)(uintptr_t) spl_image->entry_point;
62  	cleanup_before_linux();
63  	image_entry(0, machid, arg);
64  }
65  #endif
66