[PATCH 5/5] serial: Rework CONFIG_SYS_BAUDRATE_TABLE

Pali Rohár pali at kernel.org
Sat Sep 25 14:22:36 CEST 2021


On Friday 24 September 2021 18:07:36 Tom Rini wrote:
> On Fri, Sep 24, 2021 at 09:08:15PM +0200, Pali Rohár wrote:
> > Hello!
> > 
> > On Monday 13 September 2021 18:11:38 Tom Rini wrote:
> > > On Mon, Sep 13, 2021 at 05:03:13PM -0500, Alex G. wrote:
> > > > 
> > > > 
> > > > On 9/13/21 4:24 PM, Tom Rini wrote:
> > > > > In order to move CONFIG_SYS_BAUDRATE_TABLE to Kconfig, we need to rework
> > > > > the logic a bit.  Rename the users of CONFIG_SYS_BAUDRATE_TABLE to
> > > > > SYS_BAUDRATE_TABLE.  Introduce a series of CONFIG_BAUDRATE_TABLE_...
> > > > > that include some number of baud rates.  These match all existing users.
> > > > > The help for each entry specifies what the exact table is, for a given
> > > > > option.  Define what SYS_BAUDRATE_TABLE will be in include/serial.h now.
> > > > > 
> > > > > Signed-off-by: Tom Rini <trini at konsulko.com>
> > > > > ---
> > > > 
> > > > > diff --git a/include/serial.h b/include/serial.h
> > > > > index 6d1e62c6770c..150644c4c3d4 100644
> > > > > --- a/include/serial.h
> > > > > +++ b/include/serial.h
> > > > > @@ -3,6 +3,42 @@
> > > > >   #include <post.h>
> > > > > +#if defined(CONFIG_BAUDRATE_TABLE_300_TO_38400_115200)
> > > > > +#define SYS_BAUDRATE_TABLE	{ 300, 600, 1200, 2400, 4800, 9600, 19200, \
> > > > > +				  38400, 115200 }
> > > > > +#elif defined(CONFIG_BAUDRATE_TABLE_300_TO_115200)
> > > > > +#define SYS_BAUDRATE_TABLE	{ 300, 600, 1200, 2400, 4800, 9600, 19200, \
> > > > > +				  38400, 57600, 115200 }
> > > > > +#elif defined(CONFIG_BAUDRATE_TABLE_300_TO_230400)
> > > > > +#define SYS_BAUDRATE_TABLE	{ 300, 600, 1200, 2400, 4800, 9600, 19200, \
> > > > > +				  38400, 57600, 115200, 230400 }
> > > > > +#elif defined(CONFIG_BAUDRATE_TABLE_300_TO_6000000)
> > > > > +#define SYS_BAUDRATE_TABLE	{ 300, 600, 1200, 1800, 2400, 4800, 9600, \
> > > > > +				  19200, 38400, 57600, 115200, 230400, \
> > > > > +				  460800, 500000, 576000, 921600, 1000000, \
> > > > > +				  1152000, 1500000, 2000000, 2500000, \
> > > > > +				  3000000, 3500000, 4000000, 4500000, \
> > > > > +				  5000000, 5500000, 6000000 }
> > > > > +#elif defined(CONFIG_BAUDRATE_TABLE_4800_TO_115200)
> > > > > +#define SYS_BAUDRATE_TABLE	{ 4800, 9600, 19200, 38400, 57600, 115200 }
> > > > > +#elif defined(CONFIG_BAUDRATE_TABLE_9600_TO_115200)
> > > > > +#define SYS_BAUDRATE_TABLE	{ 9600, 19200, 38400, 57600, 115200 }
> > > > > +#elif defined(CONFIG_BAUDRATE_TABLE_9600_TO_230400)
> > > > > +#define SYS_BAUDRATE_TABLE	{ 9600, 19200, 38400, 57600, 115200, 230400 }
> > > > > +#elif defined(CONFIG_BAUDRATE_TABLE_9600_TO_460800)
> > > > > +#define SYS_BAUDRATE_TABLE	{ 9600, 19200, 38400, 57600, 115200, 230400, 460800 }
> > > > > +#elif defined(CONFIG_BAUDRATE_TABLE_9600_TO_921600)
> > > > > +#define SYS_BAUDRATE_TABLE	{ 9600, 19200, 38400, 57600, 115200, 230400, \
> > > > > +				  460800, 921600 }
> > > > > +#elif defined(CONFIG_BAUDRATE_TABLE_9600_TO_230400_500000_1500000)
> > > > > +#define SYS_BAUDRATE_TABLE	{ 9600, 19200, 38400, 57600, 115200, 230400, \
> > > > > +				  500000, 1500000 }
> > > > > +#elif defined(CONFIG_BAUDRATE_TABLE_38400_115200_ONLY)
> > > > > +#define SYS_BAUDRATE_TABLE	{ 38400, 115200 }
> > > > > +#elif defined(CONFIG_BAUDRATE_TABLE_115200_ONLY)
> > > > > +#define SYS_BAUDRATE_TABLE	{ 115200 }
> > > > > +#endif
> > > > > +
> > > > >   struct serial_device {
> > > > >   	/* enough bytes to match alignment of following func pointer */
> > > > >   	char	name[16];
> > > > 
> > > > 
> > > > This opens the gates to #ifdefing the heck out of serial.h. What happens to
> > > > my board that goes from 300 to 2000000?
> > > >  * We need a new Kconfig and new ifdef
> > > > What happens to my other board that goes from 300 to 2500000?
> > > >  * We need a new Kconfig and new ifdef
> > > > The pattern doesn't look promising.
> > > 
> > > This reminds me I was tempted to do a cover letter, but didn't.  What
> > > happens is I tell you no.  Most boards are using the standard table of
> > > common rates from 9600 to 115200.  A nice follow-up would be to change
> > > every board with a special case that's not above 115200 to just use the
> > > normal table.  Everyone else?  There's the maximal table.  That's it.
> > > That's even come in fairly recently, for mvebu platforms.
> > 
> > I think that above #ifdef hell is the worst what could be done. It does
> > not solve existing problems and just introduce new way which opens doors
> > for problems for new boards...
> 
> I don't think this will open new problems, since I do intend to fire off
> the "easy" reduction option of switching to either standard (current
> default) or maximal tables, rather than N tables.
> 
> > What should be done is to completely kill this CONFIG_SYS_BAUDRATE_TABLE
> > option and not to convert it to another set of options.
> > 
> > Why to kill it?
> > 
> > 1) Probably none of CONFIG_SYS_BAUDRATE_TABLE in include board files is
> >    correctly defined. Some of them contains only just few baudrates
> >    copied from other header files without checking that it is correct
> >    or contains some "radom" definition where is also 9600 and 115200 (as
> >    probably only these values are tested).
> > 
> > 2) Available baudrate values are not specific to board, but rather to
> >    UART chip used on the board. So only UART driver knowns what are
> >    supported values.
> > 
> > 3) Some boards may have integrated USB<-->UART chip which is "glued"
> >    directly to the board UART chip. So baudrates possible to set is
> >    limited to what together USB<-->UART chip and SoC UART supports.
> > 
> > 
> > I think the proper way is to do:
> > 
> > 1) Extend serial UART DM API with a callback which takes baudrate
> >    argument and returns the nearest baudrate value which hardware can
> >    set. Then serial UART drivers should implement it. This
> >    implementation is simple, because most UART drivers already do it.
> >    They take baudrate and calculates the best UART clock divisor and set
> >    it. And from this calculated divisor can be reconstructed the real
> >    baudrate value.
> > 
> > 2) Introduce some board specific function which can limit / filter
> >    particular baudrate (used in scenario when board has directly USB
> >    port with integrated USB<-->UART).
> > 
> > 2) Currently CONFIG_SYS_BAUDRATE_TABLE is used for checking if baudrate
> >    value is supported prior setting it. So replace this table by a new
> >    callback from step 1) and 2) and allow baudrate if is e.g. in 2-3%
> >    tolerance.
> > 
> > 3) Add some platform / SoC option to allow specifying upper or lower
> >    limit for baudrate. Not as Kconfig option, this is mean as platform
> >    limitation exposed by e.g. used clock source. Some platforms have
> >    limitation that for specific clock must have some minimal clock UART
> >    divisor.
> > 
> > 4) Add some optional Kconfig option to limit upper and lower UART
> >    baudrate.
> 
> The problem I have is none of this is new, and predates Kconfig being
> introduced.  Now, if you're saying you'll fire off a patch series to do
> the above, in the next few months even, OK, yes, I can set aside this
> particular series for now.

Done: http://patchwork.ozlabs.org/project/uboot/patch/20210925121958.26001-1-pali@kernel.org/

Just as RFC and example how it could look like. If you like it we can
continue discussion in thread for above patch.

> But setting aside some of the ugly defines
> until we can convert them to something cleaner is why we're at this
> stagnant point in the conversion.
> 
> -- 
> Tom




More information about the U-Boot mailing list