On 2.5.2016 06:06, Lokesh Vutla wrote:
> Hi Michal,
> 
> On Thursday 28 April 2016 03:01 PM, Michal Simek wrote:
>> Support U-Boot SPL to load FIT image from fat partition.
>> Fit image can be setup via CONFIG_SPL_FS_LOAD_KERNEL_NAME.
>> Falcon mode is not supported.
>>
>> Signed-off-by: Michal Simek <[email protected]>
>> ---
>>
>>  common/spl/spl_fat.c | 50 ++++++++++++++++++++++++++++++++++++++++++++------
>>  fs/fat/fat.c         |  4 ++--
>>  2 files changed, 46 insertions(+), 8 deletions(-)
>>
>> diff --git a/common/spl/spl_fat.c b/common/spl/spl_fat.c
>> index d16cd540e38a..4e319c5fa470 100644
>> --- a/common/spl/spl_fat.c
>> +++ b/common/spl/spl_fat.c
>> @@ -13,6 +13,7 @@
>>  #include <spl.h>
>>  #include <asm/u-boot.h>
>>  #include <fat.h>
>> +#include <libfdt.h>
>>  #include <errno.h>
>>  #include <image.h>
>>  
>> @@ -39,6 +40,29 @@ static int spl_register_fat_device(struct blk_desc 
>> *block_dev, int partition)
>>      return err;
>>  }
>>  
>> +#ifdef CONFIG_SPL_LOAD_FIT
>> +static ulong spl_fat_file_read(struct spl_load_info *load, ulong sector,
>> +                           ulong count, void *buf)
>> +{
>> +    int err;
>> +    loff_t actread;
>> +    char *filename = (char *)load->priv;
>> +
>> +    debug("%s: name %s, sector %lx, count %lx, buf %lx\n",
>> +          __func__, filename,  sector, count, (ulong)buf);
>> +
>> +    err = file_fat_read_at(filename, sector, buf, count, &actread);
>> +    if (err < 0) {
>> +            printf("%s: error reading image %s, err - %d\n",
>> +                   __func__, filename, err);
>> +            return err;
>> +    }
>> +
>> +    debug("actread %lx\n", (ulong)actread);
>> +    return actread;
>> +}
>> +#endif
>> +
>>  int spl_load_image_fat(struct blk_desc *block_dev,
>>                                              int partition,
>>                                              const char *filename)
>> @@ -57,16 +81,29 @@ int spl_load_image_fat(struct blk_desc *block_dev,
>>      if (err <= 0)
>>              goto end;
>>  
>> -    spl_parse_image_header(header);
>> +    if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
>> +        image_get_magic(header) == FDT_MAGIC) {
>> +            struct spl_load_info load;
>> +
>> +            debug("Found FIT\n");
>> +            load.priv = (char *)filename;
>> +            load.bl_len = 1;
>> +            load.read = spl_fat_file_read;
>> +            spl_load_simple_fit(&load, 0, header);
>> +    } else {
>> +            debug("Legacy image\n");
>>  
>> -    err = file_fat_read(filename, (u8 *)(uintptr_t)spl_image.load_addr, 0);
>> +            spl_parse_image_header(header);
>>  
>> +            err = file_fat_read(filename,
>> +                                (u8 *)(uintptr_t)spl_image.load_addr, 0);
>>  end:
>>  #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
>> -    if (err <= 0)
>> -            printf("%s: error reading image %s, err - %d\n",
>> -                   __func__, filename, err);
>> +            if (err <= 0)
>> +                    printf("%s: error reading image %s, err - %d\n",
>> +                           __func__, filename, err);
>>  #endif
>> +    }
>>  
>>      return (err <= 0);
>>  }
>> @@ -81,6 +118,7 @@ int spl_load_image_fat_os(struct blk_desc *block_dev, int 
>> partition)
>>      if (err)
>>              return err;
>>  
>> +#if !defined(CONFIG_SPL_LOAD_FIT)
>>  #if defined(CONFIG_SPL_ENV_SUPPORT) && defined(CONFIG_SPL_OS_BOOT)
>>      file = getenv("falcon_args_file");
>>      if (file) {
>> @@ -116,7 +154,7 @@ defaults:
>>  #endif
>>              return -1;
>>      }
>> -
>> +#endif
>>      return spl_load_image_fat(block_dev, partition,
>>                      CONFIG_SPL_FS_LOAD_KERNEL_NAME);
>>  }
>> diff --git a/fs/fat/fat.c b/fs/fat/fat.c
>> index 600a90e30922..0d987e0465ee 100644
>> --- a/fs/fat/fat.c
>> +++ b/fs/fat/fat.c
>> @@ -281,9 +281,9 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8 
>> *buffer, unsigned long size)
>>  
>>      if ((unsigned long)buffer & (ARCH_DMA_MINALIGN - 1)) {
>>              ALLOC_CACHE_ALIGN_BUFFER(__u8, tmpbuf, mydata->sect_size);
>> -
>> +#if !defined(CONFIG_SPL_LOAD_FIT)
>>              printf("FAT: Misaligned buffer address (%p)\n", buffer);
>> -
>> +#endif
> 
> IMO, this is a hack. Why should fs worry about if it as fit image or
> not. Also the read performance will be very slow if you do not pass the
> aligned buffer address.  I had a different approach[1] for this: first
> copy the image to aligned buffer and then do a memcpy to the proper
> destination(which showed a better performance). May be this is wrong.

I agree that's why this was RFC not regular patch.
I have looked at your solution and also Simon's comments and truth is
that your patch has a lot of duplicated stuff.
This solution is smaller.
Regarding buffer alignment. I think this can be simply added to read
function to keep it in the right place.

Thanks,
Michal


_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to