[U-Boot] [PATCH] env: add flash_read function

Horatiu Vultur horatiu.vultur at microchip.com
Tue Dec 4 17:19:09 UTC 2018


Hi Wolfgang,

The 12/03/2018 17:08, Wolfgang Denk wrote:
> Dear Horatiu,
> 
> In message <1543678222-15837-1-git-send-email-horatiu.vultur at microchip.com> you wrote:
> > The flash_read function is a wrapper over spi_flash_read, which enables
> > the env to read multiple flash page size from flash until '\0\0' is read
> > or the end of env partition is reached. Instead of reading the entire env
> > size. When it reads '\0\0', it stops reading further the env and assumes
> > that the rest of env is '\0'.
> > 
> > This is an optimization for large environments that contain few bytes of
> > environment variables. In this case it doesn't need to read the entire
> > environment and only few pages.
> > 
> > Signed-off-by: Horatiu Vultur <horatiu.vultur at microchip.com>
> > ---
> >  env/sf.c | 54 +++++++++++++++++++++++++++++++++++++++++++-----------
> >  1 file changed, 43 insertions(+), 11 deletions(-)
> > 
> > diff --git a/env/sf.c b/env/sf.c
> > index 2e3c600..e1e1a94 100644
> > --- a/env/sf.c
> > +++ b/env/sf.c
> > @@ -81,6 +81,39 @@ static int setup_flash_device(void)
> >  	return 0;
> >  }
> >  
> > +static int is_end(char *addr, int size)
> 
> That should be
> 
> 	(const char *addr, size_t size)
> 
> instead.

I will change this in the next version.
> 
> > +static int flash_read(struct spi_flash *flash, u32 offset, int size, void *buf)
> 
> I think this should be
> 
> 	(const struct spi_flash *flash, u32 offset, size_t len, void *buf)
> 
> [Yes, for reasons of consistency with spi_flash_read() I would also
> rename "size" into "len".]
> 

The same here.

> 
> Also I recommend to chose another name for the function instead of
> "flash_read".  At first glance this looks like a generalization over
> spi_flash_read() which supports other flash types than SPI flash as
> well - but it does not.  Instead, it is a specialized version of
> spi_flash_read() tailored for environment reading only.
> 
> Maybe spi_flash_read_env() would be a more reasonable name?
> 

Yes spi_flash_read_env is a better name. I will update it in the next
version.

> 
> > +static int flash_read(struct spi_flash *flash, u32 offset, int size, void *buf)
> > +{
> > +	u32 addr = 0;
> > +	u32 page_size = flash->page_size;
> > +
> > +	memset(buf, 0x0, size);
> > +	for (int i = 0; i < size / page_size; ++i) {
> > +		int ret = spi_flash_read(flash, offset, page_size,
> > +					 &((char *)buf)[addr]);
> > +
> > +		if (ret < 0)
> > +			return ret;
> > +
> > +		if (is_end(&((char *)buf)[addr], page_size))
> > +			return 0;
> > +
> > +		addr += page_size;
> > +		offset += page_size;
> > +	}
> > +	return 0;
> 
> Is this correct?  Is the read() function not supposed to return the
> number of read bytes?

It is true that C read function returns the number of bytes read, but
the intention of the function flash_read was to mimic the function
spi_flash_read, which returns 0 if OK otherwise an error code. And
that's the reason why the function flash_read returns 0 and not number
of bytes read.

It would not be a problem for me to change the function flash_read to
return the number of bytes read.

> 
> Best regards,
> 
> Wolfgang Denk
> 
> -- 
> DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
> The optimum committee has no members.
>                                                    - Norman Augustine

-- 
Thanks,
/Horatiu


More information about the U-Boot mailing list