]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
x86: Update cbmem driver
authorSimon Glass <sjg@chromium.org>
Sun, 10 Sep 2023 19:13:02 +0000 (13:13 -0600)
committerBin Meng <bmeng@tinylab.org>
Thu, 21 Sep 2023 22:03:46 +0000 (06:03 +0800)
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>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
[Modified the comment about overflow a little bit]
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
drivers/misc/Kconfig
drivers/misc/cbmem_console.c

index a6e3f62ecb094d17e09c1f51f71e727bbca8cbd5..c930e4a361bfc67b5e0fcce0879e261075d2dde0 100644 (file)
@@ -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
index 8bbe33d414da9795f5a7c3c7bc8cdeaea219daf0..ba3a599c4a51714ce58b04dd9af2347f1b1d6640 100644 (file)
@@ -5,27 +5,37 @@
 
 #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;
+       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;
+
+       /* preserve the overflow flag if present */
+       flags = cons->cursor & ~CBMC_CURSOR_MASK;
+
+       cons->body[pos++] = data;
+
+       /*
+        * Deal with overflow - the flag may be cleared by another program which
+        * reads the buffer out later, e.g. Linux
+        */
+       if (pos >= cons->size) {
+               pos = 0;
+               flags |= CBMC_OVERFLOW;
+       }
 
-       cursor = cbmem_console_p->buffer_cursor++;
-       if (cursor < cbmem_console_p->buffer_size)
-               cbmem_console_p->buffer_body[cursor] = data;
+       cons->cursor = flags | pos;
 }
 
 void cbmemc_puts(struct stdio_dev *dev, const char *str)
@@ -40,7 +50,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));