]> Git Repo - J-u-boot.git/commitdiff
Merge patch series "vbe: Series part E"
authorTom Rini <[email protected]>
Fri, 27 Dec 2024 21:16:39 +0000 (15:16 -0600)
committerTom Rini <[email protected]>
Fri, 27 Dec 2024 21:16:39 +0000 (15:16 -0600)
Simon Glass <[email protected]> says:

This includes various patches towards implementing the VBE abrec
bootmeth in U-Boot. It mostly focuses on SPL tweaks and adjusting what
fatures are available in VPL.

Link: https://lore.kernel.org/r/[email protected]
19 files changed:
boot/Kconfig
boot/bootdev-uclass.c
boot/image-fit.c
common/Kconfig
common/hash.c
common/malloc_simple.c
common/spl/Kconfig.vpl
common/spl/spl.c
common/spl/spl_atf.c
common/spl/spl_fit.c
common/spl/spl_legacy.c
common/spl/spl_mmc.c
configs/sandbox_vpl_defconfig
include/image.h
include/spl.h
include/u-boot/crc.h
lib/Kconfig
lib/Makefile
lib/crc8.c

index 99dcedcc8409b7763430a8a8976bf4a9645e8d8a..20935a269c60dad53ce11ac7e58247dc23cf617e 100644 (file)
@@ -163,6 +163,18 @@ config SPL_FIT
        select SPL_HASH
        select SPL_OF_LIBFDT
 
+config VPL_FIT
+       bool "Support Flattened Image Tree within VPL"
+       depends on VPL
+       select VPL_HASH
+       select VPL_OF_LIBFDT
+
+config TPL_FIT
+       bool "Support Flattened Image Tree within TPL"
+       depends on TPL
+       select TPL_HASH
+       select TPL_OF_LIBFDT
+
 config SPL_FIT_PRINT
        bool "Support FIT printing within SPL"
        depends on SPL_FIT
@@ -268,6 +280,28 @@ config SPL_LOAD_FIT_FULL
          particular it can handle selecting from multiple device tree
          and passing the correct one to U-Boot.
 
+config TPL_LOAD_FIT
+       bool "Enable TPL loading U-Boot as a FIT (basic fitImage features)"
+       depends on TPL
+       select TPL_FIT
+       help
+         Normally with the SPL framework a legacy image is generated as part
+         of the build. This contains U-Boot along with information as to
+         where it should be loaded. This option instead enables generation
+         of a FIT (Flat Image Tree) which provides more flexibility. In
+         particular it can handle selecting from multiple device tree
+         and passing the correct one to U-Boot.
+
+         This path has the following limitations:
+
+         1. "loadables" images, other than FDTs, which do not have a "load"
+            property will not be loaded. This limitation also applies to FPGA
+            images with the correct "compatible" string.
+         2. For FPGA images, the supported "compatible" list is in the
+            doc/uImage.FIT/source_file_format.txt.
+         3. FDTs are only loaded for images with an "os" property of "u-boot".
+            "linux" images are also supported with Falcon boot mode.
+
 config SPL_FIT_IMAGE_POST_PROCESS
        bool "Enable post-processing of FIT artifacts after loading by the SPL"
        depends on SPL_LOAD_FIT
@@ -292,6 +326,22 @@ config VPL_FIT
        select VPL_HASH
        select VPL_OF_LIBFDT
 
+config VPL_LOAD_FIT
+       bool "Enable VPL loading U-Boot as a FIT (basic fitImage features)"
+       select VPL_FIT
+       default y
+
+config VPL_LOAD_FIT_FULL
+       bool "Enable SPL loading U-Boot as a FIT (full fitImage features)"
+       select VPL_FIT
+       help
+         Normally with the SPL framework a legacy image is generated as part
+         of the build. This contains U-Boot along with information as to
+         where it should be loaded. This option instead enables generation
+         of a FIT (Flat Image Tree) which provides more flexibility. In
+         particular it can handle selecting from multiple device tree
+         and passing the correct one to U-Boot.
+
 config VPL_FIT_PRINT
        bool "Support FIT printing within VPL"
        depends on VPL_FIT
@@ -620,6 +670,15 @@ config VPL_BOOTMETH_VBE
          supports selection of various firmware components, selection of an OS to
          boot as well as updating these using fwupd.
 
