[Skiboot] [RFC PATCH 1/2] libflash: don't use the low level interface if it doesn't exist

Cyril Bur cyril.bur at au1.ibm.com
Wed Apr 1 16:45:21 AEDT 2015


On Thu, 2015-03-26 at 11:44 +1100, Daniel Axtens wrote:
> On Thu, 2015-03-19 at 18:18 +1100, Cyril Bur wrote:
> > During init libflash calls low level functions without checking.
> > 
> > libflash states to backends that if they implement all the higher level
> > functions the lower level functions are optional (from libflash-priv.h):
> >   If all functions of the high level interface are
> >   implemented then the low level one is optional. A
> >   controller can implement some of the high level one
> >   in which case the missing ones will be handled by
> >   libflash using the low level interface.
> > 
> > Signed-off-by: Cyril Bur <cyril.bur at au1.ibm.com>
> 
> 
> I think you've missed fl_wpage.
> 
It's not clear to me if fl_wpage() needs it, it is only called from
flash_write() which has already checked to see if it can use the high
level interface and also done:
    
    if (!ct->cmd_wr)
        return FLASH_ERR_CTRL_CMD_UNSUPPORTED;

before it calls fl_wpage().

> You might also want to change flash_configure: it currently checks
> ct->cmd_wr before calling flash_set_4b, which would be redundant with
> this patch.

Actually better yet, I can remove both the checks and add one to the
start of flash_set_4b() which should cover everything.

Just to explain a bit, I want this patch to be as least invasive as
possible because my backend isn't flash at all (a rewrite of
libflash/libffs is underway to address this problem) and its possible
that there are reasons why these codepathes exist, and 'normal' backends
might want them, I don't want to start simply returning (success or
failure) if the low levels don't exist, it could start masking bigger
issues. I just need libflash to not segfault when it's used with the
file backend :). In a perfect world once there is a better way of using
libffs with files this patch should probably be reverted and the problem
re-examined.

I'll resend updated version.

Thanks for review,

Cyril

> Regards,
> Daniel
> 
> > ---
> >  libflash/libflash.c | 10 +++++++++-
> >  1 file changed, 9 insertions(+), 1 deletion(-)
> > 
> > diff --git a/libflash/libflash.c b/libflash/libflash.c
> > index a229668..ce6a899 100644
> > --- a/libflash/libflash.c
> > +++ b/libflash/libflash.c
> > @@ -91,6 +91,10 @@ int fl_wren(struct spi_flash_ctrl *ct)
> >  	int i, rc;
> >  	uint8_t stat;
> >  
> > +	/* If lower level interface not implmented, just return */
> > +	if (!ct->cmd_wr)
> > +		return 0;
> > +
> >  	/* Some flashes need it to be hammered */
> >  	for (i = 0; i < 1000; i++) {
> >  		rc = ct->cmd_wr(ct, CMD_WREN, false, 0, NULL, 0);
> > @@ -674,6 +678,11 @@ static int flash_set_4b(struct flash_chip *c, bool enable)
> >  		/* Ignore the error & move on (could be wrprotect chip) */
> >  	}
> >  
> > +	/* Don't have low level interface, assume all is well */
> > +	if (!ct->cmd_wr)
> > +		return 0;
> > +
> > +
> >  	/* Ignore error in case chip is write protected */
> >  
> >  	return ct->cmd_wr(ct, enable ? CMD_EN4B : CMD_EX4B, false, 0, NULL, 0);
> > @@ -757,7 +766,6 @@ static int flash_configure(struct flash_chip *c)
> >  				return rc;
> >  			}
> >  		}
> > -
> >  		/* Set controller to 3b mode if mode switch is supported */
> >  		if (ct->set_4b) {
> >  			FL_DBG("LIBFLASH: Disabling controller 4B mode...\n");
> 




More information about the Skiboot mailing list