All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chee, Tien Fong <tien.fong.chee@intel.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v4 2/2] common: Generic firmware loader for file system
Date: Tue, 19 Dec 2017 10:31:13 +0000	[thread overview]
Message-ID: <1513679469.2370.6.camel@intel.com> (raw)
In-Reply-To: <20171218083951.370d2373@karo-electronics.de>

On Isn, 2017-12-18 at 08:39 +0100, Lothar Waßmann wrote:
> Hi,
> 
> On Mon, 18 Dec 2017 13:10:56 +0800 tien.fong.chee at intel.com wrote:
> > 
> > From: Tien Fong Chee <tien.fong.chee@intel.com>
> > 
> > This is file system generic loader which can be used to load
> > the file image from the storage into target such as memory.
> > The consumer driver would then use this loader to program whatever,
> > ie. the FPGA device.
> > 
> > Signed-off-by: Tien Fong Chee <tien.fong.chee@intel.com>
> > ---
> >  common/Makefile            |   1 +
> >  common/fs_loader.c         | 311
> > +++++++++++++++++++++++++++++++++++++++++++++
> >  doc/README.firmware_loader |  77 +++++++++++
> >  include/fs_loader.h        |  28 ++++
> >  4 files changed, 417 insertions(+)
> >  create mode 100644 common/fs_loader.c
> >  create mode 100644 doc/README.firmware_loader
> >  create mode 100644 include/fs_loader.h
> > 
> [...]
> > 
> > diff --git a/common/fs_loader.c b/common/fs_loader.c
> > new file mode 100644
> > index 0000000..81cf5d6
> > --- /dev/null
> > +++ b/common/fs_loader.c
> [...]
> > 
> > +/*
> > + * Prepare firmware struct;
> > + * return -ve if fail.
> > + */
> > +static int _request_firmware_prepare(struct firmware **firmware_p,
> > +				     const char *name, void *dbuf,
> > +				     size_t size, u32 offset)
> > +{
> > +	struct firmware *firmware = NULL;
> > +	struct firmware_priv *fw_priv = NULL;
> > +
> > +	*firmware_p = NULL;
> > +
> > +	if (!name || name[0] == '\0')
> > +		return -EINVAL;
> > +
> > +	*firmware_p = firmware = calloc(1, sizeof(*firmware));
> > +
> > +	if (!firmware) {
> > +		printf("%s: calloc(struct firmware) failed\n",
> > __func__);
> > +		return -ENOMEM;
> > +	}
> > +
> > +	fw_priv = calloc(1, sizeof(*fw_priv));
> > +
> > +	if (!fw_priv) {
> > +		printf("%s: calloc(struct fw_priv) failed\n",
> > __func__);
> > +		return -ENOMEM;
> What about freeing 'firmware' and NULLing *firmware_p here?
There is no "freeing" support in U-Boot. I can assign NULL
to *firmware_p.
> Or better, do the assignment of *firmware_p at the end.
Are you means switch the location between *firmware_p and fw_priv in
calloc?
> 
> > 
> > +	}
> > +
> > +	fw_priv->name = name;
> > +	fw_priv->offset = offset;
> > +	firmware->data = dbuf;
> > +	firmware->size = size;
> > +	firmware->priv = fw_priv;
> > +
> > +	return 0;
> > +}
> > +
> > +/*
> > + * fw_get_filesystem_firmware - load firmware into an allocated
> > buffer
> > + * @location: An array of supported firmware location
> > + * @firmware_p: pointer to firmware image
> > + *
> > + * @return: size of total read
> > + *	    -ve when error
> > + */
> > +static int fw_get_filesystem_firmware(struct device_location
> > *location,
> > +				      struct firmware *firmware_p)
> > +{
> > +	struct firmware_priv *fw_priv = NULL;
> > +	loff_t actread;
> > +	char *dev_part;
> > +	int ret;
> > +
> > +	dev_part = env_get("FW_DEV_PART");
> > +	if (dev_part)
> > +		set_storage_devpart(location->name, dev_part);
> > +
> > +	ret = init_storage_device(location);
> > +	if (ret)
> > +		goto out;
> > +
> > +	select_fs_dev(location);
> > +	if (ret)
> > +		goto out;
> > +
> > +	fw_priv = (struct firmware_priv *)firmware_p->priv;
> > +
> useless type cast.
> 
I assume you are saying autocast, right? Let me check is there any
warning from compiler after removing the cast.
> > 
> > +	ret = fs_read(fw_priv->name, (ulong)firmware_p->data,
> > fw_priv->offset,
> > +		     firmware_p->size, &actread);
> > +
> > +	if (ret || (actread != firmware_p->size)) {
> > +		printf("Error: %d Failed to read %s from flash
> > %lld != %d.\n",
> > +		      ret, fw_priv->name, actread, firmware_p-
> > >size);
> > +		return -EPERM;
> Quoting myself from an earlier mail
> (20171212091442.2f6826fe at karo-electronics.de):
> > 
> > That's definitely not the right return code in this situation.
> > If 'ret' is != 0 you should return 'ret', otherwise EIO is more
> > appropriate here.
> 
Sorry for mising out this part. I would change that.
> 
> Lothar Waßmann

  reply	other threads:[~2017-12-19 10:31 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-18  5:10 [U-Boot] [PATCH v4 0/2] Generic firmware loader tien.fong.chee at intel.com
2017-12-18  5:10 ` [U-Boot] [PATCH v4 1/2] spl: Remove static declaration on spl_mmc_find_device function tien.fong.chee at intel.com
2017-12-18  5:10 ` [U-Boot] [PATCH v4 2/2] common: Generic firmware loader for file system tien.fong.chee at intel.com
2017-12-18  7:39   ` Lothar Waßmann
2017-12-19 10:31     ` Chee, Tien Fong [this message]
2017-12-19 11:15       ` Marek Vasut
2017-12-19 11:21       ` Lothar Waßmann
2017-12-21  5:39         ` Chee, Tien Fong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1513679469.2370.6.camel@intel.com \
    --to=tien.fong.chee@intel.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.