+config TPL_BOOTMETH_VBE
+       bool "Bootdev support for Verified Boot for Embedded (TPL)"
+       depends on TPL
+       default y
+       help
+         Enables support for VBE boot. This is a standard boot method which
+         supports selection of various firmware components, seleciton of an OS to
+         boot as well as updating these using fwupd.
+
 if BOOTMETH_VBE
 
 config BOOTMETH_VBE_REQUEST
@@ -645,6 +704,8 @@ config SPL_BOOTMETH_VBE_REQUEST
 config BOOTMETH_VBE_SIMPLE
        bool "Bootdev support for VBE 'simple' method"
        default y
+       imply SPL_CRC8 if SPL
+       imply VPL_CRC8 if VPL
        help
          Enables support for VBE 'simple' boot. This allows updating a single
          firmware image in boot media such as MMC. It does not support any sort
@@ -698,7 +759,15 @@ config VPL_BOOTMETH_VBE_SIMPLE_FW
          This option enabled for VPL, since it is the phase where the SPL
          decision is made.
 
-endif # BOOTMETH_VBE
+config TPL_BOOTMETH_VBE_SIMPLE_FW
+       bool "Bootdev support for VBE 'simple' method firmware phase (TPL)"
+       depends on VPL
+       default y
+       help
+         Enables support for the firmware parts of VBE 'simple' boot, in TPL.
+         TPL loads a FIT containing the VPL binary and a suitable devicetree.
+
+endif # BOOTMETH_VBE_SIMPLE
 
 config EXPO
        bool "Support for expos - groups of scenes displaying a UI"
index 64ec4fde493f4cfaa12d610beaf1ebdba644242e..2e61c853142b7d4e1993a91722722b030b67609e 100644 (file)
@@ -16,6 +16,7 @@
 #include <malloc.h>
 #include <part.h>
 #include <sort.h>
+#include <spl.h>
 #include <dm/device-internal.h>
 #include <dm/lists.h>
 #include <dm/uclass-internal.h>
@@ -278,8 +279,13 @@ int bootdev_setup_for_sibling_blk(struct udevice *blk, const char *drv_name)
        int ret, len;
 
        len = bootdev_get_suffix_start(blk, ".blk");
-       snprintf(dev_name, sizeof(dev_name), "%.*s.%s", len, blk->name,
-                "bootdev");
+       if (xpl_phase() < PHASE_BOARD_R) {
+               strlcpy(dev_name, blk->name, sizeof(dev_name) - 5);
+               strcat(dev_name, ".sib");
+       } else {
+               snprintf(dev_name, sizeof(dev_name), "%.*s.%s", len, blk->name,
+                        "bootdev");
+       }
 
        parent = dev_get_parent(blk);
        ret = device_find_child_by_name(parent, dev_name, &dev);
index 7d56f0b5e6ed39a75e029b09dc95d605835c0f91..db7fb61bca948e42a4136b9ceb263a53362ad3f8 100644 (file)
@@ -1729,13 +1729,13 @@ int fit_conf_find_compat(const void *fit, const void *fdt)
        images_noffset = fdt_path_offset(fit, FIT_IMAGES_PATH);
        if (confs_noffset < 0 || images_noffset < 0) {
                debug("Can't find configurations or images nodes.\n");
-               return -1;
+               return -EINVAL;
        }
 
        fdt_compat = fdt_getprop(fdt, 0, "compatible", &fdt_compat_len);
        if (!fdt_compat) {
                debug("Fdt for comparison has no \"compatible\" property.\n");
-               return -1;
+               return -ENXIO;
        }
 
        /*
@@ -1812,7 +1812,7 @@ int fit_conf_find_compat(const void *fit, const void *fdt)
        }
        if (!best_match_offset) {
                debug("No match found.\n");
-               return -1;
+               return -ENOENT;
        }
 
        return best_match_offset;
@@ -2095,17 +2095,18 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
                 * fit_conf_get_node() will try to find default config node
                 */
                bootstage_mark(bootstage_id + BOOTSTAGE_SUB_NO_UNIT_NAME);
