mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-21 06:31:31 +00:00
spl: fit: Support both external and embedded data
SPL supports U-Boot image in FIT format which has data outside of FIT structure. This adds support for embedded data for normal FIT images. Signed-off-by: York Sun <york.sun@nxp.com> Reviewed-by: Tom Rini <trini@konsulko.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
7264f2928b
commit
5fd13d9736
2 changed files with 37 additions and 19 deletions
|
@ -132,14 +132,16 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
|
||||||
void *fit, ulong base_offset, int node,
|
void *fit, ulong base_offset, int node,
|
||||||
struct spl_image_info *image_info)
|
struct spl_image_info *image_info)
|
||||||
{
|
{
|
||||||
ulong offset;
|
int offset;
|
||||||
size_t length;
|
size_t length;
|
||||||
|
int len;
|
||||||
ulong load_addr, load_ptr;
|
ulong load_addr, load_ptr;
|
||||||
void *src;
|
void *src;
|
||||||
ulong overhead;
|
ulong overhead;
|
||||||
int nr_sectors;
|
int nr_sectors;
|
||||||
int align_len = ARCH_DMA_MINALIGN - 1;
|
int align_len = ARCH_DMA_MINALIGN - 1;
|
||||||
uint8_t image_comp = -1, type = -1;
|
uint8_t image_comp = -1, type = -1;
|
||||||
|
const void *data;
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_SPL_OS_BOOT) && IS_ENABLED(CONFIG_SPL_GZIP)) {
|
if (IS_ENABLED(CONFIG_SPL_OS_BOOT) && IS_ENABLED(CONFIG_SPL_GZIP)) {
|
||||||
if (fit_image_get_comp(fit, node, &image_comp))
|
if (fit_image_get_comp(fit, node, &image_comp))
|
||||||
|
@ -153,28 +155,40 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
|
||||||
debug("%s ", genimg_get_type_name(type));
|
debug("%s ", genimg_get_type_name(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
offset = fdt_getprop_u32(fit, node, "data-offset");
|
if (fit_image_get_load(fit, node, &load_addr))
|
||||||
if (offset == FDT_ERROR)
|
|
||||||
return -ENOENT;
|
|
||||||
offset += base_offset;
|
|
||||||
length = fdt_getprop_u32(fit, node, "data-size");
|
|
||||||
if (length == FDT_ERROR)
|
|
||||||
return -ENOENT;
|
|
||||||
load_addr = fdt_getprop_u32(fit, node, "load");
|
|
||||||
if (load_addr == FDT_ERROR && image_info)
|
|
||||||
load_addr = image_info->load_addr;
|
load_addr = image_info->load_addr;
|
||||||
load_ptr = (load_addr + align_len) & ~align_len;
|
|
||||||
|
|
||||||
overhead = get_aligned_image_overhead(info, offset);
|
if (!fit_image_get_data_offset(fit, node, &offset)) {
|
||||||
nr_sectors = get_aligned_image_size(info, length, offset);
|
/* External data */
|
||||||
|
offset += base_offset;
|
||||||
|
if (fit_image_get_data_size(fit, node, &len))
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
if (info->read(info, sector + get_aligned_image_offset(info, offset),
|
load_ptr = (load_addr + align_len) & ~align_len;
|
||||||
nr_sectors, (void*)load_ptr) != nr_sectors)
|
length = len;
|
||||||
return -EIO;
|
|
||||||
debug("image dst=%lx, offset=%lx, size=%lx\n", load_ptr, offset,
|
overhead = get_aligned_image_overhead(info, offset);
|
||||||
(unsigned long)length);
|
nr_sectors = get_aligned_image_size(info, length, offset);
|
||||||
|
|
||||||
|
if (info->read(info,
|
||||||
|
sector + get_aligned_image_offset(info, offset),
|
||||||
|
nr_sectors, (void *)load_ptr) != nr_sectors)
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
debug("External data: dst=%lx, offset=%x, size=%lx\n",
|
||||||
|
load_ptr, offset, (unsigned long)length);
|
||||||
|
src = (void *)load_ptr + overhead;
|
||||||
|
} else {
|
||||||
|
/* Embedded data */
|
||||||
|
if (fit_image_get_data(fit, node, &data, &length)) {
|
||||||
|
puts("Cannot get image data/size\n");
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
debug("Embedded data: dst=%lx, size=%lx\n", load_addr,
|
||||||
|
(unsigned long)length);
|
||||||
|
src = (void *)data;
|
||||||
|
}
|
||||||
|
|
||||||
src = (void *)load_ptr + overhead;
|
|
||||||
#ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
|
#ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
|
||||||
board_fit_image_post_process(&src, &length);
|
board_fit_image_post_process(&src, &length);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -288,6 +288,10 @@ The 'data-offset' property can be substituted with 'data-position', which
|
||||||
defines an absolute position or address as the offset. This is helpful when
|
defines an absolute position or address as the offset. This is helpful when
|
||||||
booting U-Boot proper before performing relocation.
|
booting U-Boot proper before performing relocation.
|
||||||
|
|
||||||
|
Normal kernel FIT image has data embedded within FIT structure. U-Boot image
|
||||||
|
for SPL boot has external data. Existence of 'data-offset' can be used to
|
||||||
|
identify which format is used.
|
||||||
|
|
||||||
9) Examples
|
9) Examples
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue