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() - Loads a fit image from a device.
 309 * @spl_image:  Image description to set up
 310 * @info:       Structure containing the information required to load data.
 311 * @sector:     Sector number where FIT image is located in the device
 312 * @fdt:        Pointer to the copied FIT header.
 313 *
 314 * Reads the FIT image @sector in the device. Loads u-boot image to
 315 * specified load address and copies the dtb to end of u-boot image.
 316 * Returns 0 on success.
 317 */
 318int spl_load_simple_fit(struct spl_image_info *spl_image,
 319                        struct spl_load_info *info, ulong sector, void *fdt);
 320
 321#define SPL_COPY_PAYLOAD_ONLY   1
 322#define SPL_FIT_FOUND           2
 323
 324/**
 325 * spl_load_legacy_img() - Loads a legacy image from a device.
 326 * @spl_image:  Image description to set up
 327 * @load:       Structure containing the information required to load data.
 328 * @header:     Pointer to image header (including appended image)
 329 *
 330 * Reads an legacy image from the device. Loads u-boot image to
 331 * specified load address.
 332 * Returns 0 on success.
 333 */
 334int spl_load_legacy_img(struct spl_image_info *spl_image,
 335                        struct spl_load_info *load, ulong header);
 336
 337/**
 338 * spl_load_imx_container() - Loads a imx container image from a device.
 339 * @spl_image:  Image description to set up
 340 * @info:       Structure containing the information required to load data.
 341 * @sector:     Sector number where container image is located in the device
 342 *
 343 * Reads the container image @sector in the device. Loads u-boot image to
 344 * specified load address.
 345 */
 346int spl_load_imx_container(struct spl_image_info *spl_image,
 347                           struct spl_load_info *info, ulong sector);
 348
 349/* SPL common functions */
 350void preloader_console_init(void);
 351u32 spl_boot_device(void);
 352
 353/**
 354 * spl_mmc_boot_mode() - Lookup function for the mode of an MMC boot source.
 355 * @boot_device:        ID of the device which the MMC driver wants to read
 356 *                      from.  Common values are e.g. BOOT_DEVICE_MMC1,
 357 *                      BOOT_DEVICE_MMC2, BOOT_DEVICE_MMC2_2.
 358 *
 359 * This function should return one of MMCSD_MODE_FS, MMCSD_MODE_EMMCBOOT, or
 360 * MMCSD_MODE_RAW for each MMC boot source which is defined for the target.  The
 361 * boot_device parameter tells which device the MMC driver is interested in.
 362 *
 363 * If not overridden, it is weakly defined in common/spl/spl_mmc.c.
 364 *
 365 * Note:  It is important to use the boot_device parameter instead of e.g.
 366 * spl_boot_device() as U-Boot is not always loaded from the same device as SPL.
 367 */
 368u32 spl_mmc_boot_mode(const u32 boot_device);
 369
 370/**
 371 * spl_mmc_boot_partition() - MMC partition to load U-Boot from.
 372 * @boot_device:        ID of the device which the MMC driver wants to load
 373 *                      U-Boot from.
 374 *
 375 * This function should return the partition number which the SPL
 376 * should load U-Boot from (on the given boot_device) when
 377 * CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION is set.
 378 *
 379 * If not overridden, it is weakly defined in common/spl/spl_mmc.c.
 380 */
 381int spl_mmc_boot_partition(const u32 boot_device);
 382
 383struct mmc;
 384/**
 385 * default_spl_mmc_emmc_boot_partition() - eMMC boot partition to load U-Boot from.
 386 * mmc:                 Pointer for the mmc device structure
 387 *
 388 * This function should return the eMMC boot partition number which
 389 * the SPL should load U-Boot from (on the given boot_device).
 390 */
 391int default_spl_mmc_emmc_boot_partition(struct mmc *mmc);
 392
 393/**
 394 * spl_mmc_emmc_boot_partition() - eMMC boot partition to load U-Boot from.
 395 * mmc:                 Pointer for the mmc device structure
 396 *
 397 * This function should return the eMMC boot partition number which
 398 * the SPL should load U-Boot from (on the given boot_device).
 399 *
 400 * If not overridden, it is weakly defined in common/spl/spl_mmc.c
 401 * and calls default_spl_mmc_emmc_boot_partition();
 402 */
 403int spl_mmc_emmc_boot_partition(struct mmc *mmc);
 404
 405void spl_set_bd(void);
 406
 407/**
 408 * spl_set_header_raw_uboot() - Set up a standard SPL image structure
 409 *
 410 * This sets up the given spl_image which the standard values obtained from
 411 * config options: CONFIG_SYS_MONITOR_LEN, CONFIG_SYS_UBOOT_START,
 412 * CONFIG_SYS_TEXT_BASE.
 413 *
 414 * @spl_image: Image description to set up
 415 */
 416void spl_set_header_raw_uboot(struct spl_image_info *spl_image);
 417
 418/**
 419 * spl_parse_image_header() - parse the image header and set up info
 420 *
 421 * This parses the legacy image header information at @header and sets up
 422 * @spl_image according to what is found. If no image header is found, then
 423 * a raw image or bootz is assumed. If CONFIG_SPL_PANIC_ON_RAW_IMAGE is
 424 * enabled, then this causes a panic. If CONFIG_SPL_RAW_IMAGE_SUPPORT is not
 425 * enabled then U-Boot gives up. Otherwise U-Boot sets up the image using
 426 * spl_set_header_raw_uboot(), or possibly the bootz header.
 427 *
 428 * @spl_image: Image description to set up
 429 * @header image header to parse
 430 * @return 0 if a header was correctly parsed, -ve on error
 431 */
 432int spl_parse_image_header(struct spl_image_info *spl_image,
 433                           const struct image_header *header);
 434
 435void spl_board_prepare_for_linux(void);
 436
 437/**
 438 * spl_board_prepare_for_optee() - Prepare board for an OPTEE payload
 439 *
 440 * Prepares the board for booting an OP-TEE payload. Initialization is platform
 441 * specific, and may include configuring the TrustZone memory, and other
 442 * initialization steps required by OP-TEE.
 443 * Note that @fdt is not used directly by OP-TEE. OP-TEE passes this @fdt to
 444 * its normal world target. This target is not guaranteed to be u-boot, so @fdt
 445 * changes that would normally be done by u-boot should be done in this step.
 446 *
 447 * @fdt: Devicetree that will be passed on, or NULL
 448 */
 449void spl_board_prepare_for_optee(void *fdt);
 450void spl_board_prepare_for_boot(void);
 451int spl_board_ubi_load_image(u32 boot_device);
 452int spl_board_boot_device(u32 boot_device);
 453
 454/**
 455 * jump_to_image_linux() - Jump to a Linux kernel from SPL
 456 *
 457 * This jumps into a Linux kernel using the information in @spl_image.
 458 *
 459 * @spl_image: Image description to set up
 460 */
 461void __noreturn jump_to_image_linux(struct spl_image_info *spl_image);
 462
 463/**
 464 * spl_start_uboot() - Check if SPL should start the kernel or U-Boot
 465 *
 466 * This is called by the various SPL loaders to determine whether the board
 467 * wants to load the kernel or U-Boot. This function should be provided by
 468 * the board.
 469 *
 470 * @return 0 if SPL should start the kernel, 1 if U-Boot must be started
 471 */
 472int spl_start_uboot(void);
 473
 474/**
 475 * spl_display_print() - Display a board-specific message in SPL
 476 *
 477 * If CONFIG_SPL_DISPLAY_PRINT is enabled, U-Boot will call this function
 478 * immediately after displaying the SPL console banner ("U-Boot SPL ...").
 479 * This function should be provided by the board.
 480 */
 481void spl_display_print(void);
 482
 483/**
 484 * struct spl_boot_device - Describes a boot device used by SPL
 485 *
 486 * @boot_device: A number indicating the BOOT_DEVICE type. There are various
 487 * BOOT_DEVICE... #defines and enums in U-Boot and they are not consistently
 488 * numbered.
 489 * @boot_device_name: Named boot device, or NULL if none.
 490 *
 491 * Note: Additional fields can be added here, bearing in mind that SPL is
 492 * size-sensitive and common fields will be present on all boards. This
 493 * struct can also be used to return additional information about the load
 494 * process if that becomes useful.
 495 */
 496struct spl_boot_device {
 497        uint boot_device;
 498        const char *boot_device_name;
 499};
 500
 501/**
 502 * Holds information about a way of loading an SPL image
 503 *
 504 * @name: User-friendly name for this method (e.g. "MMC")
 505 * @boot_device: Boot device that this loader supports
 506 * @load_image: Function to call to load image
 507 */
 508struct spl_image_loader {
 509#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
 510        const char *name;
 511#endif
 512        uint boot_device;
 513        /**
 514         * load_image() - Load an SPL image
 515         *
 516         * @spl_image: place to put image information
 517         * @bootdev: describes the boot device to load from
 518         */
 519        int (*load_image)(struct spl_image_info *spl_image,
 520                          struct spl_boot_device *bootdev);
 521};
 522
 523/* Helper function for accessing the name */
 524static inline const char *spl_loader_name(const struct spl_image_loader *loader)
 525{
 526#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
 527        return loader->name;
 528#else
 529        return NULL;
 530#endif
 531}
 532
 533/* Declare an SPL image loader */
 534#define SPL_LOAD_IMAGE(__name)                                  \
 535        ll_entry_declare(struct spl_image_loader, __name, spl_image_loader)
 536
 537/*
 538 * _priority is the priority of this method, 0 meaning it will be the top
 539 * choice for this device, 9 meaning it is the bottom choice.
 540 * _boot_device is the BOOT_DEVICE_... value
 541 * _method is the load_image function to call
 542 */
 543#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
 544#define SPL_LOAD_IMAGE_METHOD(_name, _priority, _boot_device, _method) \
 545        SPL_LOAD_IMAGE(_boot_device ## _priority ## _method) = { \
 546                .name = _name, \
 547                .boot_device = _boot_device, \
 548                .load_image = _method, \
 549        }
 550#else
 551#define SPL_LOAD_IMAGE_METHOD(_name, _priority, _boot_device, _method) \
 552        SPL_LOAD_IMAGE(_boot_device ## _priority ## _method) = { \
 553                .boot_device = _boot_device, \
 554                .load_image = _method, \
 555        }
 556#endif
 557
 558/* SPL FAT image functions */
 559int spl_load_image_fat(struct spl_image_info *spl_image,
 560                       struct blk_desc *block_dev, int partition,
 561                       const char *filename);
 562int spl_load_image_fat_os(struct spl_image_info *spl_image,
 563                          struct blk_desc *block_dev, int partition);
 564
 565void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image);
 566
 567/* SPL EXT image functions */
 568int spl_load_image_ext(struct spl_image_info *spl_image,
 569                       struct blk_desc *block_dev, int partition,
 570                       const char *filename);
 571int spl_load_image_ext_os(struct spl_image_info *spl_image,
 572                          struct blk_desc *block_dev, int partition);
 573
 574/**
 575 * spl_early_init() - Set up device tree and driver model in SPL if enabled
 576 *
 577 * Call this function in board_init_f() if you want to use device tree and
 578 * driver model early, before board_init_r() is called.
 579 *
 580 * If this is not called, then driver model will be inactive in SPL's
 581 * board_init_f(), and no device tree will be available.
 582 */
 583int spl_early_init(void);
 584
 585/**
 586 * spl_init() - Set up device tree and driver model in SPL if enabled
 587 *
 588 * You can optionally call spl_early_init(), then optionally call spl_init().
 589 * This function will be called from board_init_r() if not called earlier.
 590 *
 591 * Both spl_early_init() and spl_init() perform a similar function except that
 592 * the latter will not set up the malloc() area if
 593 * CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN is enabled, since it is assumed to
 594 * already be done by a calll to spl_relocate_stack_gd() before board_init_r()
 595 * is reached.
 596 *
 597 * This function will be called from board_init_r() if not called earlier.
 598 *
 599 * If this is not called, then driver model will be inactive in SPL's
 600 * board_init_f(), and no device tree will be available.
 601 */
 602int spl_init(void);
 603
 604#ifdef CONFIG_SPL_BOARD_INIT
 605void spl_board_init(void);
 606#endif
 607
 608/**
 609 * spl_was_boot_source() - check if U-Boot booted from SPL
 610 *
 611 * This will normally be true, but if U-Boot jumps to second U-Boot, it will
 612 * be false. This should be implemented by board-specific code.
 613 *
 614 * @return true if U-Boot booted from SPL, else false
 615 */
 616bool spl_was_boot_source(void);
 617
 618/**
 619 * spl_dfu_cmd- run dfu command with chosen mmc device interface
 620 * @param usb_index - usb controller number
 621 * @param mmc_dev -  mmc device nubmer
 622 *
 623 * @return 0 on success, otherwise error code
 624 */
 625int spl_dfu_cmd(int usbctrl, char *dfu_alt_info, char *interface, char *devstr);
 626
 627int spl_mmc_load_image(struct spl_image_info *spl_image,
 628                       struct spl_boot_device *bootdev);
 629
 630/**
 631 * spl_mmc_load() - Load an image file from MMC/SD media
 632 *
 633 * @param spl_image     Image data filled in by loading process
 634 * @param bootdev       Describes which device to load from
 635 * @param filename      Name of file to load (in FS mode)
 636 * @param raw_part      Partition to load from (in RAW mode)
 637 * @param raw_sect      Sector to load from (in RAW mode)
 638 *
 639 * @return 0 on success, otherwise error code
 640 */
 641int spl_mmc_load(struct spl_image_info *spl_image,
 642                 struct spl_boot_device *bootdev,
 643                 const char *filename,
 644                 int raw_part,
 645                 unsigned long raw_sect);
 646
 647/**
 648 * spl_usb_load() - Load an image file from USB mass storage
 649 *
 650 * @param spl_image     Image data filled in by loading process
 651 * @param bootdev       Describes which device to load from
 652 * @param raw_part      Fat partition to load from
 653 * @param filename      Name of file to load
 654 *
 655 * @return 0 on success, otherwise error code
 656 */
 657int spl_usb_load(struct spl_image_info *spl_image,
 658                 struct spl_boot_device *bootdev,
 659                 int partition, const char *filename);
 660
 661int spl_ymodem_load_image(struct spl_image_info *spl_image,
 662                          struct spl_boot_device *bootdev);
 663
 664/**
 665 * spl_invoke_atf - boot using an ARM trusted firmware image
 666 */
 667void spl_invoke_atf(struct spl_image_info *spl_image);
 668
 669/**
 670 * bl2_plat_get_bl31_params() - return params for bl31.
 671 * @bl32_entry: address of BL32 executable (secure)
 672 * @bl33_entry: address of BL33 executable (non secure)
 673 * @fdt_addr:   address of Flat Device Tree
 674 *
 675 * This is a weak function which might be overridden by the board code. By
 676 * default it will just call bl2_plat_get_bl31_params_default().
 677 *
 678 * If you just want to manipulate or add some parameters, you can override
 679 * this function, call bl2_plat_get_bl31_params_default and operate on the
 680 * returned bl31 params.
 681 *
 682 * Return: bl31 params structure pointer
 683 */
 684struct bl31_params *bl2_plat_get_bl31_params(uintptr_t bl32_entry,
 685                                             uintptr_t bl33_entry,
 686                                             uintptr_t fdt_addr);
 687
 688/**
 689 * bl2_plat_get_bl31_params_default() - prepare params for bl31.
 690 * @bl32_entry: address of BL32 executable (secure)
 691 * @bl33_entry: address of BL33 executable (non secure)
 692 * @fdt_addr:   address of Flat Device Tree
 693 *
 694 * This is the default implementation of bl2_plat_get_bl31_params(). It assigns
 695 * a pointer to the memory that the platform has kept aside to pass platform
 696 * specific and trusted firmware related information to BL31. This memory is
 697 * allocated by allocating memory to bl2_to_bl31_params_mem structure which is
 698 * a superset of all the structure whose information is passed to BL31
 699 *
 700 * NOTE: The memory is statically allocated, thus this function should be
 701 * called only once. All subsequent calls will overwrite any changes.
 702 *
 703 * Return: bl31 params structure pointer
 704 */
 705struct bl31_params *bl2_plat_get_bl31_params_default(uintptr_t bl32_entry,
 706                                                     uintptr_t bl33_entry,
 707                                                     uintptr_t fdt_addr);
 708
 709/**
 710 * bl2_plat_get_bl31_params_v2() - return params for bl31
 711 * @bl32_entry: address of BL32 executable (secure)
 712 * @bl33_entry: address of BL33 executable (non secure)
 713 * @fdt_addr:   address of Flat Device Tree
 714 *
 715 * This function does the same as bl2_plat_get_bl31_params() except that is is
 716 * used for the new LOAD_IMAGE_V2 option, which uses a slightly different
 717 * method to pass the parameters.
 718 *
 719 * Return: bl31 params structure pointer
 720 */
 721struct bl_params *bl2_plat_get_bl31_params_v2(uintptr_t bl32_entry,
 722                                              uintptr_t bl33_entry,
 723                                              uintptr_t fdt_addr);
 724
 725/**
 726 * bl2_plat_get_bl31_params_v2_default() - prepare params for bl31.
 727 * @bl32_entry: address of BL32 executable (secure)
 728 * @bl33_entry: address of BL33 executable (non secure)
 729 * @fdt_addr:   address of Flat Device Tree
 730 *
 731 * This is the default implementation of bl2_plat_get_bl31_params_v2(). It
 732 * prepares the linked list of the bl31 params, populates the image types and
 733 * set the entry points for bl32 and bl33 (if available).
 734 *
 735 * NOTE: The memory is statically allocated, thus this function should be
 736 * called only once. All subsequent calls will overwrite any changes.
 737 *
 738 * Return: bl31 params structure pointer
 739 */
 740struct bl_params *bl2_plat_get_bl31_params_v2_default(uintptr_t bl32_entry,
 741                                                      uintptr_t bl33_entry,
 742                                                      uintptr_t fdt_addr);
 743/**
 744 * spl_optee_entry - entry function for optee
 745 *
 746 * args defind in op-tee project
 747 * https://github.com/OP-TEE/optee_os/
 748 * core/arch/arm/kernel/generic_entry_a32.S
 749 * @arg0: pagestore
 750 * @arg1: (ARMv7 standard bootarg #1)
 751 * @arg2: device tree address, (ARMv7 standard bootarg #2)
 752 * @arg3: non-secure entry address (ARMv7 bootarg #0)
 753 */
 754void spl_optee_entry(void *arg0, void *arg1, void *arg2, void *arg3);
 755
 756/**
 757 * spl_invoke_opensbi - boot using a RISC-V OpenSBI image
 758 */
 759void spl_invoke_opensbi(struct spl_image_info *spl_image);
 760
 761/**
 762 * board_return_to_bootrom - allow for boards to continue with the boot ROM
 763 *
 764 * If a board (e.g. the Rockchip RK3368 boards) provide some
 765 * supporting functionality for SPL in their boot ROM and the SPL
 766 * stage wants to return to the ROM code to continue booting, boards
 767 * can implement 'board_return_to_bootrom'.
 768 */
 769int board_return_to_bootrom(struct spl_image_info *spl_image,
 770                            struct spl_boot_device *bootdev);
 771
 772/**
 773 * board_spl_fit_post_load - allow process images after loading finished
 774 * @fit: Pointer to a valid Flattened Image Tree blob
 775 */
 776void board_spl_fit_post_load(const void *fit);
 777
 778/**
 779 * board_spl_fit_size_align - specific size align before processing payload
 780 *
 781 */
 782ulong board_spl_fit_size_align(ulong size);
 783
 784/**
 785 * spl_perform_fixups() - arch/board-specific callback before processing
 786 *                        the boot-payload
 787 */
 788void spl_perform_fixups(struct spl_image_info *spl_image);
 789
 790/*
 791 * spl_get_load_buffer() - get buffer for loading partial image data
 792 *
 793 * Returns memory area which can be populated by partial image data,
 794 * ie. uImage or fitImage header.
 795 */
 796struct image_header *spl_get_load_buffer(ssize_t offset, size_t size);
 797
 798void spl_save_restore_data(void);
 799#endif
 800