[U-Boot] [RFC PATCH 08/10] SPL: read and store arch property from U-Boot image
André Przywara
andre.przywara at arm.com
Fri Nov 18 02:50:27 CET 2016
On 05/11/16 16:10, Simon Glass wrote:
Hi Simon,
> On 2 November 2016 at 19:36, Andre Przywara <andre.przywara at arm.com> wrote:
>> Read the specified "arch" value from a legacy or FIT U-Boot image and
>> store it in our SPL data structure.
>> This allows loaders to take the target architecture in account for
>> custom loading procedures.
>> Having the complete string -> arch mapping for FIT based images in the
>> SPL would be too big, so we leave it up to architectures (or boards) to
>> overwrite the weak function that does the actual translation, possibly
>> covering only the required subset there.
>>
>> Signed-off-by: Andre Przywara <andre.przywara at arm.com>
>> ---
>> common/spl/spl.c | 1 +
>> common/spl/spl_fit.c | 8 ++++++++
>> include/spl.h | 3 ++-
>> 3 files changed, 11 insertions(+), 1 deletion(-)
>>
>
> Reviewed-by: Simon Glass <sjg at chromium.org>
Thanks!
>
>> diff --git a/common/spl/spl.c b/common/spl/spl.c
>> index bdb165a..f76ddd2 100644
>> --- a/common/spl/spl.c
>> +++ b/common/spl/spl.c
>> @@ -114,6 +114,7 @@ int spl_parse_image_header(struct spl_image_info *spl_image,
>> header_size;
>> }
>> spl_image->os = image_get_os(header);
>> + spl_image->arch = image_get_arch(header);
>> spl_image->name = image_get_name(header);
>> debug("spl: payload image: %.*s load addr: 0x%x size: %d\n",
>> (int)sizeof(spl_image->name), spl_image->name,
>> diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
>> index aae556f..a5d903b 100644
>> --- a/common/spl/spl_fit.c
>> +++ b/common/spl/spl_fit.c
>> @@ -123,6 +123,11 @@ static int get_aligned_image_size(struct spl_load_info *info, int data_size,
>> return (data_size + info->bl_len - 1) / info->bl_len;
>> }
>>
>> +__weak u8 spl_genimg_get_arch_id(const char *arch_str)
>> +{
>> + return IH_ARCH_DEFAULT;
>> +}
>> +
>
> Do we need this weak function, or could we just add a normal function
> in the ARM code somewhere?
Mmh, but this here is generic code. In a later patch I provide an ARM
specific function under arch/arm, but so far this weak function just
mimics the current behaviour: return the current architecture.
> If you don't think we need much error checking you could do something like:
>
> #ifdef CONFIG_ARM
> ... possible strcmp() here
> return IH_ARCH_ARM;
> #endif
So I found the weak function more elegant than #ifdef-ing architecture
specific code into a generic file.
Is there any issue with weak functions, shall we avoid them?
>
>> int spl_load_simple_fit(struct spl_image_info *spl_image,
>> struct spl_load_info *info, ulong sector, void *fit)
>> {
>> @@ -136,6 +141,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
>> int base_offset, align_len = ARCH_DMA_MINALIGN - 1;
>> int src_sector;
>> void *dst, *src;
>> + const char *arch_str;
>>
>> /*
>> * Figure out where the external images start. This is the base for the
>> @@ -184,10 +190,12 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
>> data_offset = fdt_getprop_u32(fit, node, "data-offset");
>> data_size = fdt_getprop_u32(fit, node, "data-size");
>> load = fdt_getprop_u32(fit, node, "load");
>> + arch_str = fdt_getprop(fit, node, "arch", NULL);
>> debug("data_offset=%x, data_size=%x\n", data_offset, data_size);
>> spl_image->load_addr = load;
>> spl_image->entry_point = load;
>> spl_image->os = IH_OS_U_BOOT;
>> + spl_image->arch = spl_genimg_get_arch_id(arch_str);
>>
>> /*
>> * Work out where to place the image. We read it so that the first
>> diff --git a/include/spl.h b/include/spl.h
>> index e080a82..6a9d2fb 100644
>> --- a/include/spl.h
>> +++ b/include/spl.h
>> @@ -22,11 +22,12 @@
>>
>> struct spl_image_info {
>> const char *name;
>> - u8 os;
>> u32 load_addr;
>> u32 entry_point;
>> u32 size;
>> u32 flags;
>> + u8 os;
>> + u8 arch;
>
> Can you please add a struct comment?
Is that something specific / a special documentation format or do you
mean just document the structure members?
Cheers,
Andre.
More information about the U-Boot
mailing list