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