[U-Boot] [PATCH] dm: serial: Add .pre_probe() function to to wait for previous transmission end

Lukasz Majewski lukma at denx.de
Sat Nov 4 21:42:15 UTC 2017


Dear All,

> Hi Philipp,
> 
> > Hi Lukasz,
> >   
> > > On 27 Oct 2017, at 00:51, Lukasz Majewski <lukma at denx.de> wrote:  
> > >>   
> > >>> On 27 Oct 2017, at 00:13, Lukasz Majewski <lukma at denx.de> wrote:
> > >>> 
> > >>> It may happen that the serial IP block is performing some
> > >>> ongoing transmission (started at e.g. board_init()) when the
> > >>> serial "probe" is called.
> > >>> 
> > >>> As a result the serial port IP block is reset, so transmitted
> > >>> data is corrupted:
> > >>> 
> > >>>   I2C:   ready
> > >>>   DRAM:  1 GiB
> > >>>   jSS('HH��SL_SDHC: 04 rev 0x0
> > >>> 
> > >>> This patch prevents from this situation, by defining pre_probe()
> > >>> callback in which we wait till the TX buffer is empty (from
> > >>> previous transmission):
> > >>> 
> > >>>   I2C:   ready
> > >>>   DRAM:  1 GiB
> > >>>   ID:    unit type 0x4 rev 0x0
> > >>> 
> > >>> All defined ->pending callbacks at ./drivers/serial are non
> > >>> blocking
> > >>> - just simple reading from registers and testing flags. Hence,
> > >>> it should be enough to not use any timeout from timer.
> > >>> One shall also note that we enable console very early - not all
> > >>> timers may be ready for work - adding timeout here would impose
> > >>> implicit dependency that timers are setup before serial.  
> > >> 
> > >> Given that this is effectively a busy polling loop, why can’t
> > >> this be done from the probe-function of serial drivers that
> > >> require this functionality?  
> > > 
> > > That would be one of the options. 
> > > 
> > > Originally, this code was placed at iMX specific function - namely
> > > _mxc_serial_init() [1]. 
> > > 
> > > However, Simon suggested to solve this problem globally via DM's
> > > serial-uclass, which offers pre_probe() callback for such purpose.
> > > 
> > > The problem here is the polling loop. I've checked and ->pending
> > > on real SoCs is just a read from the register - which should not
> > > block (a similar approach is used in Linux kernel).
> > > 
> > > Having timeout from timer would impose dependency on timer init'ed
> > > first - before serial.  
> > 
> > I worry a bit about the pending-callback being called prior to a
> > probe. As of today, the pending function can assume that probe() has
> > run and initialised the private structures accordingly—with this
> > change, that assumption is invalidated.  
> 
> Yes. I agree.
> 
> Other issue is that we may need timer based timeout for some SoCs. And
> this also implies to have timer initialized before the console.
> 
> > 
> > If we go down this path, then we need to clearly indicate that the
> > pending function can not rely on probe() to have initialised the
> > device state or private data structures.  If we keep this check
> > within the probe()-function, it should be obvious what is set up and
> > what isn’t.  
> 
> Those are valid arguments.
> 
> I would even go further and leave this patch as it was in the first
> version [1] - since:
> 
> - It is similar to what Linux does
> - for iMX it uses check on HW bit which is guarantee to be cleared in
>   some point of time (of course if HW is not broken).
> 
> However, lets wait for input from Simon - how he would like to tackle
> this issue.

Unfortunately, I did not received any feedback from Simon.

Hence, I would opt for discarding this particular patch and use the v1
of it (please find the rationale above):

https://patchwork.ozlabs.org/patch/820824/

Has anybody disagree?

> 
> >   
> > > 
> > > [1] - https://patchwork.ozlabs.org/patch/820824/
> > >   
> > >>   
> > >>> 
> > >>> 
> > >>> Signed-off-by: Lukasz Majewski <lukma at denx.de>
> > >>> ---
> > >>> 
> > >>> drivers/serial/serial-uclass.c | 20 ++++++++++++++++++++
> > >>> 1 file changed, 20 insertions(+)
> > >>> 
> > >>> diff --git a/drivers/serial/serial-uclass.c
> > >>> b/drivers/serial/serial-uclass.c index 2e5116f..5e6964d 100644
> > >>> --- a/drivers/serial/serial-uclass.c
> > >>> +++ b/drivers/serial/serial-uclass.c
> > >>> @@ -420,10 +420,30 @@ static int serial_pre_remove(struct
> > >>> udevice *dev) return 0;
> > >>> }
> > >>> 
> > >>> +static int serial_pre_probe(struct udevice *dev)
> > >>> +{
> > >>> +	struct dm_serial_ops *ops = serial_get_ops(dev);
> > >>> +	int ret = 0;
> > >>> +
> > >>> +	/*
> > >>> +	 * Wait for any ongoing transmission to finish - for
> > >>> example
> > >>> +	 * from pre-relocation enabled UART
> > >>> +	 */
> > >>> +	if (ops && ops->pending)
> > >>> +		do {
> > >>> +			ret = ops->pending(dev, false);
> > >>> +			if (ret < 0)
> > >>> +				break;
> > >>> +		} while (ret > 0);
> > >>> +
> > >>> +	return ret;
> > >>> +}
> > >>> +
> > >>> UCLASS_DRIVER(serial) = {
> > >>> 	.id		= UCLASS_SERIAL,
> > >>> 	.name		= "serial",
> > >>> 	.flags		= DM_UC_FLAG_SEQ_ALIAS,
> > >>> +	.pre_probe	= serial_pre_probe,
> > >>> 	.post_probe	= serial_post_probe,
> > >>> 	.pre_remove	= serial_pre_remove,
> > >>> 	.per_device_auto_alloc_size = sizeof(struct
> > >>> serial_dev_priv), -- 
> > >>> 2.1.4
> > >>>   
> > >>   
> > > 
> > > 
> > > 
> > > 
> > > Best regards,
> > > 
> > > Lukasz Majewski
> > > 
> > > --
> > > 
> > > 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  
> >   
> 
> 
> 
> Best regards,
> 
> Lukasz Majewski
> 
> --
> 
> 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



Best regards,

Lukasz Majewski

--

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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20171104/d0d2606d/attachment.sig>


More information about the U-Boot mailing list