Prepare v2023.10
[platform/kernel/u-boot.git] / include / spl.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * (C) Copyright 2012
4  * Texas Instruments, <www.ti.com>
5  */
6 #ifndef _SPL_H_
7 #define _SPL_H_
8
9 #include <binman_sym.h>
10 #include <linker_lists.h>
11
12 /* Platform-specific defines */
13 #include <linux/compiler.h>
14 #include <asm/global_data.h>
15 #include <asm/spl.h>
16 #include <handoff.h>
17 #include <mmc.h>
18
19 struct blk_desc;
20 struct legacy_img_hdr;
21
22 /* Value in r0 indicates we booted from U-Boot */
23 #define UBOOT_NOT_LOADED_FROM_SPL       0x13578642
24
25 /* Boot type */
26 #define MMCSD_MODE_UNDEFINED    0
27 #define MMCSD_MODE_RAW          1
28 #define MMCSD_MODE_FS           2
29 #define MMCSD_MODE_EMMCBOOT     3
30
31 struct blk_desc;
32 struct legacy_img_hdr;
33 struct spl_boot_device;
34 enum boot_device;
35
36 /*
37  * u_boot_first_phase() - check if this is the first U-Boot phase
38  *
39  * U-Boot has up to three phases: TPL, SPL and U-Boot proper. Depending on the
40  * build flags we can determine whether the current build is for the first
41  * phase of U-Boot or not. If there is no SPL, then this is U-Boot proper. If
42  * there is SPL but no TPL, the the first phase is SPL. If there is TPL, then
43  * it is the first phase.
44  *
45  * @returns true if this is the first phase of U-Boot
46  *
47  */
48 static inline bool u_boot_first_phase(void)
49 {
50         if (IS_ENABLED(CONFIG_TPL)) {
51                 if (IS_ENABLED(CONFIG_TPL_BUILD))
52                         return true;
53         } else if (IS_ENABLED(CONFIG_SPL)) {
54                 if (IS_ENABLED(CONFIG_SPL_BUILD))
55                         return true;
56         } else {
57                 return true;
58         }
59
60         return false;
61 }
62
63 enum u_boot_phase {
64         PHASE_NONE,     /* Invalid phase, signifying before U-Boot */
65         PHASE_TPL,      /* Running in TPL */
66         PHASE_VPL,      /* Running in VPL */
67         PHASE_SPL,      /* Running in SPL */
68         PHASE_BOARD_F,  /* Running in U-Boot before relocation */
69         PHASE_BOARD_R,  /* Running in U-Boot after relocation */
70
71         PHASE_COUNT,
72 };
73
74 /**
75  * spl_phase() - Find out the phase of U-Boot
76  *
77  * This can be used to avoid #ifdef logic and use if() instead.
78  *
79  * For example, to include code only in TPL, you might do:
80  *
81  *    #ifdef CONFIG_TPL_BUILD
82  *    ...
83  *    #endif
84  *
85  * but with this you can use:
86  *
87  *    if (spl_phase() == PHASE_TPL) {
88  *       ...
89  *    }
90  *
91  * To include code only in SPL, you might do:
92  *
93  *    #if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD)
94  *    ...
95  *    #endif
96  *
97  * but with this you can use:
98  *
99  *    if (spl_phase() == PHASE_SPL) {
100  *       ...
101  *    }
102  *
103  * To include code only in U-Boot proper, you might do:
104  *
105  *    #ifndef CONFIG_SPL_BUILD
106  *    ...
107  *    #endif
108  *
109  * but with this you can use:
110  *
111  *    if (spl_phase() == PHASE_BOARD_F) {
112  *       ...
113  *    }
114  *
115  * Return: U-Boot phase
116  */
117 static inline enum u_boot_phase spl_phase(void)
118 {
119 #ifdef CONFIG_TPL_BUILD
120         return PHASE_TPL;
121 #elif defined(CONFIG_VPL_BUILD)
122         return PHASE_VPL;
123 #elif defined(CONFIG_SPL_BUILD)
124         return PHASE_SPL;
125 #else
126         DECLARE_GLOBAL_DATA_PTR;
127
128         if (!(gd->flags & GD_FLG_RELOC))
129                 return PHASE_BOARD_F;
130         else
131                 return PHASE_BOARD_R;
132 #endif
133 }
134
135 /**
136  * spl_prev_phase() - Figure out the previous U-Boot phase
137  *
138  * Return: the previous phase from this one, e.g. if called in SPL this returns
139  *      PHASE_TPL, if TPL is enabled
140  */
141 static inline enum u_boot_phase spl_prev_phase(void)
142 {
143 #ifdef CONFIG_TPL_BUILD
144         return PHASE_NONE;
145 #elif defined(CONFIG_VPL_BUILD)
146         return PHASE_TPL;       /* VPL requires TPL */
147 #elif defined(CONFIG_SPL_BUILD)
148         return IS_ENABLED(CONFIG_VPL) ? PHASE_VPL :
149                 IS_ENABLED(CONFIG_TPL) ? PHASE_TPL :
150                 PHASE_NONE;
151 #else
152         return IS_ENABLED(CONFIG_SPL) ? PHASE_SPL :
153                 PHASE_NONE;
154 #endif
155 }
156
157 /**
158  * spl_next_phase() - Figure out the next U-Boot phase
159  *
160  * Return: the next phase from this one, e.g. if called in TPL this returns
161  *      PHASE_SPL
162  */
163 static inline enum u_boot_phase spl_next_phase(void)
164 {
165 #ifdef CONFIG_TPL_BUILD
166         return IS_ENABLED(CONFIG_VPL) ? PHASE_VPL : PHASE_SPL;
167 #elif defined(CONFIG_VPL_BUILD)
168         return PHASE_SPL;
169 #else
170         return PHASE_BOARD_F;
171 #endif
172 }
173
174 /**
175  * spl_phase_name() - Get the name of the current phase
176  *
177  * Return: phase name
178  */
179 static inline const char *spl_phase_name(enum u_boot_phase phase)
180 {
181         switch (phase) {
182         case PHASE_TPL:
183                 return "TPL";
184         case PHASE_VPL:
185                 return "VPL";
186         case PHASE_SPL:
187                 return "SPL";
188         case PHASE_BOARD_F:
189         case PHASE_BOARD_R:
190                 return "U-Boot";
191         default:
192                 return "phase?";
193         }
194 }
195
196 /**
197  * spl_phase_prefix() - Get the prefix  of the current phase
198  *
199  * @phase: Phase to look up
200  * Return: phase prefix ("spl", "tpl", etc.)
201  */
202 static inline const char *spl_phase_prefix(enum u_boot_phase phase)
203 {
204         switch (phase) {
205         case PHASE_TPL:
206                 return "tpl";
207         case PHASE_VPL:
208                 return "vpl";
209         case PHASE_SPL:
210                 return "spl";
211         case PHASE_BOARD_F:
212         case PHASE_BOARD_R:
213                 return "";
214         default:
215                 return "phase?";
216         }
217 }
218
219 /* A string name for SPL or TPL */
220 #ifdef CONFIG_SPL_BUILD
221 # ifdef CONFIG_TPL_BUILD
222 #  define SPL_TPL_NAME  "TPL"
223 # elif defined(CONFIG_VPL_BUILD)
224 #  define SPL_TPL_NAME  "VPL"
225 # else
226 #  define SPL_TPL_NAME  "SPL"
227 # endif
228 # define SPL_TPL_PROMPT SPL_TPL_NAME ": "
229 #else
230 # define SPL_TPL_NAME   ""
231 # define SPL_TPL_PROMPT ""
232 #endif
233
234 /**
235  * enum spl_sandbox_flags - flags for sandbox's use of spl_image_info->flags
236  *
237  * @SPL_SANDBOXF_ARG_IS_FNAME: arg is the filename to jump to (default)
238  * @SPL_SANDBOXF_ARG_IS_BUF: arg is the containing image to jump to, @offset is
239  *      the start offset within the image, @size is the size of the image
240  */
241 enum spl_sandbox_flags {
242         SPL_SANDBOXF_ARG_IS_FNAME = 0,
243         SPL_SANDBOXF_ARG_IS_BUF,
244 };
245
246 struct spl_image_info {
247         const char *name;
248         u8 os;
249         uintptr_t load_addr;
250         uintptr_t entry_point;
251 #if CONFIG_IS_ENABLED(LOAD_FIT) || CONFIG_IS_ENABLED(LOAD_FIT_FULL)
252         void *fdt_addr;
253 #endif
254         u32 boot_device;
255         u32 offset;
256         u32 size;
257         u32 flags;
258         void *arg;
259 #ifdef CONFIG_SPL_LEGACY_IMAGE_CRC_CHECK
260         ulong dcrc_data;
261         ulong dcrc_length;
262         ulong dcrc;
263 #endif
264 };
265
266 /**
267  * Information required to load data from a device
268  *
269  * @dev: Pointer to the device, e.g. struct mmc *
270  * @priv: Private data for the device
271  * @bl_len: Block length for reading in bytes
272  * @filename: Name of the fit image file.
273  * @read: Function to call to read from the device
274  */
275 struct spl_load_info {
276         void *dev;
277         void *priv;
278         int bl_len;
279         const char *filename;
280         /**
281          * read() - Read from device
282          *
283          * @load: Information about the load state
284          * @sector: Sector number to read from (each @load->bl_len bytes)
285          * @count: Number of sectors to read
286          * @buf: Buffer to read into
287          * @return number of sectors read, 0 on error
288          */
289         ulong (*read)(struct spl_load_info *load, ulong sector, ulong count,
290                       void *buf);
291 };
292
293 /*
294  * We need to know the position of U-Boot in memory so we can jump to it. We
295  * allow any U-Boot binary to be used (u-boot.bin, u-boot-nodtb.bin,
296  * u-boot.img), hence the '_any'. These is no checking here that the correct
297  * image is found. For example if u-boot.img is used we don't check that
298  * spl_parse_image_header() can parse a valid header.
299  *
300  * Similarly for SPL, so that TPL can jump to SPL.
301  */
302 binman_sym_extern(ulong, u_boot_any, image_pos);
303 binman_sym_extern(ulong, u_boot_any, size);
304 binman_sym_extern(ulong, u_boot_spl_any, image_pos);
305 binman_sym_extern(ulong, u_boot_spl_any, size);
306 binman_sym_extern(ulong, u_boot_vpl_any, image_pos);
307 binman_sym_extern(ulong, u_boot_vpl_any, size);
308
309 /**
310  * spl_get_image_pos() - get the image position of the next phase
311  *
312  * This returns the image position to use to load the next phase of U-Boot
313  */
314 ulong spl_get_image_pos(void);
315
316 /**
317  * spl_get_image_size() - get the size of the next phase
318  *
319  * This returns the size to use to load the next phase of U-Boot
320  */
321 ulong spl_get_image_size(void);
322
323 /**
324  * spl_get_image_text_base() - get the text base of the next phase
325  *
326  * This returns the address that the next stage is linked to run at, i.e.
327  * CONFIG_SPL_TEXT_BASE or CONFIG_TEXT_BASE
328  *
329  * Return: text-base address
330  */
331 ulong spl_get_image_text_base(void);
332
333 /**
334  * spl_load_simple_fit_skip_processing() - Hook to allow skipping the FIT
335  *      image processing during spl_load_simple_fit().
336  *
337  * Return true to skip FIT processing, false to preserve the full code flow
338  * of spl_load_simple_fit().
339  */
340 bool spl_load_simple_fit_skip_processing(void);
341
342 /**
343  * spl_load_simple_fit_fix_load() - Hook to make fixes
344  * after fit image header is loaded
345  *
346  * Returns pointer to fit
347  */
348 void *spl_load_simple_fit_fix_load(const void *fit);
349
350 /**
351  * spl_load_simple_fit() - Loads a fit image from a device.
352  * @spl_image:  Image description to set up
353  * @info:       Structure containing the information required to load data.
354  * @sector:     Sector number where FIT image is located in the device
355  * @fdt:        Pointer to the copied FIT header.
356  *
357  * Reads the FIT image @sector in the device. Loads u-boot image to
358  * specified load address and copies the dtb to end of u-boot image.
359  * Returns 0 on success.
360  */
361 int spl_load_simple_fit(struct spl_image_info *spl_image,
362                         struct spl_load_info *info, ulong sector, void *fdt);
363
364 #define SPL_COPY_PAYLOAD_ONLY   1
365 #define SPL_FIT_FOUND           2
366
367 /**
368  * spl_load_legacy_img() - Loads a legacy image from a device.
369  * @spl_image:  Image description to set up
370  * @load:       Structure containing the information required to load data.
371  * @offset:     Pointer to image
372  * @hdr:        Pointer to image header
373  *
374  * Reads an legacy image from the device. Loads u-boot image to
375  * specified load address.
376  * Returns 0 on success.
377  */
378 int spl_load_legacy_img(struct spl_image_info *spl_image,
379                         struct spl_boot_device *bootdev,
380                         struct spl_load_info *load, ulong offset,
381                         struct legacy_img_hdr *hdr);
382
383
384 /**
385  * spl_load_imx_container() - Loads a imx container image from a device.
386  * @spl_image:  Image description to set up
387  * @info:       Structure containing the information required to load data.
388  * @sector:     Sector number where container image is located in the device
389  *
390  * Reads the container image @sector in the device. Loads u-boot image to
391  * specified load address.
392  */
393 int spl_load_imx_container(struct spl_image_info *spl_image,
394                            struct spl_load_info *info, ulong sector);
395
396 /* SPL common functions */
397 void preloader_console_init(void);
398 u32 spl_boot_device(void);
399
400 /**
401  * spl_spi_boot_bus() - Lookup function for the SPI boot bus source.
402  *
403  * This function returns the SF bus to load from.
404  * If not overridden, it is weakly defined in common/spl/spl_spi.c.
405  */
406 u32 spl_spi_boot_bus(void);
407
408 /**
409  * spl_spi_boot_cs() - Lookup function for the SPI boot CS source.
410  *
411  * This function returns the SF CS to load from.
412  * If not overridden, it is weakly defined in common/spl/spl_spi.c.
413  */
414 u32 spl_spi_boot_cs(void);
415
416 /**
417  * spl_mmc_boot_mode() - Lookup function for the mode of an MMC boot source.
418  * @boot_device:        ID of the device which the MMC driver wants to read
419  *                      from.  Common values are e.g. BOOT_DEVICE_MMC1,
420  *                      BOOT_DEVICE_MMC2, BOOT_DEVICE_MMC2_2.
421  *
422  * This function should return one of MMCSD_MODE_FS, MMCSD_MODE_EMMCBOOT, or
423  * MMCSD_MODE_RAW for each MMC boot source which is defined for the target.  The
424  * boot_device parameter tells which device the MMC driver is interested in.
425  *
426  * If not overridden, it is weakly defined in common/spl/spl_mmc.c.
427  *
428  * Note:  It is important to use the boot_device parameter instead of e.g.
429  * spl_boot_device() as U-Boot is not always loaded from the same device as SPL.
430  */
431 u32 spl_mmc_boot_mode(struct mmc *mmc, const u32 boot_device);
432
433 /**
434  * spl_mmc_boot_partition() - MMC partition to load U-Boot from.
435  * @boot_device:        ID of the device which the MMC driver wants to load
436  *                      U-Boot from.
437  *
438  * This function should return the partition number which the SPL
439  * should load U-Boot from (on the given boot_device) when
440  * CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION is set.
441  *
442  * If not overridden, it is weakly defined in common/spl/spl_mmc.c.
443  */
444 int spl_mmc_boot_partition(const u32 boot_device);
445
446 struct mmc;
447 /**
448  * default_spl_mmc_emmc_boot_partition() - eMMC boot partition to load U-Boot from.
449  * mmc:                 Pointer for the mmc device structure
450  *
451  * This function should return the eMMC boot partition number which
452  * the SPL should load U-Boot from (on the given boot_device).
453  */
454 int default_spl_mmc_emmc_boot_partition(struct mmc *mmc);
455
456 /**
457  * spl_mmc_emmc_boot_partition() - eMMC boot partition to load U-Boot from.
458  * mmc:                 Pointer for the mmc device structure
459  *
460  * This function should return the eMMC boot partition number which
461  * the SPL should load U-Boot from (on the given boot_device).
462  *
463  * If not overridden, it is weakly defined in common/spl/spl_mmc.c
464  * and calls default_spl_mmc_emmc_boot_partition();
465  */
466 int spl_mmc_emmc_boot_partition(struct mmc *mmc);
467
468 void spl_set_bd(void);
469
470 /**
471  * spl_mmc_get_uboot_raw_sector() - Provide raw sector of the start of U-Boot
472  *
473  * This is a weak function which by default will provide the raw sector that is
474  * where the start of the U-Boot image has been written to.
475  *
476  * @mmc: struct mmc that describes the devie where U-Boot resides
477  * @raw_sect: The raw sector number where U-Boot is by default.
478  * Return: The raw sector location that U-Boot resides at
479  */
480 unsigned long spl_mmc_get_uboot_raw_sector(struct mmc *mmc,
481                                            unsigned long raw_sect);
482
483 /**
484  * spl_set_header_raw_uboot() - Set up a standard SPL image structure
485  *
486  * This sets up the given spl_image which the standard values obtained from
487  * config options: CONFIG_SYS_MONITOR_LEN, CFG_SYS_UBOOT_START,
488  * CONFIG_TEXT_BASE.
489  *
490  * @spl_image: Image description to set up
491  */
492 void spl_set_header_raw_uboot(struct spl_image_info *spl_image);
493
494 /**
495  * spl_parse_image_header() - parse the image header and set up info
496  *
497  * This parses the legacy image header information at @header and sets up
498  * @spl_image according to what is found. If no image header is found, then
499  * a raw image or bootz is assumed. If CONFIG_SPL_PANIC_ON_RAW_IMAGE is
500  * enabled, then this causes a panic. If CONFIG_SPL_RAW_IMAGE_SUPPORT is not
501  * enabled then U-Boot gives up. Otherwise U-Boot sets up the image using
502  * spl_set_header_raw_uboot(), or possibly the bootz header.
503  *
504  * @spl_image: Image description to set up
505  * @header image header to parse
506  * Return: 0 if a header was correctly parsed, -ve on error
507  */
508 int spl_parse_image_header(struct spl_image_info *spl_image,
509                            const struct spl_boot_device *bootdev,
510                            const struct legacy_img_hdr *header);
511
512 void spl_board_prepare_for_linux(void);
513
514 /**
515  * spl_board_prepare_for_optee() - Prepare board for an OPTEE payload
516  *
517  * Prepares the board for booting an OP-TEE payload. Initialization is platform
518  * specific, and may include configuring the TrustZone memory, and other
519  * initialization steps required by OP-TEE.
520  * Note that @fdt is not used directly by OP-TEE. OP-TEE passes this @fdt to
521  * its normal world target. This target is not guaranteed to be u-boot, so @fdt
522  * changes that would normally be done by u-boot should be done in this step.
523  *
524  * @fdt: Devicetree that will be passed on, or NULL
525  */
526 void spl_board_prepare_for_optee(void *fdt);
527 void spl_board_prepare_for_boot(void);
528 int spl_board_ubi_load_image(u32 boot_device);
529 int spl_board_boot_device(enum boot_device boot_dev_spl);
530
531 /**
532  * spl_board_loader_name() - Return a name for the loader
533  *
534  * This is a weak function which might be overridden by the board code. With
535  * that a board specific value for the device where the U-Boot will be loaded
536  * from can be set. By default it returns NULL.
537  *
538  * @boot_device:        ID of the device which SPL wants to load U-Boot from.
539  */
540 const char *spl_board_loader_name(u32 boot_device);
541
542 /**
543  * jump_to_image_linux() - Jump to a Linux kernel from SPL
544  *
545  * This jumps into a Linux kernel using the information in @spl_image.
546  *
547  * @spl_image: Image description to set up
548  */
549 void __noreturn jump_to_image_linux(struct spl_image_info *spl_image);
550
551 /**
552  * jump_to_image_optee() - Jump to OP-TEE OS from SPL
553  *
554  * This jumps into OP-TEE OS using the information in @spl_image.
555  *
556  * @spl_image: Image description to set up
557  */
558 void __noreturn jump_to_image_optee(struct spl_image_info *spl_image);
559
560 /**
561  * spl_start_uboot() - Check if SPL should start the kernel or U-Boot
562  *
563  * This is called by the various SPL loaders to determine whether the board
564  * wants to load the kernel or U-Boot. This function should be provided by
565  * the board.
566  *
567  * Return: 0 if SPL should start the kernel, 1 if U-Boot must be started
568  */
569 int spl_start_uboot(void);
570
571 /**
572  * spl_display_print() - Display a board-specific message in SPL
573  *
574  * If CONFIG_SPL_DISPLAY_PRINT is enabled, U-Boot will call this function
575  * immediately after displaying the SPL console banner ("U-Boot SPL ...").
576  * This function should be provided by the board.
577  */
578 void spl_display_print(void);
579
580 /**
581  * struct spl_boot_device - Describes a boot device used by SPL
582  *
583  * @boot_device: A number indicating the BOOT_DEVICE type. There are various
584  * BOOT_DEVICE... #defines and enums in U-Boot and they are not consistently
585  * numbered.
586  * @boot_device_name: Named boot device, or NULL if none.
587  *
588  * Note: Additional fields can be added here, bearing in mind that SPL is
589  * size-sensitive and common fields will be present on all boards. This
590  * struct can also be used to return additional information about the load
591  * process if that becomes useful.
592  */
593 struct spl_boot_device {
594         uint boot_device;
595         const char *boot_device_name;
596 };
597
598 /**
599  * Holds information about a way of loading an SPL image
600  *
601  * @name: User-friendly name for this method (e.g. "MMC")
602  * @boot_device: Boot device that this loader supports
603  * @load_image: Function to call to load image
604  */
605 struct spl_image_loader {
606 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
607         const char *name;
608 #endif
609         uint boot_device;
610         /**
611          * load_image() - Load an SPL image
612          *
613          * @spl_image: place to put image information
614          * @bootdev: describes the boot device to load from
615          */
616         int (*load_image)(struct spl_image_info *spl_image,
617                           struct spl_boot_device *bootdev);
618 };
619
620 /* Helper function for accessing the name */
621 static inline const char *spl_loader_name(const struct spl_image_loader *loader)
622 {
623 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
624         const char *name;
625         name = spl_board_loader_name(loader->boot_device);
626         return name ?: loader->name;
627 #else
628         return NULL;
629 #endif
630 }
631
632 /* Declare an SPL image loader */
633 #define SPL_LOAD_IMAGE(__name)                                  \
634         ll_entry_declare(struct spl_image_loader, __name, spl_image_loader)
635
636 /*
637  * _priority is the priority of this method, 0 meaning it will be the top
638  * choice for this device, 9 meaning it is the bottom choice.
639  * _boot_device is the BOOT_DEVICE_... value
640  * _method is the load_image function to call
641  */
642 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
643 #define SPL_LOAD_IMAGE_METHOD(_name, _priority, _boot_device, _method) \
644         SPL_LOAD_IMAGE(_boot_device ## _priority ## _method) = { \
645                 .name = _name, \
646                 .boot_device = _boot_device, \
647                 .load_image = _method, \
648         }
649 #else
650 #define SPL_LOAD_IMAGE_METHOD(_name, _priority, _boot_device, _method) \
651         SPL_LOAD_IMAGE(_boot_device ## _priority ## _method) = { \
652                 .boot_device = _boot_device, \
653                 .load_image = _method, \
654         }
655 #endif
656
657 /* SPL FAT image functions */
658 int spl_load_image_fat(struct spl_image_info *spl_image,
659                        struct spl_boot_device *bootdev,
660                        struct blk_desc *block_dev, int partition,
661                        const char *filename);
662 int spl_load_image_fat_os(struct spl_image_info *spl_image,
663                           struct spl_boot_device *bootdev,
664                           struct blk_desc *block_dev, int partition);
665
666 void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image);
667
668 /* SPL EXT image functions */
669 int spl_load_image_ext(struct spl_image_info *spl_image,
670                        struct spl_boot_device *bootdev,
671                        struct blk_desc *block_dev, int partition,
672                        const char *filename);
673 int spl_load_image_ext_os(struct spl_image_info *spl_image,
674                           struct spl_boot_device *bootdev,
675                           struct blk_desc *block_dev, int partition);
676 int spl_blk_load_image(struct spl_image_info *spl_image,
677                        struct spl_boot_device *bootdev,
678                        enum uclass_id uclass_id, int devnum, int partnum);
679
680 /**
681  * spl_early_init() - Set up device tree and driver model in SPL if enabled
682  *
683  * Call this function in board_init_f() if you want to use device tree and
684  * driver model early, before board_init_r() is called.
685  *
686  * If this is not called, then driver model will be inactive in SPL's
687  * board_init_f(), and no device tree will be available.
688  */
689 int spl_early_init(void);
690
691 /**
692  * spl_init() - Set up device tree and driver model in SPL if enabled
693  *
694  * You can optionally call spl_early_init(), then optionally call spl_init().
695  * This function will be called from board_init_r() if not called earlier.
696  *
697  * Both spl_early_init() and spl_init() perform a similar function except that
698  * the latter will not set up the malloc() area if
699  * CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN is enabled, since it is assumed to
700  * already be done by a calll to spl_relocate_stack_gd() before board_init_r()
701  * is reached.
702  *
703  * This function will be called from board_init_r() if not called earlier.
704  *
705  * If this is not called, then driver model will be inactive in SPL's
706  * board_init_f(), and no device tree will be available.
707  */
708 int spl_init(void);
709
710 #ifdef CONFIG_SPL_BOARD_INIT
711 void spl_board_init(void);
712 #endif
713
714 /**
715  * spl_was_boot_source() - check if U-Boot booted from SPL
716  *
717  * This will normally be true, but if U-Boot jumps to second U-Boot, it will
718  * be false. This should be implemented by board-specific code.
719  *
720  * Return: true if U-Boot booted from SPL, else false
721  */
722 bool spl_was_boot_source(void);
723
724 /**
725  * spl_dfu_cmd- run dfu command with chosen mmc device interface
726  * @param usb_index - usb controller number
727  * @param mmc_dev -  mmc device nubmer
728  *
729  * Return: 0 on success, otherwise error code
730  */
731 int spl_dfu_cmd(int usbctrl, char *dfu_alt_info, char *interface, char *devstr);
732
733 int spl_mmc_load_image(struct spl_image_info *spl_image,
734                        struct spl_boot_device *bootdev);
735
736 /**
737  * spl_mmc_load() - Load an image file from MMC/SD media
738  *
739  * @param spl_image     Image data filled in by loading process
740  * @param bootdev       Describes which device to load from
741  * @param filename      Name of file to load (in FS mode)
742  * @param raw_part      Partition to load from (in RAW mode)
743  * @param raw_sect      Sector to load from (in RAW mode)
744  *
745  * Return: 0 on success, otherwise error code
746  */
747 int spl_mmc_load(struct spl_image_info *spl_image,
748                  struct spl_boot_device *bootdev,
749                  const char *filename,
750                  int raw_part,
751                  unsigned long raw_sect);
752
753 /**
754  * spl_usb_load() - Load an image file from USB mass storage
755  *
756  * @param spl_image     Image data filled in by loading process
757  * @param bootdev       Describes which device to load from
758  * @param raw_part      Fat partition to load from
759  * @param filename      Name of file to load
760  *
761  * Return: 0 on success, otherwise error code
762  */
763 int spl_usb_load(struct spl_image_info *spl_image,
764                  struct spl_boot_device *bootdev,
765                  int partition, const char *filename);
766
767 int spl_ymodem_load_image(struct spl_image_info *spl_image,
768                           struct spl_boot_device *bootdev);
769
770 /**
771  * spl_invoke_atf - boot using an ARM trusted firmware image
772  */
773 void spl_invoke_atf(struct spl_image_info *spl_image);
774
775 /**
776  * bl2_plat_get_bl31_params() - return params for bl31.
777  * @bl32_entry: address of BL32 executable (secure)
778  * @bl33_entry: address of BL33 executable (non secure)
779  * @fdt_addr:   address of Flat Device Tree
780  *
781  * This is a weak function which might be overridden by the board code. By
782  * default it will just call bl2_plat_get_bl31_params_default().
783  *
784  * If you just want to manipulate or add some parameters, you can override
785  * this function, call bl2_plat_get_bl31_params_default and operate on the
786  * returned bl31 params.
787  *
788  * Return: bl31 params structure pointer
789  */
790 struct bl31_params *bl2_plat_get_bl31_params(uintptr_t bl32_entry,
791                                              uintptr_t bl33_entry,
792                                              uintptr_t fdt_addr);
793
794 /**
795  * bl2_plat_get_bl31_params_default() - prepare params for bl31.
796  * @bl32_entry: address of BL32 executable (secure)
797  * @bl33_entry: address of BL33 executable (non secure)
798  * @fdt_addr:   address of Flat Device Tree
799  *
800  * This is the default implementation of bl2_plat_get_bl31_params(). It assigns
801  * a pointer to the memory that the platform has kept aside to pass platform
802  * specific and trusted firmware related information to BL31. This memory is
803  * allocated by allocating memory to bl2_to_bl31_params_mem structure which is
804  * a superset of all the structure whose information is passed to BL31
805  *
806  * NOTE: The memory is statically allocated, thus this function should be
807  * called only once. All subsequent calls will overwrite any changes.
808  *
809  * Return: bl31 params structure pointer
810  */
811 struct bl31_params *bl2_plat_get_bl31_params_default(uintptr_t bl32_entry,
812                                                      uintptr_t bl33_entry,
813                                                      uintptr_t fdt_addr);
814
815 /**
816  * bl2_plat_get_bl31_params_v2() - return params for bl31
817  * @bl32_entry: address of BL32 executable (secure)
818  * @bl33_entry: address of BL33 executable (non secure)
819  * @fdt_addr:   address of Flat Device Tree
820  *
821  * This function does the same as bl2_plat_get_bl31_params() except that is is
822  * used for the new LOAD_IMAGE_V2 option, which uses a slightly different
823  * method to pass the parameters.
824  *
825  * Return: bl31 params structure pointer
826  */
827 struct bl_params *bl2_plat_get_bl31_params_v2(uintptr_t bl32_entry,
828                                               uintptr_t bl33_entry,
829                                               uintptr_t fdt_addr);
830
831 /**
832  * bl2_plat_get_bl31_params_v2_default() - prepare params for bl31.
833  * @bl32_entry: address of BL32 executable (secure)
834  * @bl33_entry: address of BL33 executable (non secure)
835  * @fdt_addr:   address of Flat Device Tree
836  *
837  * This is the default implementation of bl2_plat_get_bl31_params_v2(). It
838  * prepares the linked list of the bl31 params, populates the image types and
839  * set the entry points for bl32 and bl33 (if available).
840  *
841  * NOTE: The memory is statically allocated, thus this function should be
842  * called only once. All subsequent calls will overwrite any changes.
843  *
844  * Return: bl31 params structure pointer
845  */
846 struct bl_params *bl2_plat_get_bl31_params_v2_default(uintptr_t bl32_entry,
847                                                       uintptr_t bl33_entry,
848                                                       uintptr_t fdt_addr);
849 /**
850  * spl_optee_entry - entry function for optee
851  *
852  * args defind in op-tee project
853  * https://github.com/OP-TEE/optee_os/
854  * core/arch/arm/kernel/generic_entry_a32.S
855  * @arg0: pagestore
856  * @arg1: (ARMv7 standard bootarg #1)
857  * @arg2: device tree address, (ARMv7 standard bootarg #2)
858  * @arg3: non-secure entry address (ARMv7 bootarg #0)
859  */
860 void __noreturn spl_optee_entry(void *arg0, void *arg1, void *arg2, void *arg3);
861
862 /**
863  * spl_invoke_opensbi - boot using a RISC-V OpenSBI image
864  */
865 void __noreturn spl_invoke_opensbi(struct spl_image_info *spl_image);
866
867 /**
868  * board_return_to_bootrom - allow for boards to continue with the boot ROM
869  *
870  * If a board (e.g. the Rockchip RK3368 boards) provide some
871  * supporting functionality for SPL in their boot ROM and the SPL
872  * stage wants to return to the ROM code to continue booting, boards
873  * can implement 'board_return_to_bootrom'.
874  */
875 int board_return_to_bootrom(struct spl_image_info *spl_image,
876                             struct spl_boot_device *bootdev);
877
878 /**
879  * board_spl_fit_size_align - specific size align before processing payload
880  *
881  */
882 ulong board_spl_fit_size_align(ulong size);
883
884 /**
885  * spl_perform_fixups() - arch/board-specific callback before processing
886  *                        the boot-payload
887  */
888 void spl_perform_fixups(struct spl_image_info *spl_image);
889
890 /*
891  * spl_get_load_buffer() - get buffer for loading partial image data
892  *
893  * Returns memory area which can be populated by partial image data,
894  * ie. uImage or fitImage header.
895  */
896 struct legacy_img_hdr *spl_get_load_buffer(ssize_t offset, size_t size);
897
898 void board_boot_order(u32 *spl_boot_list);
899 void spl_save_restore_data(void);
900 #endif