266041f0e6
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>
101 lines
2 KiB
C
101 lines
2 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
#include <console/cbmem_console.h>
|
|
#include <console/ne2k.h>
|
|
#include <console/qemu_debugcon.h>
|
|
#include <console/spkmodem.h>
|
|
#include <console/streams.h>
|
|
#include <console/uart.h>
|
|
#include <console/usb.h>
|
|
#include <console/spi.h>
|
|
#include <console/flash.h>
|
|
#include <console/system76_ec.h>
|
|
|
|
/* Note: when adding a new console, make sure you update the definition of
|
|
HAS_ONLY_FAST_CONSOLES in <console.h>! */
|
|
void console_hw_init(void)
|
|
{
|
|
__cbmemc_init();
|
|
__spkmodem_init();
|
|
__qemu_debugcon_init();
|
|
|
|
__uart_init();
|
|
__ne2k_init();
|
|
__usbdebug_init();
|
|
__spiconsole_init();
|
|
__flashconsole_init();
|
|
__system76_ec_init();
|
|
}
|
|
|
|
void console_interactive_tx_byte(unsigned char byte, void *data_unused)
|
|
{
|
|
if (byte == '\n') {
|
|
/* Some consoles want newline conversion to keep terminals happy. */
|
|
__uart_tx_byte('\r');
|
|
__usb_tx_byte('\r');
|
|
}
|
|
|
|
__spkmodem_tx_byte(byte);
|
|
__qemu_debugcon_tx_byte(byte);
|
|
__uart_tx_byte(byte);
|
|
__ne2k_tx_byte(byte);
|
|
__usb_tx_byte(byte);
|
|
__spiconsole_tx_byte(byte);
|
|
__system76_ec_tx_byte(byte);
|
|
}
|
|
|
|
void console_stored_tx_byte(unsigned char byte, void *data_unused)
|
|
{
|
|
__flashconsole_tx_byte(byte);
|
|
__cbmemc_tx_byte(byte);
|
|
}
|
|
|
|
void console_tx_byte(unsigned char byte)
|
|
{
|
|
console_interactive_tx_byte(byte, NULL);
|
|
console_stored_tx_byte(byte, NULL);
|
|
}
|
|
|
|
void console_tx_flush(void)
|
|
{
|
|
__uart_tx_flush();
|
|
__ne2k_tx_flush();
|
|
__usb_tx_flush();
|
|
__flashconsole_tx_flush();
|
|
__system76_ec_tx_flush();
|
|
}
|
|
|
|
void console_write_line(uint8_t *buffer, size_t number_of_bytes)
|
|
{
|
|
/* Finish displaying all of the console data if requested */
|
|
if (number_of_bytes == 0) {
|
|
console_tx_flush();
|
|
return;
|
|
}
|
|
|
|
/* Output the console data */
|
|
while (number_of_bytes--)
|
|
console_tx_byte(*buffer++);
|
|
}
|
|
|
|
#if CONFIG(GDB_STUB) && (ENV_ROMSTAGE || ENV_RAMSTAGE)
|
|
void gdb_hw_init(void)
|
|
{
|
|
__gdb_hw_init();
|
|
}
|
|
|
|
void gdb_tx_byte(unsigned char byte)
|
|
{
|
|
__gdb_tx_byte(byte);
|
|
}
|
|
|
|
void gdb_tx_flush(void)
|
|
{
|
|
__gdb_tx_flush();
|
|
}
|
|
|
|
unsigned char gdb_rx_byte(void)
|
|
{
|
|
return __gdb_rx_byte();
|
|
}
|
|
#endif
|