[PATCH v5 04/11] spl: Convert fat to spl_load

Sean Anderson sean.anderson at seco.com
Thu Aug 3 18:23:37 CEST 2023


On 8/3/23 04:30, Xavier Drudis Ferran wrote:
> El Mon, Jul 31, 2023 at 06:42:56PM -0400, Sean Anderson deia:
>> This converts the fat loader to use spl_load. Some platforms are very
>> tight on space, so we take care to only include the code we really need.
>> 
>> Signed-off-by: Sean Anderson <sean.anderson at seco.com>
>> ---
>> 
>> Changes in v5:
>> - Rework to load header in spl_load
>> 
>> Changes in v3:
>> - Fix failing on success
>> 
>>  common/spl/spl_fat.c | 55 +++++++++++++++-----------------------------
>>  1 file changed, 19 insertions(+), 36 deletions(-)
>> 
>> diff --git a/common/spl/spl_fat.c b/common/spl/spl_fat.c
>> index f8a5b80a3b..6530bcd5a7 100644
>> --- a/common/spl/spl_fat.c
>> +++ b/common/spl/spl_fat.c
>> @@ -60,57 +60,40 @@ int spl_load_image_fat(struct spl_image_info *spl_image,
>>  		       const char *filename)
>>  {
>>  	int err;
>> -	struct legacy_img_hdr *header;
>> +	loff_t size;
>> +	struct spl_load_info load;
>> +
>> +	/* This generates smaller code than using a compound literal */
>> +	load.read = spl_fit_read;
>> +	load.bl_len = 1;
>> +	load.filename = filename;
>>  
>>  	err = spl_register_fat_device(block_dev, partition);
>>  	if (err)
>>  		goto end;
>>  
>> -	header = spl_get_load_buffer(-sizeof(*header), sizeof(*header));
>> -
>> -	err = file_fat_read(filename, header, sizeof(struct legacy_img_hdr));
>> -	if (err <= 0)
>> -		goto end;
>> -
>> -	if (IS_ENABLED(CONFIG_SPL_LOAD_FIT_FULL) &&
>> -	    image_get_magic(header) == FDT_MAGIC) {
>> -		err = file_fat_read(filename, (void *)CONFIG_SYS_LOAD_ADDR, 0);
>> -		if (err <= 0)
>> -			goto end;
>> -		err = spl_parse_image_header(spl_image, bootdev,
>> -				(struct legacy_img_hdr *)CONFIG_SYS_LOAD_ADDR);
> 
> So this used to load to CONFIG_SYS_LOAD_ADDR and will now load to
> CONFIG_TEXT_BASE, or whatever the applicable spl_get_load_buffer()
> uses. Is this OK ? or do we need a new parameter for the buffer or
> something ?

It's worked OK in my testing. Typically, CONFIG_SYS_LOAD_ADDR is just
CONFIG_TEXT_BASE plus some offset. If there's a discontinuity such as:

TEXT_BASE - 0x000000000
RAM_TOP   - 0x07fffffff
LOAD_ADDR - 0x800000000
RAM2_TOP  - 0xfffffffff

then this only matters if we load something larger than 2G. Obviously
not every RAM layout looks like this, but Most of the Time (TM) the
memory set aside for U-Boot to run in can hold the FIT that holds
U-Boot. If this ends up being a problem, we can add a config to load
things in a malloc'd buffer. This change could be moved to a prep commit
to aid bisecting.

--Sean

>> -		if (err == -EAGAIN)
>> -			return err;
>> -		if (err == 0)
>> -			err = 1;
>> -	} else if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
>> -	    image_get_magic(header) == FDT_MAGIC) {
>> -		struct spl_load_info load;
>> -
>> -		debug("Found FIT\n");
>> -		load.read = spl_fit_read;
>> -		load.bl_len = 1;
>> -		load.filename = (void *)filename;
>> -		load.priv = NULL;
>> -
>> -		return spl_load_simple_fit(spl_image, &load, 0, header);
>> -	} else {
>> -		err = spl_parse_image_header(spl_image, bootdev, header);
>> +	/*
>> +	 * Avoid pulling in this function for other image types since we are
>> +	 * very short on space on some boards.
>> +	 */
>> +	if (IS_ENABLED(CONFIG_SPL_LOAD_FIT_FULL)) {
>> +		err = fat_size(filename, &size);
>>  		if (err)
>>  			goto end;
>> -
>> -		err = file_fat_read(filename,
>> -				    (u8 *)(uintptr_t)spl_image->load_addr, 0);
>> +	} else {
>> +		size = 0;
>>  	}
>>  
>> +	err = spl_load(spl_image, bootdev, &load, 0, size);
>> +
>>  end:
>>  #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
>> -	if (err <= 0)
>> +	if (err < 0)
>>  		printf("%s: error reading image %s, err - %d\n",
>>  		       __func__, filename, err);
>>  #endif
>>  
>> -	return (err <= 0);
>> +	return err;
>>  }
>>  
>>  #if CONFIG_IS_ENABLED(OS_BOOT)
>> -- 
>> 2.40.1
>> 


More information about the U-Boot mailing list