Youness Alaoui has uploaded a new change for review. ( https://review.coreboot.org/19865 )
Change subject: console/flashconsole: Add support for tx_flush ......................................................................
console/flashconsole: Add support for tx_flush
Support flushing the flash console so non \n terminated lines can be printed to flash. Also use it internally when the line buffering is done.
Change-Id: I6516ecefddf676bdac6fb97536a08a5c5ecc0d4d Signed-off-by: Youness Alaoui youness.alaoui@puri.sm --- M src/console/console.c M src/drivers/spi/flashconsole.c M src/include/console/flash.h 3 files changed, 46 insertions(+), 15 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/65/19865/1
diff --git a/src/console/console.c b/src/console/console.c index 2b7f99d..877c8dc 100644 --- a/src/console/console.c +++ b/src/console/console.c @@ -63,6 +63,7 @@ __uart_tx_flush(); __ne2k_tx_flush(); __usb_tx_flush(); + __flashconsole_tx_flush(); }
void console_write_line(uint8_t *buffer, size_t number_of_bytes) diff --git a/src/drivers/spi/flashconsole.c b/src/drivers/spi/flashconsole.c index 29680a2..b9b8877 100644 --- a/src/drivers/spi/flashconsole.c +++ b/src/drivers/spi/flashconsole.c @@ -98,7 +98,30 @@ memset(line_buffer, 0, LINE_BUFFER_SIZE); // Set g_rdev last so tx_byte doesn't get executed early car_set_var(g_rdev, rdev); +}
+static const struct region_device *_tx_flush(const struct region_device *rdev) +{ + uint8_t *line_buffer = car_get_var_ptr(g_line_buffer); + uint32_t offset = car_get_var(g_offset); + uint32_t region_offset = car_get_var(g_region_offset); + uint32_t region_size = car_get_var(g_region_size); + uint32_t len = car_get_var(g_line_offset); + + // We crop the rest of the line if the region is full + if (offset + len >= region_size) + len = region_size - offset; + + rdev_writeat(rdev, line_buffer, region_offset + offset, len); + + // If the region is full, stop future write attempts + if (offset + len >= region_size) + rdev = NULL; + + car_set_var(g_offset, offset + len); + car_set_var(g_line_offset, 0); + + return rdev; }
void flashconsole_tx_byte(unsigned char c) @@ -123,22 +146,23 @@
if (len >= LINE_BUFFER_SIZE - 1 || offset + len >= region_size || c == '\n') { - uint32_t region_offset = car_get_var(g_region_offset); - - // We crop the rest of the line if the region is full - if (offset + len >= region_size) - len = region_size - offset; - - rdev_writeat(rdev, line_buffer, region_offset + offset, - len); - - // If the region is full, stop future write attempts - if (offset + len >= region_size) - rdev = NULL; - - car_set_var(g_offset, offset + len); - car_set_var(g_line_offset, 0); + rdev = _tx_flush(rdev); } car_set_var(g_rdev, rdev); } + +} + +void flashconsole_tx_flush(void) +{ + const struct region_device *rdev = car_get_var(g_rdev); + + if (rdev) { + /* Prevent any recursive loops in case the spi flash driver + * calls printk (in case of transaction timeout or + * any other error while writing) */ + car_set_var(g_rdev, NULL); + rdev = _tx_flush(rdev); + car_set_var(g_rdev, rdev); + } } diff --git a/src/include/console/flash.h b/src/include/console/flash.h index fa4de00..7bf0c93 100644 --- a/src/include/console/flash.h +++ b/src/include/console/flash.h @@ -21,6 +21,7 @@
void flashconsole_init(void); void flashconsole_tx_byte(unsigned char c); +void flashconsole_tx_flush(void);
#define __CONSOLE_FLASH_ENABLE__ IS_ENABLED(CONFIG_CONSOLE_SPI_FLASH)
@@ -30,9 +31,14 @@ { flashconsole_tx_byte(data); } +static inline void __flashconsole_tx_flush(void) +{ + flashconsole_tx_flush(); +} #else static inline void __flashconsole_init(void) {} static inline void __flashconsole_tx_byte(u8 data) {} +static inline void __flashconsole_tx_flush(void) {} #endif /* __CONSOLE_FLASH_ENABLE__ */