[PATCH] x86: Update cbmem driver

Simon Glass sjg at chromium.org
Sun Aug 13 22:10:35 CEST 2023


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 at chromium.org>
---

 drivers/misc/Kconfig         |  8 ++++++++
 drivers/misc/cbmem_console.c | 26 +++++++++-----------------
 2 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index b9f5c7a37aed..3df57a5bfbd9 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..6ae1389a23e0 100644
--- a/drivers/misc/cbmem_console.c
+++ b/drivers/misc/cbmem_console.c
@@ -5,27 +5,20 @@
 
 #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 = sysinfo ? sysinfo->cbmem_cons : NULL;
+	int pos;
+
+	if (!cons)
+		return;
 
-	cursor = cbmem_console_p->buffer_cursor++;
-	if (cursor < cbmem_console_p->buffer_size)
-		cbmem_console_p->buffer_body[cursor] = data;
+	pos = cons->cursor++;
+	if (pos < cons->size)
+		cons->body[pos] = data;
 }
 
 void cbmemc_puts(struct stdio_dev *dev, const char *str)
@@ -40,7 +33,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));
 
-- 
2.41.0.640.ga95def55d0-goog



More information about the U-Boot mailing list