spl: Use standard FIT entries

SPL is creating fit-images DT node when loadables are recorded in selected
configuration. Entries which are created are using entry-point and
load-addr property names. But there shouldn't be a need to use non standard
properties because entry/load are standard FIT properties. But using
standard FIT properties enables option to use generic FIT functions to
descrease SPL size. Here is result for ZynqMP virt configuration:
xilinx_zynqmp_virt: spl/u-boot-spl:all -82 spl/u-boot-spl:rodata -22 spl/u-boot-spl:text -60

The patch causes change in run time fit image record.
Before:
fit-images {
        uboot {
                os = "u-boot";
                type = "firmware";
                size = <0xfd520>;
                entry-point = <0x8000000>;
                load-addr = <0x8000000>;
        };
};

After:
fit-images {
        uboot {
                os = "u-boot";
                type = "firmware";
                size = <0xfd520>;
                entry = <0x8000000>;
                load = <0x8000000>;
        };
};

Replacing calling fdt_getprop_u32() by fit_image_get_entry/load() also
enables support for reading entry/load properties recorded in 64bit format.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Michal Simek
2020-09-03 11:24:28 +02:00
parent ea836be1e7
commit caa7fc2c57
5 changed files with 100 additions and 11 deletions

View File

@@ -616,9 +616,9 @@ int fdt_record_loadable(void *blob, u32 index, const char *name,
* However, spl_fit.c is not 64bit safe either: i.e. we should not
* have an issue here.
*/
fdt_setprop_u32(blob, node, "load-addr", load_addr);
fdt_setprop_u32(blob, node, "load", load_addr);
if (entry_point != -1)
fdt_setprop_u32(blob, node, "entry-point", entry_point);
fdt_setprop_u32(blob, node, "entry", entry_point);
fdt_setprop_u32(blob, node, "size", size);
if (type)
fdt_setprop_string(blob, node, "type", type);

View File

@@ -132,10 +132,11 @@ static int spl_fit_images_find(void *blob, int os)
uintptr_t spl_fit_images_get_entry(void *blob, int node)
{
ulong val;
int ret;
val = fdt_getprop_u32(blob, node, "entry-point");
if (val == FDT_ERROR)
val = fdt_getprop_u32(blob, node, "load-addr");
ret = fit_image_get_entry(blob, node, &val);
if (ret)
ret = fit_image_get_load(blob, node, &val);
debug("%s: entry point 0x%lx\n", __func__, val);
return val;

View File

@@ -332,9 +332,15 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
}
if (image_info) {
ulong entry_point;
image_info->load_addr = load_addr;
image_info->size = length;
image_info->entry_point = fdt_getprop_u32(fit, node, "entry");
if (!fit_image_get_entry(fit, node, &entry_point))
image_info->entry_point = entry_point;
else
image_info->entry_point = FDT_ERROR;
}
return 0;

View File

@@ -61,11 +61,9 @@ void spl_invoke_opensbi(struct spl_image_info *spl_image)
}
/* Get U-Boot entry point */
uboot_entry = fdt_getprop_u32(spl_image->fdt_addr, uboot_node,
"entry-point");
if (uboot_entry == FDT_ERROR)
uboot_entry = fdt_getprop_u32(spl_image->fdt_addr, uboot_node,
"load-addr");
ret = fit_image_get_entry(spl_image->fdt_addr, uboot_node, &uboot_entry);
if (ret)
ret = fit_image_get_load(spl_image->fdt_addr, uboot_node, &uboot_entry);
/* Prepare obensbi_info object */
opensbi_info.magic = FW_DYNAMIC_INFO_MAGIC_VALUE;