[PATCH v2 0/6] console: Implement flush() function

Pali Rohár
2022-08-11T12:40:29Z

On certain places it is required to flush output print buffers to ensure
that text strings were sent to console or serial devices. For example when
printing message that U-Boot is going to boot kernel or when U-Boot is
going to change baudrate of terminal device.

Some console devices, like UART, have putc/puts functions which just put
characters into HW transmit queue and do not wait until all data are
transmitted. Doing some sensitive operations (like changing baudrate or
starting kernel which resets UART HW) cause that U-Boot messages are lost.

Therefore introduce a new flush() function, implement it for all serial
devices via pending(false) callback and use this new flush() function on
sensitive places after which output device may go into reset state.

This change fixes printing of U-Boot messages:
"## Starting application at ..."
"## Switch baudrate to ..."

Changes in v2:
* split one big patch into smaller 6 patches
* add config option to allow disabling this new function

Pali Rohár (6):
sandbox: Add function os_flush()
console: Implement flush() function
serial: Implement flush callback
serial: Implement serial_flush() function for console flush() fallback
serial: Call flush() before changing baudrate
boot: Call flush() before booting

arch/sandbox/cpu/os.c | 5 +++
boot/bootm_os.c | 1 +
cmd/boot.c | 1 +
cmd/elf.c | 2 ++
cmd/load.c | 5 +++
common/Kconfig | 6 ++++
common/console.c | 66 ++++++++++++++++++++++++++++++++++
common/stdio.c | 10 ++++++
drivers/serial/serial-uclass.c | 33 +++++++++++++++++
drivers/serial/serial.c | 1 +
include/_exports.h | 3 ++
include/os.h | 8 +++++
include/serial.h | 5 +++
include/stdio.h | 15 ++++++++
include/stdio_dev.h | 4 +++
15 files changed, 165 insertions(+)

--
2.20.1