summaryrefslogtreecommitdiffstats
path: root/src/console/printk.c
diff options
context:
space:
mode:
authorJulius Werner <jwerner@chromium.org>2022-02-03 17:25:44 -0800
committerJulius Werner <jwerner@chromium.org>2022-02-07 23:28:46 +0000
commit266041f0e62296737617cc2fcfa97f31e2b43aea (patch)
tree77dbb232193c6c4db5c4233ae33a93126cab9e10 /src/console/printk.c
parent984d03c492506af0fea22c7c8c94a6a87e1f5342 (diff)
downloadcoreboot-266041f0e62296737617cc2fcfa97f31e2b43aea.tar.gz
coreboot-266041f0e62296737617cc2fcfa97f31e2b43aea.tar.bz2
coreboot-266041f0e62296737617cc2fcfa97f31e2b43aea.zip
console: Add compile-time fast path when only CBMEM console is used
A common use case when running coreboot on production systems is that only the CBMEM console (the one with the least impact on boot speed) is enabled. In this case, some of the code in the console subsystem has no effect. Due to the way it's all genericized over multiple consoles and tied together with function pointers, not all of this can be compile-time eliminated automatically, so this patch adds a little helper to facilitate that. This results in roughly 200 (compressed) bytes of savings per stage on an arm64 system. Signed-off-by: Julius Werner <jwerner@chromium.org> Change-Id: I1d5b8bda80d02a13ee0b7835e0805c4319fd21d8 Reviewed-on: https://review.coreboot.org/c/coreboot/+/61613 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Raul Rangel <rrangel@chromium.org>
Diffstat (limited to 'src/console/printk.c')
-rw-r--r--src/console/printk.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/console/printk.c b/src/console/printk.c
index ffa3106178ec..8db2c45f138d 100644
--- a/src/console/printk.c
+++ b/src/console/printk.c
@@ -67,6 +67,8 @@ union log_state {
};
};
+#define LOG_FAST(state) (HAS_ONLY_FAST_CONSOLES || ((state).level == CONSOLE_LOG_FAST))
+
static void wrap_interactive_printf(const char *fmt, ...)
{
va_list args;
@@ -83,7 +85,7 @@ static void line_start(union log_state state)
LOG_FAST mode, just write the marker to CBMC and exit -- the rest of this function
implements the LOG_ALL case. */
unsigned char marker = BIOS_LOG_LEVEL_TO_MARKER(state.level);
- if (state.speed == CONSOLE_LOG_FAST) {
+ if (LOG_FAST(state)) {
__cbmemc_tx_byte(marker);
return;
}
@@ -98,7 +100,7 @@ static void line_start(union log_state state)
static void line_end(union log_state state)
{
- if (CONFIG(CONSOLE_USE_ANSI_ESCAPES) && state.speed != CONSOLE_LOG_FAST)
+ if (CONFIG(CONSOLE_USE_ANSI_ESCAPES) && !LOG_FAST(state))
wrap_interactive_printf(BIOS_LOG_ESCAPE_RESET);
}
@@ -115,7 +117,7 @@ static void wrap_putchar(unsigned char byte, void *data)
line_started = true;
}
- if (state.speed == CONSOLE_LOG_FAST)
+ if (LOG_FAST(state))
__cbmemc_tx_byte(byte);
else
console_tx_byte(byte);
@@ -138,7 +140,7 @@ int vprintk(int msg_level, const char *fmt, va_list args)
console_time_run();
i = vtxprintf(wrap_putchar, fmt, args, state.as_ptr);
- if (state.speed != CONSOLE_LOG_FAST)
+ if (LOG_FAST(state))
console_tx_flush();
console_time_stop();