aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--boot/Kconfig71
-rw-r--r--boot/bootdev-uclass.c10
-rw-r--r--boot/image-fit.c29
-rw-r--r--common/Kconfig8
-rw-r--r--common/hash.c8
-rw-r--r--common/malloc_simple.c3
-rw-r--r--common/spl/Kconfig.vpl17
-rw-r--r--common/spl/spl.c15
-rw-r--r--common/spl/spl_atf.c36
-rw-r--r--common/spl/spl_fit.c12
-rw-r--r--common/spl/spl_legacy.c8
-rw-r--r--common/spl/spl_mmc.c6
-rw-r--r--configs/sandbox_vpl_defconfig2
-rw-r--r--include/image.h16
-rw-r--r--include/spl.h28
-rw-r--r--include/u-boot/crc.h3
-rw-r--r--lib/Kconfig53
-rw-r--r--lib/Makefile12
-rw-r--r--lib/crc8.c6
19 files changed, 275 insertions, 68 deletions
diff --git a/boot/Kconfig b/boot/Kconfig
index 99dcedcc840..20935a269c6 100644
--- a/boot/Kconfig
+++ b/boot/Kconfig
@@ -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"
diff --git a/boot/bootdev-uclass.c b/boot/bootdev-uclass.c
index 64ec4fde493..2e61c853142 100644
--- a/boot/bootdev-uclass.c
+++ b/boot/bootdev-uclass.c
@@ -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);
diff --git a/boot/image-fit.c b/boot/image-fit.c
index 7d56f0b5e6e..db7fb61bca9 100644
--- a/boot/image-fit.c
+++ b/boot/image-fit.c
@@ -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;
}
diff --git a/common/Kconfig b/common/Kconfig
index e8d89bf6eb9..0e8c44f3f74 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -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
diff --git a/common/hash.c b/common/hash.c
index db6925d6782..8dd9da85768 100644
--- a/common/hash.c
+++ b/common/hash.c
@@ -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",
diff --git a/common/malloc_simple.c b/common/malloc_simple.c
index 5a8ec538f8f..f0f90a095bd 100644
--- a/common/malloc_simple.c
+++ b/common/malloc_simple.c
@@ -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;
}
diff --git a/common/spl/Kconfig.vpl b/common/spl/Kconfig.vpl
index d06f36d4ee4..eb57dfabea5 100644
--- a/common/spl/Kconfig.vpl
+++ b/common/spl/Kconfig.vpl
@@ -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
diff --git a/common/spl/spl.c b/common/spl/spl.c
index 1ceb63daf31..ad31a2f8b6c 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -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;
diff --git a/common/spl/spl_atf.c b/common/spl/spl_atf.c
index 0397b86a33b..8bc5db77395 100644
--- a/common/spl/spl_atf.c
+++ b/common/spl/spl_atf.c
@@ -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;
/*
diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index 3160f573bfb..ac8462577ff 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -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;
diff --git a/common/spl/spl_legacy.c b/common/spl/spl_legacy.c
index 9252b3a3de0..b3efb3e630e 100644
--- a/common/spl/spl_legacy.c
+++ b/common/spl/spl_legacy.c
@@ -16,11 +16,11 @@
#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) ||
diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
index 1f696593216..fe4230170a0 100644
--- a/common/spl/spl_mmc.c
+++ b/common/spl/spl_mmc.c
@@ -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);
diff --git a/configs/sandbox_vpl_defconfig b/configs/sandbox_vpl_defconfig
index 84df2b85260..46329395ba5 100644
--- a/configs/sandbox_vpl_defconfig
+++ b/configs/sandbox_vpl_defconfig
@@ -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
diff --git a/include/image.h b/include/image.h
index cfe3c971a36..0a61dfd556c 100644
--- a/include/image.h
+++ b/include/image.h
@@ -1172,6 +1172,18 @@ 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
* @image_uname: The name of the image node
@@ -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);
diff --git a/include/spl.h b/include/spl.h
index 269e36bb441..43b344dbc55 100644
--- a/include/spl.h
+++ b/include/spl.h
@@ -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
*
diff --git a/include/u-boot/crc.h b/include/u-boot/crc.h
index 5174bd7ac41..b2badaf6a97 100644
--- a/include/u-boot/crc.h
+++ b/include/u-boot/crc.h
@@ -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);
diff --git a/lib/Kconfig b/lib/Kconfig
index 0b089814d14..8f1a96d98c4 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -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
diff --git a/lib/Makefile b/lib/Makefile
index d24ed629732..5cb3278d2ef 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -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
diff --git a/lib/crc8.c b/lib/crc8.c
index 20d46d16147..811e19917b4 100644
--- a/lib/crc8.c
+++ b/lib/crc8.c
@@ -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);
+}