-               if (IS_ENABLED(CONFIG_FIT_BEST_MATCH) && !fit_uname_config) {
-                       cfg_noffset = fit_conf_find_compat(fit, gd_fdt_blob());
-               } else {
-                       cfg_noffset = fit_conf_get_node(fit, fit_uname_config);
-               }
-               if (cfg_noffset < 0) {
+               ret = -ENXIO;
+               if (IS_ENABLED(CONFIG_FIT_BEST_MATCH) && !fit_uname_config)
+                       ret = fit_conf_find_compat(fit, gd_fdt_blob());
+               if (ret < 0 && ret != -EINVAL)
+                       ret = fit_conf_get_node(fit, fit_uname_config);
+               if (ret < 0) {
                        puts("Could not find configuration node\n");
                        bootstage_error(bootstage_id +
                                        BOOTSTAGE_SUB_NO_UNIT_NAME);
                        return -ENOENT;
                }
+               cfg_noffset = ret;
 
                fit_base_uname_config = fdt_get_name(fit, cfg_noffset, NULL);
                printf("   Using '%s' configuration\n", fit_base_uname_config);
@@ -2225,6 +2226,7 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
        data = map_to_sysmem(buf);
        load = data;
        if (load_op == FIT_LOAD_IGNORED) {
+               log_debug("load_op: not loading\n");
                /* Don't load */
        } else if (fit_image_get_load(fit, noffset, &load)) {
                if (load_op == FIT_LOAD_REQUIRED) {
@@ -2261,10 +2263,13 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
        /* Kernel images get decompressed later in bootm_load_os(). */
        if (!fit_image_get_comp(fit, noffset, &comp) &&
            comp != IH_COMP_NONE &&
+           load_op != FIT_LOAD_IGNORED &&
            !(image_type == IH_TYPE_KERNEL ||
              image_type == IH_TYPE_KERNEL_NOLOAD ||
              image_type == IH_TYPE_RAMDISK)) {
                ulong max_decomp_len = len * 20;
+
+               log_debug("decompressing image\n");
                if (load == data) {
                        loadbuf = malloc(max_decomp_len);
                        load = map_to_sysmem(loadbuf);
@@ -2279,6 +2284,7 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
                }
                len = load_end - load;
        } else if (load != data) {
+               log_debug("copying\n");
                loadbuf = map_sysmem(load, len);
                memcpy(loadbuf, buf, len);
        }
@@ -2288,8 +2294,9 @@ int fit_image_load(struct bootm_headers *images, ulong addr,
                     " please fix your .its file!\n");
 
        /* verify that image data is a proper FDT blob */
-       if (image_type == IH_TYPE_FLATDT && fdt_check_header(loadbuf)) {
-               puts("Subimage data is not a FDT");
+       if (load_op != FIT_LOAD_IGNORED && image_type == IH_TYPE_FLATDT &&
+           fdt_check_header(loadbuf)) {
+               puts("Subimage data is not a FDT\n");
                return -ENOEXEC;
        }
 
index e8d89bf6eb9d857c057eb8316b0eef806e7f7869..0e8c44f3f745df0bd3a15322e88de775b137eb55 100644 (file)
@@ -845,6 +845,14 @@ config HASH
          and the algorithms it supports are defined in common/hash.c. See
          also CMD_HASH for command-line access.
 
+config HASH_CRC8
+       bool "Make crc8 available via the hash API"
+       depends on HASH && CRC8
+       help
+         Most times, the crc8() function is called directly. To make it also
+         available via the hash API, e.g. in hash_block(), enable this
+         option.
+
 config AVB_VERIFY
        bool "Build Android Verified Boot operations"
        depends on LIBAVB
index db6925d6782e99094d75bcc26db2ff60e9a4b2be..8dd9da8576833d23b1e42945997a98a3468f0bd6 100644 (file)
@@ -304,6 +304,14 @@ static struct hash_algo hash_algo[] = {
                .hash_update    = hash_update_crc16_ccitt,
                .hash_finish    = hash_finish_crc16_ccitt,
        },
+#if CONFIG_IS_ENABLED(CRC8) && IS_ENABLED(CONFIG_HASH_CRC8)
+       {
+               .name           = "crc8",
+               .digest_size    = 1,
+               .chunk_size     = CHUNKSZ_CRC32,
+               .hash_func_ws   = crc8_wd_buf,
+       },
+#endif
 #if CONFIG_IS_ENABLED(CRC32)
        {
                .name           = "crc32",
index 5a8ec538f8ff27389be710a02c3ca88a4ee67642..f0f90a095bd162c245a5c2b2f054b058846c2f4d 100644 (file)
@@ -26,7 +26,8 @@ static void *alloc_simple(size_t bytes, int align)
        log_debug("size=%lx, ptr=%lx, limit=%x: ", (ulong)bytes, new_ptr,
                  gd->malloc_limit);
        if (new_ptr > gd->malloc_limit) {
-               log_err("alloc space exhausted\n");
+               log_err("alloc space exhausted ptr %lx limit %x\n", new_ptr,
+                       gd->malloc_limit);
                return NULL;
        }
 
index d06f36d4ee40650c0b50ccfd69b5e8af07db3c87..eb57dfabea576ab9bcf0db1718e99f9de9e314c2 100644 (file)
@@ -222,12 +222,29 @@ config VPL_SPI_FLASH_SUPPORT
          lines). This enables the drivers in drivers/mtd/spi as part of a
          VPL build. This normally requires VPL_SPI_SUPPORT.
 
+config VPL_SYS_MALLOC_SIMPLE
+       bool "Only use malloc_simple functions in the VPL"
+       default y
+       help
+         Say Y here to only use the *_simple malloc functions from
+         malloc_simple.c, rather then using the versions from dlmalloc.c;
+         this will make the VPL binary smaller at the cost of more heap
+         usage as the *_simple malloc functions do not re-use free-ed mem.
+
 config VPL_TEXT_BASE
        hex "VPL Text Base"
        default 0x0
        help
          The address in memory that VPL will be running from.
 
+config VPL_MAX_SIZE
+       hex "Maximum size (in bytes) for the VPL stage"
+       default 0x2e000 if ROCKCHIP_RK3399
+       default 0x0
+       help
+         The maximum size (in bytes) of the TPL stage. This size is determined
+         by the amount of internal SRAM memory.
+
 config VPL_BINMAN_SYMBOLS
        bool "Declare binman symbols in VPL"
        depends on VPL_FRAMEWORK && BINMAN
index 1ceb63daf3183809fc98f23d967545190ca00616..ad31a2f8b6cbc1e6284e67105188cc480f00e451 100644 (file)
@@ -631,10 +631,13 @@ static int boot_from_devices(struct spl_image_info *spl_image,
                                             "Unsupported Boot Device!\n");
                                }
                        }
-                       if (loader &&
-                               !spl_load_image(spl_image, loader)) {
-                               spl_image->boot_device = bootdev;
-                               return 0;
+                       if (loader) {
+                               ret = spl_load_image(spl_image, loader);
+                               if (!ret) {
+                                       spl_image->boot_device = bootdev;
+                                       return 0;
+                               }
+                               printf("Error: %d\n", ret);
                        }
                }
        }
@@ -833,7 +836,7 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
  */
 void preloader_console_init(void)
 {
-#ifdef CONFIG_SPL_SERIAL
+#if CONFIG_IS_ENABLED(SERIAL)
        gd->baudrate = CONFIG_BAUDRATE;
 
        serial_init();          /* serial communications setup */
@@ -892,7 +895,7 @@ __weak void spl_relocate_stack_check(void)
  */
 ulong spl_relocate_stack_gd(void)
 {
-#ifdef CONFIG_SPL_STACK_R
+#if CONFIG_IS_ENABLED(STACK_R)
        gd_t *new_gd;
        ulong ptr = CONFIG_SPL_STACK_R_ADDR;
 
index 0397b86a33b115608676de219603613ab91b463b..8bc5db7739508c416efe6daacc008ff4068c9c46 100644 (file)
@@ -41,9 +41,9 @@ struct bl2_to_bl31_params_mem_v2 {
        struct entry_point_info bl31_ep_info;
 };
 
-struct bl31_params *bl2_plat_get_bl31_params_default(uintptr_t bl32_entry,
-                                                    uintptr_t bl33_entry,
-                                                    uintptr_t fdt_addr)
+struct bl31_params *bl2_plat_get_bl31_params_default(ulong bl32_entry,
+                                                    ulong bl33_entry,
+                                                    ulong fdt_addr)
 {
        static struct bl2_to_bl31_params_mem bl31_params_mem;
        struct bl31_params *bl2_to_bl31_params;
@@ -100,17 +100,17 @@ struct bl31_params *bl2_plat_get_bl31_params_default(uintptr_t bl32_entry,
        return bl2_to_bl31_params;
 }
 
-__weak struct bl31_params *bl2_plat_get_bl31_params(uintptr_t bl32_entry,
-                                                   uintptr_t bl33_entry,
-                                                   uintptr_t fdt_addr)
+__weak struct bl31_params *bl2_plat_get_bl31_params(ulong bl32_entry,
+                                                   ulong bl33_entry,
+                                                   ulong fdt_addr)
 {
        return bl2_plat_get_bl31_params_default(bl32_entry, bl33_entry,
                                                fdt_addr);
 }
 
-struct bl_params *bl2_plat_get_bl31_params_v2_default(uintptr_t bl32_entry,
-                                                     uintptr_t bl33_entry,
-                                                     uintptr_t fdt_addr)
+struct bl_params *bl2_plat_get_bl31_params_v2_default(ulong bl32_entry,
+                                                     ulong bl33_entry,
+                                                     ulong fdt_addr)
 {
        static struct bl2_to_bl31_params_mem_v2 bl31_params_mem;
        struct bl_params *bl_params;
@@ -173,9 +173,9 @@ struct bl_params *bl2_plat_get_bl31_params_v2_default(uintptr_t bl32_entry,
        return bl_params;
 }
 
-__weak struct bl_params *bl2_plat_get_bl31_params_v2(uintptr_t bl32_entry,
-                                                    uintptr_t bl33_entry,
-                                                    uintptr_t fdt_addr)
+__weak struct bl_params *bl2_plat_get_bl31_params_v2(ulong bl32_entry,
+                                                    ulong bl33_entry,
+                                                    ulong fdt_addr)
 {
        return bl2_plat_get_bl31_params_v2_default(bl32_entry, bl33_entry,
                                                   fdt_addr);
@@ -188,8 +188,8 @@ static inline void raw_write_daif(unsigned int daif)
 
 typedef void __noreturn (*atf_entry_t)(struct bl31_params *params, void *plat_params);
 
-static void __noreturn bl31_entry(uintptr_t bl31_entry, uintptr_t bl32_entry,
-                                 uintptr_t bl33_entry, uintptr_t fdt_addr)
+static void __noreturn bl31_entry(ulong bl31_entry, ulong bl32_entry,
+                                 ulong bl33_entry, ulong fdt_addr)
 {
        atf_entry_t  atf_entry = (atf_entry_t)bl31_entry;
        void *bl31_params;
@@ -238,7 +238,7 @@ static int spl_fit_images_find(void *blob, int os)
        return -FDT_ERR_NOTFOUND;
 }
 
-uintptr_t spl_fit_images_get_entry(void *blob, int node)
+ulong spl_fit_images_get_entry(void *blob, int node)
 {
        ulong  val;
        int ret;
@@ -253,10 +253,10 @@ uintptr_t spl_fit_images_get_entry(void *blob, int node)
 
 void __noreturn spl_invoke_atf(struct spl_image_info *spl_image)
 {
-       uintptr_t  bl32_entry = 0;
-       uintptr_t  bl33_entry = CONFIG_TEXT_BASE;
+       ulong  bl32_entry = 0;
+       ulong  bl33_entry = CONFIG_TEXT_BASE;
        void *blob = spl_image->fdt_addr;
-       uintptr_t platform_param = (uintptr_t)blob;
+       ulong platform_param = (ulong)blob;
        int node;
 
        /*
index 3160f573bfbd49b089064086aef005800e1b14f7..ac8462577ffc594312e823d938eafa5bf9e790c3 100644 (file)
@@ -190,7 +190,7 @@ static int get_aligned_image_size(struct spl_load_info *info, int data_size,
 /**
  * load_simple_fit(): load the image described in a certain FIT node
  * @info:      points to information about the device to load data from
- * @sector:    the start sector of the FIT image on the device
+ * @fit_offset:        the offset of the FIT image on the device
  * @ctx:       points to the FIT context structure
  * @node:      offset of the DT node describing the image to load (relative
  *             to @fit)
@@ -243,11 +243,14 @@ static int load_simple_fit(struct spl_load_info *info, ulong fit_offset,
        if (!fit_image_get_data_position(fit, node, &offset)) {
                external_data = true;
        } else if (!fit_image_get_data_offset(fit, node, &offset)) {
+               log_debug("read offset %x = offset from fit %lx\n",
+                         offset, (ulong)offset + ctx->ext_data_offset);
                offset += ctx->ext_data_offset;
                external_data = true;
        }
 
        if (external_data) {
+               ulong read_offset;
                void *src_ptr;
 
                /* External data */
@@ -270,6 +273,10 @@ static int load_simple_fit(struct spl_load_info *info, ulong fit_offset,
 
                overhead = get_aligned_image_overhead(info, offset);
                size = get_aligned_image_size(info, length, offset);
+               read_offset = fit_offset + get_aligned_image_offset(info,
+                                                           offset);
+               log_debug("reading from offset %x / %lx size %lx to %p: ",
+                         offset, read_offset, size, src_ptr);
 
                if (info->read(info,
                               fit_offset +
@@ -336,6 +343,7 @@ static int load_simple_fit(struct spl_load_info *info, ulong fit_offset,
                else
                        image_info->entry_point = FDT_ERROR;
        }
+       log_debug("- done loading\n");
 
        upl_add_image(fit, node, load_addr, length);
 
@@ -862,7 +870,7 @@ int spl_load_fit_image(struct spl_image_info *spl_image,
 {
        struct bootm_headers images;
        const char *fit_uname_config = NULL;
-       uintptr_t fdt_hack;
+       ulong fdt_hack;
        const char *uname;
        ulong fw_data = 0, dt_data = 0, img_data = 0;
        ulong fw_len = 0, dt_len = 0, img_len = 0;
index 9252b3a3de0e8338ccbd5479624ef6715566817a..b3efb3e630e39c2cd52ed77761255245b9aea8d5 100644 (file)
 
 #define LZMA_LEN       (1 << 20)
 
-static void spl_parse_legacy_validate(uintptr_t start, uintptr_t size)
+static void spl_parse_legacy_validate(ulong start, ulong size)
 {
-       uintptr_t spl_start = (uintptr_t)_start;
-       uintptr_t spl_end = (uintptr_t)&_image_binary_end;
-       uintptr_t end = start + size;
+       ulong spl_start = (ulong)_start;
+       ulong spl_end = (ulong)&_image_binary_end;
+       ulong end = start + size;
 
        if ((start >= spl_start && start < spl_end) ||
            (end > spl_start && end <= spl_end) ||
index 1f69659321620739d066bd806acd1d282b66bad3..fe4230170a039c0ca18b7230105997ed824f9f54 100644 (file)
@@ -81,8 +81,10 @@ static int spl_mmc_find_device(struct mmc **mmcp, int mmc_dev)
        struct uclass *uc;
 
        log_debug("Selecting MMC dev %d; seqs:\n", mmc_dev);
-       uclass_id_foreach_dev(UCLASS_MMC, dev, uc)
-               log_debug("%d: %s\n", dev_seq(dev), dev->name);
+       if (_LOG_DEBUG) {
+               uclass_id_foreach_dev(UCLASS_MMC, dev, uc)
+                       log_debug("%d: %s\n", dev_seq(dev), dev->name);
+       }
        ret = mmc_init_device(mmc_dev);
 #else
        ret = mmc_initialize(NULL);
index 84df2b852609439f583505c5e14f4dc14b159551..46329395ba5ee941a837730cc415a39b0f9c9bea 100644 (file)
@@ -27,6 +27,8 @@ CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_FIT_BEST_MATCH=y
 CONFIG_SPL_LOAD_FIT=y
+# CONFIG_TPL_BOOTMETH_VBE is not set
+# CONFIG_TPL_BOOTMETH_VBE_SIMPLE_FW is not set
 CONFIG_UPL=y
 CONFIG_UPL_IN=y
 CONFIG_BOOTSTAGE=y
index cfe3c971a36e70b16cc91c5cb7795aed473881fa..0a61dfd556c5edf10f81ab1ba587e55b87234f2b 100644 (file)
@@ -1171,6 +1171,18 @@ int fit_image_get_data_size_unciphered(const void *fit, int noffset,
 int fit_image_get_data_and_size(const void *fit, int noffset,
                                const void **data, size_t *size);
 
+/**
+ * fit_image_get_phase() - Get the phase from a FIT image
+ *
+ * @fit: FIT to read from
+ * @offset: offset node to read
+ * @phasep: Returns phase, if any
+ * Return: 0 if read OK and *phasep is value, -ENOENT if there was no phase
+ * property in the node, other -ve value on other error
+ */
+int fit_image_get_phase(const void *fit, int offset,
+                       enum image_phase_t *phasep);
+
 /**
  * fit_get_data_node() - Get verified image data for an image
  * @fit: Pointer to the FIT format image header
@@ -1399,7 +1411,9 @@ int fit_check_format(const void *fit, ulong size);
  * copied into the configuration node in the FIT image. This is required to
  * match configurations with compressed FDTs.
  *
- * Returns: offset to the configuration to use if one was found, -1 otherwise
+ * Returns: offset to the configuration to use if one was found, -EINVAL if
+ * there a /configurations or /images node is missing, -ENOENT if no match was
+ * found, -ENXIO if the FDT node has no compatible string
  */
 int fit_conf_find_compat(const void *fit, const void *fdt);
 
index 269e36bb44175e5746b420da3ca9cca6128eed4e..43b344dbc55316e25469b6621968b4540fd2165b 100644 (file)
@@ -268,8 +268,8 @@ enum spl_sandbox_flags {
 struct spl_image_info {
        const char *name;
        u8 os;
-       uintptr_t load_addr;
-       uintptr_t entry_point;
+       ulong load_addr;
+       ulong entry_point;
 #if CONFIG_IS_ENABLED(LOAD_FIT) || CONFIG_IS_ENABLED(LOAD_FIT_FULL)
        void *fdt_addr;
 #endif
@@ -951,9 +951,9 @@ void __noreturn spl_invoke_atf(struct spl_image_info *spl_image);
  *
  * Return: bl31 params structure pointer
  */
-struct bl31_params *bl2_plat_get_bl31_params(uintptr_t bl32_entry,
-                                            uintptr_t bl33_entry,
-                                            uintptr_t fdt_addr);
+struct bl31_params *bl2_plat_get_bl31_params(ulong bl32_entry,
+                                            ulong bl33_entry,
+                                            ulong fdt_addr);
 
 /**
  * bl2_plat_get_bl31_params_default() - prepare params for bl31.
@@ -972,9 +972,9 @@ struct bl31_params *bl2_plat_get_bl31_params(uintptr_t bl32_entry,
  *
  * Return: bl31 params structure pointer
  */
-struct bl31_params *bl2_plat_get_bl31_params_default(uintptr_t bl32_entry,
-                                                    uintptr_t bl33_entry,
-                                                    uintptr_t fdt_addr);
+struct bl31_params *bl2_plat_get_bl31_params_default(ulong bl32_entry,
+                                                    ulong bl33_entry,
+                                                    ulong fdt_addr);
 
 /**
  * bl2_plat_get_bl31_params_v2() - return params for bl31
@@ -988,9 +988,9 @@ struct bl31_params *bl2_plat_get_bl31_params_default(uintptr_t bl32_entry,
  *
  * Return: bl31 params structure pointer
  */
-struct bl_params *bl2_plat_get_bl31_params_v2(uintptr_t bl32_entry,
-                                             uintptr_t bl33_entry,
-                                             uintptr_t fdt_addr);
+struct bl_params *bl2_plat_get_bl31_params_v2(ulong bl32_entry,
+                                             ulong bl33_entry,
+                                             ulong fdt_addr);
 
 /**
  * bl2_plat_get_bl31_params_v2_default() - prepare params for bl31.
@@ -1007,9 +1007,9 @@ struct bl_params *bl2_plat_get_bl31_params_v2(uintptr_t bl32_entry,
  *
  * Return: bl31 params structure pointer
  */
-struct bl_params *bl2_plat_get_bl31_params_v2_default(uintptr_t bl32_entry,
-                                                     uintptr_t bl33_entry,
-                                                     uintptr_t fdt_addr);
+struct bl_params *bl2_plat_get_bl31_params_v2_default(ulong bl32_entry,
+                                                     ulong bl33_entry,
+                                                     ulong fdt_addr);
 /**
  * spl_optee_entry - entry function for optee
  *
index 5174bd7ac413e5567dfff71ec698d7c5bf6c3e7d..b2badaf6a9780321f3d869f303d5816b87062492 100644 (file)
@@ -25,6 +25,9 @@
  */
 unsigned int crc8(unsigned int crc_start, const unsigned char *vptr, int len);
 
+void crc8_wd_buf(const unsigned char *input, unsigned int len,
+                unsigned char output[1], unsigned int chunk_sz);
+
 /* lib/crc16.c - 16 bit CRC with polynomial x^16 + x^15 + x^2 + 1 */
 uint16_t crc16(uint16_t crc, const unsigned char *buffer, size_t len);
 
index 0b089814d14905bb36714b25a5acc0f5cd8d5fe9..8f1a96d98c4378e2c92ae5299079c7baaa36f509 100644 (file)
@@ -728,6 +728,24 @@ config SPL_CRC8
          checksum with feedback to produce an 8-bit result. The code is small
          and it does not require a lookup table (unlike CRC32).
 
+config TPL_CRC8
+       bool "Support CRC8 in TPL"
+       depends on TPL
+       help
+         Enables CRC8 support in TPL. This is not normally required. CRC8 is
+         a simple and fast checksumming algorithm which does a bytewise
+         checksum with feedback to produce an 8-bit result. The code is small
+         and it does not require a lookup table (unlike CRC32).
+
+config VPL_CRC8
+       bool "Support CRC8 in VPL"
+       depends on VPL
+       help
+         Enables CRC8 support in VPL. This is not normally required. CRC8 is
+         a simple and fast checksumming algorithm which does a bytewise
+         checksum with feedback to produce an 8-bit result. The code is small
+         and it does not require a lookup table (unlike CRC32).
+
 config SPL_CRC16
        bool "Support CRC16 in SPL"
        depends on SPL
@@ -841,12 +859,36 @@ config SPL_LZ4
          fast compression and decompression speed. It belongs to the LZ77
          family of byte-oriented compression schemes.
 
+config TPL_LZ4
+       bool "Enable LZ4 decompression support in TPL"
+       depends on TPL
+       help
+         This enables support for the LZ4 decompression algorithm in TPL. LZ4
+         is a lossless data compression algorithm that is focused on
+         fast compression and decompression speed. It belongs to the LZ77
+         family of byte-oriented compression schemes.
+
+config VPL_LZ4
+       bool "Enable LZ4 decompression support in VPL"
+       depends on VPL
+       help
+         This enables support for the LZ4 decompression algorithm in VPL. LZ4
+         is a lossless data compression algorithm that is focused on
+         fast compression and decompression speed. It belongs to the LZ77
+         family of byte-oriented compression schemes.
+
 config SPL_LZMA
        bool "Enable LZMA decompression support for SPL build"
        depends on SPL
        help
          This enables support for LZMA compression algorithm for SPL boot.
 
+config TPL_LZMA
+       bool "Enable LZMA decompression support for TPL build"
+       depends on TPL
+       help
+         This enables support for LZMA compression algorithm for TPL boot.
+
 config VPL_LZMA
        bool "Enable LZMA decompression support for VPL build"
        default y if LZMA
@@ -865,11 +907,22 @@ config SPL_GZIP
        help
          This enables support for the GZIP compression algorithm for SPL boot.
 
+config TPL_GZIP
+       bool "Enable gzip decompression support for SPL build"
+       select TPL_ZLIB
+       help
+         This enables support for the GZIP compression algorithm for TPL
+
 config SPL_ZLIB
        bool
        help
          This enables compression lib for SPL boot.
 
+config TPL_ZLIB
+       bool
+       help
+         This enables compression lib for TPL
+
 config SPL_ZSTD
        bool "Enable Zstandard decompression support in SPL"
        depends on SPL
index d24ed629732097d793021a069dfb207bc5c0e409..5cb3278d2ef160605f3fb174fa7d60c412ecbbb7 100644 (file)
@@ -83,12 +83,12 @@ obj-$(CONFIG_$(XPL_)SHA512_LEGACY) += sha512.o
 obj-$(CONFIG_CRYPT_PW) += crypt/
 obj-$(CONFIG_$(XPL_)ASN1_DECODER_LEGACY) += asn1_decoder.o
 
-obj-$(CONFIG_$(XPL_)ZLIB) += zlib/
-obj-$(CONFIG_$(XPL_)ZSTD) += zstd/
-obj-$(CONFIG_$(XPL_)GZIP) += gunzip.o
-obj-$(CONFIG_$(XPL_)LZO) += lzo/
-obj-$(CONFIG_$(XPL_)LZMA) += lzma/
-obj-$(CONFIG_$(XPL_)LZ4) += lz4_wrapper.o
+obj-$(CONFIG_$(PHASE_)ZLIB) += zlib/
+obj-$(CONFIG_$(PHASE_)ZSTD) += zstd/
+obj-$(CONFIG_$(PHASE_)GZIP) += gunzip.o
+obj-$(CONFIG_$(PHASE_)LZO) += lzo/
+obj-$(CONFIG_$(PHASE_)LZMA) += lzma/
+obj-$(CONFIG_$(PHASE_)LZ4) += lz4_wrapper.o
 
 obj-$(CONFIG_$(XPL_)LIB_RATIONAL) += rational.o
 
index 20d46d161472da092582c01c065e99c3cfae188f..811e19917b438cffa9d3469f0b0541f586d3de35 100644 (file)
@@ -32,3 +32,9 @@ unsigned int crc8(unsigned int crc, const unsigned char *vptr, int len)
 
        return crc;
 }
+
+void crc8_wd_buf(const unsigned char *input, unsigned int len,
+                unsigned char output[1], unsigned int chunk_sz)
+{
+       *output = crc8(0, input, len);
+}
This page took 0.079351 seconds and 4 git commands to generate.