X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=include%2Fspl.h;h=86287874e1b433734ed2c900cee621a5c07e3268;hb=0676b6948d31607f208650cd9c1359f6210f55c3;hp=23604667fa72d37d2b51fb50725a1f95ce3a515b;hpb=2f6b47061d1979d241930843ff154c6f1f1ece58;p=oweals%2Fu-boot.git diff --git a/include/spl.h b/include/spl.h index 23604667fa..86287874e1 100644 --- a/include/spl.h +++ b/include/spl.h @@ -1,12 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ /* * (C) Copyright 2012 * Texas Instruments, - * - * SPDX-License-Identifier: GPL-2.0+ */ #ifndef _SPL_H_ #define _SPL_H_ +#include + /* Platform-specific defines */ #include #include @@ -23,10 +24,15 @@ struct spl_image_info { const char *name; u8 os; - u32 load_addr; - u32 entry_point; + uintptr_t load_addr; + uintptr_t entry_point; +#if CONFIG_IS_ENABLED(LOAD_FIT) + void *fdt_addr; +#endif + u32 boot_device; u32 size; u32 flags; + void *arg; }; /* @@ -47,8 +53,18 @@ struct spl_load_info { void *buf); }; +/* + * We need to know the position of U-Boot in memory so we can jump to it. We + * allow any U-Boot binary to be used (u-boot.bin, u-boot-nodtb.bin, + * u-boot.img), hence the '_any'. These is no checking here that the correct + * image is found. For * example if u-boot.img is used we don't check that + * spl_parse_image_header() can parse a valid header. + */ +binman_sym_extern(ulong, u_boot_any, pos); + /** * spl_load_simple_fit() - Loads a fit image from a device. + * @spl_image: Image description to set up * @info: Structure containing the information required to load data. * @sector: Sector number where FIT image is located in the device * @fdt: Pointer to the copied FIT header. @@ -57,69 +73,184 @@ struct spl_load_info { * specified load address and copies the dtb to end of u-boot image. * Returns 0 on success. */ -int spl_load_simple_fit(struct spl_load_info *info, ulong sector, void *fdt); +int spl_load_simple_fit(struct spl_image_info *spl_image, + struct spl_load_info *info, ulong sector, void *fdt); #define SPL_COPY_PAYLOAD_ONLY 1 -extern struct spl_image_info spl_image; - /* SPL common functions */ void preloader_console_init(void); u32 spl_boot_device(void); u32 spl_boot_mode(const u32 boot_device); -void spl_set_header_raw_uboot(void); -int spl_parse_image_header(const struct image_header *header); -void spl_board_prepare_for_linux(void); -void spl_board_prepare_for_boot(void); -void __noreturn jump_to_image_linux(void *arg); -int spl_start_uboot(void); -void spl_display_print(void); +int spl_boot_partition(const u32 boot_device); +void spl_set_bd(void); -/* NAND SPL functions */ -int spl_nand_load_image(void); +/** + * spl_set_header_raw_uboot() - Set up a standard SPL image structure + * + * This sets up the given spl_image which the standard values obtained from + * config options: CONFIG_SYS_MONITOR_LEN, CONFIG_SYS_UBOOT_START, + * CONFIG_SYS_TEXT_BASE. + * + * @spl_image: Image description to set up + */ +void spl_set_header_raw_uboot(struct spl_image_info *spl_image); -/* OneNAND SPL functions */ -int spl_onenand_load_image(void); +/** + * spl_parse_image_header() - parse the image header and set up info + * + * This parses the legacy image header information at @header and sets up + * @spl_image according to what is found. If no image header is found, then + * a raw image or bootz is assumed. If CONFIG_SPL_PANIC_ON_RAW_IMAGE is + * enabled, then this causes a panic. If CONFIG_SPL_RAW_IMAGE_SUPPORT is not + * enabled then U-Boot gives up. Otherwise U-Boot sets up the image using + * spl_set_header_raw_uboot(), or possibly the bootz header. + * + * @spl_image: Image description to set up + * @header image header to parse + * @return 0 if a header was correctly parsed, -ve on error + */ +int spl_parse_image_header(struct spl_image_info *spl_image, + const struct image_header *header); -/* NOR SPL functions */ -int spl_nor_load_image(void); +void spl_board_prepare_for_linux(void); +void spl_board_prepare_for_boot(void); +int spl_board_ubi_load_image(u32 boot_device); -/* MMC SPL functions */ -int spl_mmc_load_image(u32 boot_device); +/** + * jump_to_image_linux() - Jump to a Linux kernel from SPL + * + * This jumps into a Linux kernel using the information in @spl_image. + * + * @spl_image: Image description to set up + */ +void __noreturn jump_to_image_linux(struct spl_image_info *spl_image); + +/** + * spl_start_uboot() - Check if SPL should start the kernel or U-Boot + * + * This is called by the various SPL loaders to determine whether the board + * wants to load the kernel or U-Boot. This function should be provided by + * the board. + * + * @return 0 if SPL should start the kernel, 1 if U-Boot must be started + */ +int spl_start_uboot(void); -/* YMODEM SPL functions */ -int spl_ymodem_load_image(void); +/** + * spl_display_print() - Display a board-specific message in SPL + * + * If CONFIG_SPL_DISPLAY_PRINT is enabled, U-Boot will call this function + * immediately after displaying the SPL console banner ("U-Boot SPL ..."). + * This function should be provided by the board. + */ +void spl_display_print(void); -/* SPI SPL functions */ -int spl_spi_load_image(void); +/** + * struct spl_boot_device - Describes a boot device used by SPL + * + * @boot_device: A number indicating the BOOT_DEVICE type. There are various + * BOOT_DEVICE... #defines and enums in U-Boot and they are not consistently + * numbered. + * @boot_device_name: Named boot device, or NULL if none. + * + * Note: Additional fields can be added here, bearing in mind that SPL is + * size-sensitive and common fields will be present on all boards. This + * struct can also be used to return additional information about the load + * process if that becomes useful. + */ +struct spl_boot_device { + uint boot_device; + const char *boot_device_name; +}; -/* Ethernet SPL functions */ -int spl_net_load_image(const char *device); +/** + * Holds information about a way of loading an SPL image + * + * @name: User-friendly name for this method (e.g. "MMC") + * @boot_device: Boot device that this loader supports + * @load_image: Function to call to load image + */ +struct spl_image_loader { +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT + const char *name; +#endif + uint boot_device; + /** + * load_image() - Load an SPL image + * + * @spl_image: place to put image information + * @bootdev: describes the boot device to load from + */ + int (*load_image)(struct spl_image_info *spl_image, + struct spl_boot_device *bootdev); +}; -/* USB SPL functions */ -int spl_usb_load_image(void); +/* Declare an SPL image loader */ +#define SPL_LOAD_IMAGE(__name) \ + ll_entry_declare(struct spl_image_loader, __name, spl_image_loader) -/* SATA SPL functions */ -int spl_sata_load_image(void); +/* + * _priority is the priority of this method, 0 meaning it will be the top + * choice for this device, 9 meaning it is the bottom choice. + * _boot_device is the BOOT_DEVICE_... value + * _method is the load_image function to call + */ +#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT +#define SPL_LOAD_IMAGE_METHOD(_name, _priority, _boot_device, _method) \ + SPL_LOAD_IMAGE(_method ## _priority ## _boot_device) = { \ + .name = _name, \ + .boot_device = _boot_device, \ + .load_image = _method, \ + } +#else +#define SPL_LOAD_IMAGE_METHOD(_name, _priority, _boot_device, _method) \ + SPL_LOAD_IMAGE(_method ## _priority ## _boot_device) = { \ + .boot_device = _boot_device, \ + .load_image = _method, \ + } +#endif /* SPL FAT image functions */ -int spl_load_image_fat(struct blk_desc *block_dev, int partition, +int spl_load_image_fat(struct spl_image_info *spl_image, + struct blk_desc *block_dev, int partition, const char *filename); -int spl_load_image_fat_os(struct blk_desc *block_dev, int partition); +int spl_load_image_fat_os(struct spl_image_info *spl_image, + struct blk_desc *block_dev, int partition); void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image); /* SPL EXT image functions */ -int spl_load_image_ext(struct blk_desc *block_dev, int partition, +int spl_load_image_ext(struct spl_image_info *spl_image, + struct blk_desc *block_dev, int partition, const char *filename); -int spl_load_image_ext_os(struct blk_desc *block_dev, int partition); +int spl_load_image_ext_os(struct spl_image_info *spl_image, + struct blk_desc *block_dev, int partition); /** - * spl_init() - Set up device tree and driver model in SPL if enabled + * spl_early_init() - Set up device tree and driver model in SPL if enabled * * Call this function in board_init_f() if you want to use device tree and - * driver model early, before board_init_r() is called. This function will - * be called from board_init_r() if not called earlier. + * driver model early, before board_init_r() is called. + * + * If this is not called, then driver model will be inactive in SPL's + * board_init_f(), and no device tree will be available. + */ +int spl_early_init(void); + +/** + * spl_init() - Set up device tree and driver model in SPL if enabled + * + * You can optionally call spl_early_init(), then optionally call spl_init(). + * This function will be called from board_init_r() if not called earlier. + * + * Both spl_early_init() and spl_init() perform a similar function except that + * the latter will not set up the malloc() area if + * CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN is enabled, since it is assumed to + * already be done by a calll to spl_relocate_stack_gd() before board_init_r() + * is reached. + * + * This function will be called from board_init_r() if not called earlier. * * If this is not called, then driver model will be inactive in SPL's * board_init_f(), and no device tree will be available. @@ -140,4 +271,36 @@ void spl_board_init(void); */ bool spl_was_boot_source(void); +/** + * spl_dfu_cmd- run dfu command with chosen mmc device interface + * @param usb_index - usb controller number + * @param mmc_dev - mmc device nubmer + * + * @return 0 on success, otherwise error code + */ +int spl_dfu_cmd(int usbctrl, char *dfu_alt_info, char *interface, char *devstr); + +int spl_mmc_load_image(struct spl_image_info *spl_image, + struct spl_boot_device *bootdev); + +/** + * spl_invoke_atf - boot using an ARM trusted firmware image + */ +void spl_invoke_atf(struct spl_image_info *spl_image); + +/** + * board_return_to_bootrom - allow for boards to continue with the boot ROM + * + * If a board (e.g. the Rockchip RK3368 boards) provide some + * supporting functionality for SPL in their boot ROM and the SPL + * stage wants to return to the ROM code to continue booting, boards + * can implement 'board_return_to_bootrom'. + */ +void board_return_to_bootrom(void); + +/** + * spl_perform_fixups() - arch/board-specific callback before processing + * the boot-payload + */ +void spl_perform_fixups(struct spl_image_info *spl_image); #endif