[U-Boot] [PATCH v4 06/20] common: Generic firmware loader for file system

Chee, Tien Fong tien.fong.chee at intel.com
Tue Oct 31 11:15:29 UTC 2017


On Sel, 2017-10-31 at 12:01 +0100, Marek Vasut wrote:
> On 10/31/2017 11:52 AM, tien.fong.chee at intel.com wrote:
> > 
> > From: Tien Fong Chee <tien.fong.chee at intel.com>
> > 
> > Generic firmware loader framework contains some common
> > functionality
> > which is reusable by any specific driver file system firmware
> > loader.
> > Specific driver file system firmware loader handling can be defined
> > with both weak function fsloader_preprocess and fs_loading.
> > 
> > Signed-off-by: Tien Fong Chee <tien.fong.chee at intel.com>
> Why did you put everything into splash_source.c ? If this is supposed
> to
> be a generic loader, I'm sure not everyone would want to enable
> splash
> screen support to get generic firmware loader support.
> 
> The API should looks more like the linux firmware API.
> 
Initially, i created the new file called loadfs.c, which contains
common codes and generic fs firmware loader. I plan to replace fs
loader in splash_source.c at seperate patchset.

Then, i changed the codes directly on splash_source.c based on your
comment. May be i misunderstood your meaning.
> > 
> > ---
> >  common/Makefile                         |   7 +-
> >  common/splash_source.c                  | 110
> > +++++++++++++++++++++++++-------
> >  configs/socfpga_arria10_defconfig       |   2 +
> >  include/configs/socfpga_arria10_socdk.h |   3 +
> >  include/splash.h                        |   3 +
> >  5 files changed, 99 insertions(+), 26 deletions(-)
> > 
> > diff --git a/common/Makefile b/common/Makefile
> > index 801ea31..965a217 100644
> > --- a/common/Makefile
> > +++ b/common/Makefile
> > @@ -47,8 +47,6 @@ obj-$(CONFIG_MTD_NOR_FLASH) += flash.o
> >  obj-$(CONFIG_CMD_KGDB) += kgdb.o kgdb_stubs.o
> >  obj-$(CONFIG_I2C_EDID) += edid.o
> >  obj-$(CONFIG_KALLSYMS) += kallsyms.o
> > -obj-y += splash.o
> > -obj-$(CONFIG_SPLASH_SOURCE) += splash_source.o
> >  ifndef CONFIG_DM_VIDEO
> >  obj-$(CONFIG_LCD) += lcd.o lcd_console.o
> >  endif
> > @@ -102,7 +100,6 @@ endif
> >  obj-y += image.o
> >  obj-$(CONFIG_ANDROID_BOOT_IMAGE) += image-android.o
> >  obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += image-fdt.o
> > -obj-$(CONFIG_$(SPL_TPL_)FIT) += image-fit.o
> >  obj-$(CONFIG_FIT_EMBED) += boot_fit.o common_fit.o
> >  obj-$(CONFIG_$(SPL_TPL_)FIT_SIGNATURE) += image-sig.o
> >  obj-$(CONFIG_IO_TRACE) += iotrace.o
> > @@ -130,3 +127,7 @@ obj-$(CONFIG_CMD_DFU) += dfu.o
> >  obj-y += command.o
> >  obj-y += s_record.o
> >  obj-y += xyzModem.o
> > +
> > +obj-y += splash.o
> > +obj-$(CONFIG_SPLASH_SOURCE) += splash_source.o
> > +obj-$(CONFIG_$(SPL_TPL_)FIT) += image-fit.o
> > diff --git a/common/splash_source.c b/common/splash_source.c
> > index e0defde..1413945 100644
> > --- a/common/splash_source.c
> > +++ b/common/splash_source.c
> > @@ -109,7 +109,7 @@ splash_address_too_high:
> >  	return -EFAULT;
> >  }
> >  
> > -static int splash_select_fs_dev(struct splash_location *location)
> > +int splash_select_fs_dev(struct splash_location *location)
> >  {
> >  	int res;
> >  
> > @@ -140,6 +140,7 @@ static int splash_select_fs_dev(struct
> > splash_location *location)
> >  	return res;
> >  }
> >  
> > +#ifndef CONFIG_SPL_BUILD
> >  #ifdef CONFIG_USB_STORAGE
> >  static int splash_init_usb(void)
> >  {
> > @@ -175,6 +176,7 @@ static inline int splash_init_sata(void)
> >  	return -ENOSYS;
> >  }
> >  #endif
> > +#endif
> >  
> >  #ifdef CONFIG_CMD_UBIFS
> >  static int splash_mount_ubifs(struct splash_location *location)
> > @@ -213,22 +215,99 @@ static inline int splash_umount_ubifs(void)
> >  
> >  #define SPLASH_SOURCE_DEFAULT_FILE_NAME		"splash.bmp
> > "
> >  
> > -static int splash_load_fs(struct splash_location *location, u32
> > bmp_load_addr)
> > +/**
> > + * fsloader_preprocess - Any prepocessing before calling
> > filesystem loader.
> > + *
> > + * @locations:		An array of supported splash
> > locations.
> > + * @file_info:		Description and attributes to the
> > image.
> > + *			Could be structure pointer, and any type
> > pointer.
> > + * @filename:		Image filename in flashes.
> > + * @bmp_load_addr:	Target memory location image loaded to.
> > + *
> > + * @return:	If 0, processing is succesfull. Filename
> > pointer contains
> > + *		valid filename.
> > + *		If -ve, processing is failed.
> > + */
> > +__weak int fsloader_preprocess(struct splash_location *location,
> > +			       void *file_info, char **filename,
> > +			       u32 bmp_load_addr)
> >  {
> >  	int res = 0;
> >  	loff_t bmp_size;
> > -	loff_t actread;
> >  	char *splash_file;
> >  
> > -	splash_file = env_get("splashfile");
> > +	splash_file = env_get((char *)file_info);
> > +
> >  	if (!splash_file)
> >  		splash_file = SPLASH_SOURCE_DEFAULT_FILE_NAME;
> >  
> > +	res = splash_select_fs_dev(location);
> > +	if (res) {
> > +		error("Error : Failed to select FS device\n");
> > +		return -EPERM;
> > +	}
> > +
> > +	res = fs_size(splash_file, &bmp_size);
> > +	if (res) {
> > +		error("Error (%d): cannot determine file size\n",
> > res);
> > +		return -ENOENT;
> > +	}
> > +
> > +	if ((u32)bmp_load_addr + bmp_size >= gd->start_addr_sp) {
> > +		error("Error: splashimage address too high. Data
> > overwrites ");
> > +		error("U-Boot and/or placed beyond DRAM
> > boundaries.\n");
> > +		res = -EFAULT;
> > +		return -EFAULT;
> > +	}
> > +
> > +	*filename = splash_file;
> > +
> > +	return res;
> > +}
> > +
> > +/**
> > + * fs_loading - This place is for implementing whaterver blob +
> > whatever
> > + *		specific driver to the HW such as program raw
> > binary file to
> > + *		FPGA.
> > + *
> > + * @locations:		An array of supported splash
> > locations.
> > + * @file_info:		Description and attributes to the
> > image.
> > + *			Could be structure pointer, and any type
> > pointer.
> > + * @filename:		Image filename in flashes.
> > + * @bmp_load_addr:	Target memory location image loaded to.
> > + * @bsize:		Size of target memory location.
> > + *
> > + * @return:	If 0, loading is succesfull. Filename pointer
> > contains
> > + *		valid filename.
> > + *		If non-zero, loading is failed.
> > + */
> > +__weak int fs_loading(struct splash_location *location, void
> > *file_info,
> > +		      char *filename, u32 bmp_load_addr, size_t
> > bsize)
> > +{
> > +	loff_t actread;
> > +
> > +	return fs_read(filename, (u32)bmp_load_addr, 0, 0,
> > &actread);
> > +}
> > +
> > +int splash_load_fs(struct splash_location *location, void
> > *file_info,
> > +		   u32 bmp_load_addr, size_t bsize)
> > +{
> > +	int res = 0;
> > +	char *splash_file = NULL;
> > +
> > +	res = fsloader_preprocess(location, file_info,
> > &splash_file,
> > +				  bmp_load_addr);
> > +
> > +	if (res)
> > +		goto out;
> > +
> > +#ifndef CONFIG_SPL_BUILD
> >  	if (location->storage == SPLASH_STORAGE_USB)
> >  		res = splash_init_usb();
> >  
> >  	if (location->storage == SPLASH_STORAGE_SATA)
> >  		res = splash_init_sata();
> > +#endif
> >  
> >  	if (location->ubivol != NULL)
> >  		res = splash_mount_ubifs(location);
> > @@ -236,24 +315,8 @@ static int splash_load_fs(struct
> > splash_location *location, u32 bmp_load_addr)
> >  	if (res)
> >  		return res;
> >  
> > -	res = splash_select_fs_dev(location);
> > -	if (res)
> > -		goto out;
> > -
> > -	res = fs_size(splash_file, &bmp_size);
> > -	if (res) {
> > -		printf("Error (%d): cannot determine file size\n",
> > res);
> > -		goto out;
> > -	}
> > -
> > -	if (bmp_load_addr + bmp_size >= gd->start_addr_sp) {
> > -		printf("Error: splashimage address too high. Data
> > overwrites U-Boot and/or placed beyond DRAM boundaries.\n");
> > -		res = -EFAULT;
> > -		goto out;
> > -	}
> > -
> > -	splash_select_fs_dev(location);
> > -	res = fs_read(splash_file, bmp_load_addr, 0, 0, &actread);
> > +	res = fs_loading(location, file_info, splash_file,
> > bmp_load_addr,
> > +			bsize);
> >  
> >  out:
> >  	if (location->ubivol != NULL)
> > @@ -405,7 +468,8 @@ int splash_source_load(struct splash_location
> > *locations, uint size)
> >  	if (splash_location->flags == SPLASH_STORAGE_RAW)
> >  		return splash_load_raw(splash_location,
> > bmp_load_addr);
> >  	else if (splash_location->flags == SPLASH_STORAGE_FS)
> > -		return splash_load_fs(splash_location,
> > bmp_load_addr);
> > +		return splash_load_fs(splash_location,
> > "splashfile",
> > +				      bmp_load_addr, 0);
> >  #ifdef CONFIG_FIT
> >  	else if (splash_location->flags == SPLASH_STORAGE_FIT)
> >  		return splash_load_fit(splash_location,
> > bmp_load_addr);
> > diff --git a/configs/socfpga_arria10_defconfig
> > b/configs/socfpga_arria10_defconfig
> > index 4c73d73..2db34b5 100644
> > --- a/configs/socfpga_arria10_defconfig
> > +++ b/configs/socfpga_arria10_defconfig
> > @@ -7,6 +7,8 @@
> > CONFIG_DEFAULT_DEVICE_TREE="socfpga_arria10_socdk_sdmmc"
> >  CONFIG_USE_BOOTARGS=y
> >  CONFIG_BOOTARGS="console=ttyS0,115200"
> >  CONFIG_DEFAULT_FDT_FILE="socfpga_arria10_socdk_sdmmc.dtb"
> > +CONFIG_FIT=y
> > +CONFIG_SPL_FIT=y
> >  CONFIG_SPL=y
> >  CONFIG_SPL_FPGA_SUPPORT=y
> >  CONFIG_CMD_BOOTZ=y
> > diff --git a/include/configs/socfpga_arria10_socdk.h
> > b/include/configs/socfpga_arria10_socdk.h
> > index 83718dd..9566d46 100644
> > --- a/include/configs/socfpga_arria10_socdk.h
> > +++ b/include/configs/socfpga_arria10_socdk.h
> > @@ -47,6 +47,9 @@
> >   */
> >  #define CONFIG_SYS_MAX_FLASH_BANKS     1
> >  
> > +/* Generic FS loader */
> > +#define CONFIG_SPLASH_SOURCE
> > +
> >  /* The rest of the configuration is shared */
> >  #include <configs/socfpga_common.h>
> >  
> > diff --git a/include/splash.h b/include/splash.h
> > index 228aff4..83a6890 100644
> > --- a/include/splash.h
> > +++ b/include/splash.h
> > @@ -59,6 +59,9 @@ static inline int splash_source_load(struct
> > splash_location *locations,
> >  #endif
> >  
> >  int splash_screen_prepare(void);
> > +int splash_select_fs_dev(struct splash_location *location);
> > +int splash_load_fs(struct splash_location *location, void
> > *file_info,
> > +		   u32 bmp_load_addr, size_t bsize);
> >  
> >  #ifdef CONFIG_SPLASH_SCREEN_ALIGN
> >  void splash_get_pos(int *x, int *y);
> > 
> 


More information about the U-Boot mailing list