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