[U-Boot] [PATCH v3 03/29] Convert CONSOLE_PRE_CONSOLE_BUFFER options to Kconfig
Simon Glass
sjg at chromium.org
Sat Oct 1 20:46:05 CEST 2016
Hi Siarhei,
On 30 September 2016 at 00:00, Siarhei Siamashka
<siarhei.siamashka at gmail.com> wrote:
>
> Hello Simon,
>
> On Thu, 29 Sep 2016 14:23:02 -0600
> Simon Glass <sjg at chromium.org> wrote:
>
> > Move these option to Kconfig and tidy up existing uses.
> >
> > Signed-off-by: Simon Glass <sjg at chromium.org>
> > ---
> >
> > Changes in v3: None
> > Changes in v2:
> > - Change CONFIG_PRE_CON_BUF_SZ default to 4096
> > - Change CONFIG_PRE_CON_BUF_SZ to 'int' type
> > - Drop the depend clause on the CONFIG_PRE_CON_BUF_SZ default
> > - Move CONFIG_PRE_CON_BUF_ADDR default to common/Kconfig
>
> What is the point moving these defines to Kconfig? They are neither
> user configurable, nor board specific. The location of the buffer is
> defined per platform or per SoC type and is a part of the global memory
> map. Similar to such things as the malloc heap and the stack.
>
> Allowing the users to redefine the buffer location is a dangerous thing
> because everything may go out of control very easily (it may overlap
> with some other memory buffer). IMHO it only makes sense to have a
> single user configurable boolean flag in Kconfig (the one which
> enables/disables the pre-console functionality).
>
> Regarding the buffer size. It was originally picked rather arbitrarily
> as 1MB at least for the sunxi platform:
>
> https://patchwork.ozlabs.org/patch/426526/
>
> Just because making it several orders of magnitude larger than
> necessary makes it extremely unlikely that anyone ever gets into
> a buffer wraparound situation. Picking smallish sizes does not gain
> us anything, but just adds an extra hassle because now one needs to
> make some estimations whether the size is large enough or not.
> Especially considering that this functionality may be sometimes
> used for debugging prints when troubleshooting something. And one
> can't easily predict how much debugging output would be actually
> necessary.
All CONFIGs need to move to Kconfig or be deleted.
I also don't like the idea of specifying an address for a pre-console
buffer. As mentioned I think it is better to allocate it
automatically. But that is a separate issue from the Kconfig
conversion. if we re-litigate every CONFIG that we move, it will never
happen.
>
> > README | 17 ----------------
> > board/sunxi/Kconfig | 3 +++
> > common/Kconfig | 42 +++++++++++++++++++++++++++++++++++++++
> > common/console.c | 6 +++---
> > configs/tbs2910_defconfig | 2 ++
> > include/asm-generic/global_data.h | 2 +-
> > include/configs/sunxi-common.h | 6 ------
> > include/configs/tbs2910.h | 4 ----
> > scripts/config_whitelist.txt | 3 ---
> > 9 files changed, 51 insertions(+), 34 deletions(-)
> >
> > diff --git a/README b/README
> > index 0a1f3fe..8f93dad 100644
> > --- a/README
> > +++ b/README
> > @@ -872,23 +872,6 @@ The following options need to be configured:
> > must be defined, to setup the maximum idle timeout for
> > the SMC.
> >
> > -- Pre-Console Buffer:
> > - Prior to the console being initialised (i.e. serial UART
> > - initialised etc) all console output is silently discarded.
> > - Defining CONFIG_PRE_CONSOLE_BUFFER will cause U-Boot to
> > - buffer any console messages prior to the console being
> > - initialised to a buffer of size CONFIG_PRE_CON_BUF_SZ
> > - bytes located at CONFIG_PRE_CON_BUF_ADDR. The buffer is
> > - a circular buffer, so if more than CONFIG_PRE_CON_BUF_SZ
> > - bytes are output before the console is initialised, the
> > - earlier bytes are discarded.
> > -
> > - Note that when printing the buffer a copy is made on the
> > - stack so CONFIG_PRE_CON_BUF_SZ must fit on the stack.
> > -
> > - 'Sane' compilers will generate smaller code if
> > - CONFIG_PRE_CON_BUF_SZ is a power of 2
> > -
> > - Autoboot Command:
> > CONFIG_BOOTCOMMAND
> > Only needed when CONFIG_BOOTDELAY is enabled;
> > diff --git a/board/sunxi/Kconfig b/board/sunxi/Kconfig
> > index b139d1c..c0ffeb3 100644
> > --- a/board/sunxi/Kconfig
> > +++ b/board/sunxi/Kconfig
> > @@ -3,6 +3,9 @@ if ARCH_SUNXI
> > config IDENT_STRING
> > default " Allwinner Technology"
> >
> > +config PRE_CONSOLE_BUFFER
> > + default y
> > +
> > config SPL_GPIO_SUPPORT
> > default y
> >
> > diff --git a/common/Kconfig b/common/Kconfig
> > index bbd5633..6ee67ac 100644
> > --- a/common/Kconfig
> > +++ b/common/Kconfig
> > @@ -246,6 +246,48 @@ config SILENT_CONSOLE_UPDATE_ON_RELOC
> > (e.g. NAND). This option makes the value of the 'silent'
> > environment variable take effect at relocation.
> >
> > +config PRE_CONSOLE_BUFFER
> > + bool "Buffer characters before the console is available"
> > + help
> > + Prior to the console being initialised (i.e. serial UART
> > + initialised etc) all console output is silently discarded.
> > + Defining CONFIG_PRE_CONSOLE_BUFFER will cause U-Boot to
> > + buffer any console messages prior to the console being
> > + initialised to a buffer. The buffer is a circular buffer, so
> > + if it overflows, earlier output is discarded.
> > +
> > + Note that this is not currently supported in SPL. It would be
> > + useful to be able to share the pre-console buffer with SPL.
>
> We can't (easily) share this buffer with SPL. In the SPL case, this
> buffer needs to be placed somewhere in SRAM, because it is necessary
> to also have console messages even before DRAM is initialized.
> Essentially, we want to have two separate buffers. One small buffer
> somewhere in SRAM for SPL, and one very large buffer somewhere in
> DRAM for U-Boot proper. The data from the small buffer gets combined
> with the data from the large buffer at some point. The actual
> implementation is very straightforward and simple. And in fact it
> has been already available since a long time ago:
>
> http://lists.denx.de/pipermail/u-boot/2015-January/201127.html
> http://lists.denx.de/pipermail/u-boot/2015-January/201128.html
> http://lists.denx.de/pipermail/u-boot/2015-January/201129.html
>
> Again, assigning the exact location of these buffers is a very platform
> specific information and is a part of the memory map. The user has no
> business overriding this via Kconfig.
>
> BTW, would you want me to rebase these old patches on the current
> U-Boot git master branch?
Yes please. I'd like to see this setup moved to board_init.c, with
just a size CONFIG options, not an address.
>
> > +
> > +config PRE_CON_BUF_SZ
> > + int "Sets the size of the pre-console buffer"
> > + depends on PRE_CONSOLE_BUFFER
> > + default 4096
> > + help
> > + The size of the pre-console buffer affects how much console output
> > + can be held before it overflows and starts discarding earlier
> > + output. Normally there is very little output at this early stage,
> > + unless debugging is enabled, so allow enough for ~10 lines of
> > + text.
> > +
> > + This is a useful feature if you are using a video console and
> > + want to see the full boot output on the console. Without this
> > + option only the post-relocation output will be displayed.
> > +
> > +config PRE_CON_BUF_ADDR
> > + hex "Address of the pre-console buffer"
> > + depends on PRE_CONSOLE_BUFFER
> > + default 0x2f000000 if ARCH_SUNXI && MACH_SUN9I
> > + default 0x4f000000 if ARCH_SUNXI && !MACH_SUN9I
> > + help
> > + This sets the start address of the pre-console buffer. This must
> > + be in available memory and is accessed before relocation and
> > + possibly before DRAM is set up. Therefore choose an address
> > + carefully.
> > +
> > + We should consider removing this option and allocating the memory
> > + in board_init_f_init_reserve() instead.
>
> And what is the profit? The implementation becomes more complex, more
> fragile and defeats the whole purpose. We want to be able to print
> and accumulate debugging messages immediately, and not only after
> certain things are initialized relatively late in the boot process.
> That's exactly the reason why this pre-console buffer functionality
> exists in the first place.
We cannot print anything until we have global_data set up. This
happens in board_init_f_init_reserve() so there is no point in having
a console before then.
We should allocate all the init memory in one place, in C code.
This is very early in the boot process. Please take a look.
[...]
Regards,
Simon
More information about the U-Boot
mailing list