mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
x86: Update cbmem driver
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>
This commit is contained in:
parent
7739b2793b
commit
fb5cfbe17d
2 changed files with 34 additions and 17 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
cursor = cbmem_console_p->buffer_cursor++;
|
||||
if (cursor < cbmem_console_p->buffer_size)
|
||||
cbmem_console_p->buffer_body[cursor] = data;
|
||||
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;
|
||||
}
|
||||
|
||||
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));
|
||||
|
||||
|
|
Loading…
Reference in a new issue