Hi Simon,
On Thu, Aug 17, 2023 at 9:58 AM Simon Glass sjg@chromium.org wrote:
This driver is not actually built since a Kconfig was never created for it.
Add a Kconfig (which is already implied by COREBOOT) and update the implementation to avoid using unnecessary memory. Drop the #ifdef at the top since we can rely on Kconfig to get that right.
To enable it (in addition to serial and video), use:
setenv stdout serial,vidconsole,cbmem
Signed-off-by: Simon Glass sjg@chromium.org
(no changes since v2)
Changes in v2:
- Update to support the new overflow mechanism
drivers/misc/Kconfig | 8 ++++++++ drivers/misc/cbmem_console.c | 38 +++++++++++++++++++----------------- 2 files changed, 28 insertions(+), 18 deletions(-)
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index a6e3f62ecb09..c930e4a361bf 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -122,6 +122,14 @@ config VEXPRESS_CONFIG configuration bus on the Arm Versatile Express boards via a sysreg driver.
+config CBMEM_CONSOLE
bool "Write console output to coreboot cbmem"
depends on X86
help
Enables console output to the cbmem console, which is a memory
region set up by coreboot to hold a record of all console output.
Enable this only if booting from coreboot.
config CMD_CROS_EC bool "Enable crosec command" depends on CROS_EC diff --git a/drivers/misc/cbmem_console.c b/drivers/misc/cbmem_console.c index 8bbe33d414da..7a47a814f638 100644 --- a/drivers/misc/cbmem_console.c +++ b/drivers/misc/cbmem_console.c @@ -5,27 +5,30 @@
#include <common.h> #include <console.h> -#ifndef CONFIG_SYS_COREBOOT -#error This driver requires coreboot -#endif
#include <asm/cb_sysinfo.h>
-struct cbmem_console {
u32 buffer_size;
u32 buffer_cursor;
u8 buffer_body[0];
-} __attribute__ ((__packed__));
-static struct cbmem_console *cbmem_console_p;
void cbmemc_putc(struct stdio_dev *dev, char data) {
int cursor;
cursor = cbmem_console_p->buffer_cursor++;
if (cursor < cbmem_console_p->buffer_size)
cbmem_console_p->buffer_body[cursor] = data;
const struct sysinfo_t *sysinfo = cb_get_sysinfo();
struct cbmem_console *cons;
uint pos, flags;
if (!sysinfo)
return;
cons = sysinfo->cbmem_cons;
if (!cons)
return;
pos = cons->cursor & CBMC_CURSOR_MASK;
flags = cons->cursor & ~CBMC_CURSOR_MASK;
This line does not seem useful to me, as we don't use the extracted flag from the higher bits of cons->cursor.
I guess we can just drop it.
cons->body[pos++] = data;
if (pos >= cons->size) {
pos = 0;
flags |= CBMC_OVERFLOW;
Who is supposed to clear the overflow flag?
}
cons->cursor = flags | pos;
}
void cbmemc_puts(struct stdio_dev *dev, const char *str) @@ -40,7 +43,6 @@ int cbmemc_init(void) { int rc; struct stdio_dev cons_dev;
cbmem_console_p = lib_sysinfo.cbmem_cons; memset(&cons_dev, 0, sizeof(cons_dev));
--
Regards, Bin