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.

Simon, which one do you prefer?


[1] http://patchwork.ozlabs.org/patch/610371/ (Still working on this :( )


Thanks and regards,
Lokesh

>               while (size >= mydata->sect_size) {
>                       ret = disk_read(startsect++, 1, tmpbuf);
>                       if (ret != 1) {
> 
_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to