Skip to content

Commit

Permalink
lib/coreboot_table: Simplify API to set up lb_serial
Browse files Browse the repository at this point in the history
Instead of having callbacks into serial console code to set up the
coreboot table have the coreboot table code call IP specific code to get
serial information. This makes it easier to reuse the information as the
return value can be used in a different context (e.g. when filling in a
FDT).

This also removes boilerplate code to set up lb_console entries by
setting entry based on the type in struct lb_uart.

Change-Id: I6c08a88fb5fc035eb28d0becf19471c709c8043d
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/68768
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Hung-Te Lin <hungte@chromium.org>
  • Loading branch information
ArthurHeymans authored and felixheld committed Nov 4, 2022
1 parent 5c38b23 commit 9948c52
Show file tree
Hide file tree
Showing 19 changed files with 133 additions and 180 deletions.
18 changes: 8 additions & 10 deletions src/drivers/uart/pl011.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,13 @@ unsigned char uart_rx_byte(unsigned int idx)
return read8(&regs->dr);
}

void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{
struct lb_serial serial;
serial.type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial.baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE);
serial.baud = get_uart_baudrate();
serial.regwidth = 1;
serial.input_hertz = uart_platform_refclk();
lb_add_serial(&serial, data);

lb_add_console(LB_TAG_CONSOLE_SERIAL8250MEM, data);
serial->type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial->baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE);
serial->baud = get_uart_baudrate();
serial->regwidth = 1;
serial->input_hertz = uart_platform_refclk();

return CB_SUCCESS;
}
3 changes: 2 additions & 1 deletion src/drivers/uart/sifive.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@ unsigned int uart_input_clock_divider(void)
return 1;
}

void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{
return CB_ERR;
/* TODO */
}
18 changes: 8 additions & 10 deletions src/drivers/uart/uart8250io.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,15 +109,13 @@ void uart_tx_flush(unsigned int idx)
uart8250_tx_flush(uart_platform_base(idx));
}

void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{
struct lb_serial serial;
serial.type = LB_SERIAL_TYPE_IO_MAPPED;
serial.baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE);
serial.baud = get_uart_baudrate();
serial.regwidth = 1;
serial.input_hertz = uart_platform_refclk();
lb_add_serial(&serial, data);

lb_add_console(LB_TAG_CONSOLE_SERIAL8250, data);
serial->type = LB_SERIAL_TYPE_IO_MAPPED;
serial->baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE);
serial->baud = get_uart_baudrate();
serial->regwidth = 1;
serial->input_hertz = uart_platform_refclk();

return CB_SUCCESS;
}
22 changes: 10 additions & 12 deletions src/drivers/uart/uart8250mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,20 +133,18 @@ void uart_tx_flush(unsigned int idx)
uart8250_mem_tx_flush(base);
}

void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{
struct lb_serial serial;
serial.type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial.baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE);
if (!serial.baseaddr)
return;
serial.baud = get_uart_baudrate();
serial->type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial->baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE);
if (!serial->baseaddr)
return CB_ERR;
serial->baud = get_uart_baudrate();
if (CONFIG(DRIVERS_UART_8250MEM_32))
serial.regwidth = sizeof(uint32_t);
serial->regwidth = sizeof(uint32_t);
else
serial.regwidth = sizeof(uint8_t);
serial.input_hertz = uart_platform_refclk();
lb_add_serial(&serial, data);
serial->regwidth = sizeof(uint8_t);
serial->input_hertz = uart_platform_refclk();

lb_add_console(LB_TAG_CONSOLE_SERIAL8250MEM, data);
return CB_SUCCESS;
}
3 changes: 1 addition & 2 deletions src/include/boot/coreboot_tables.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ void fill_lb_gpios(struct lb_gpios *gpios);
void lb_add_gpios(struct lb_gpios *gpios, const struct lb_gpio *gpio_table,
size_t count);

void uart_fill_lb(void *data);
void lb_add_serial(struct lb_serial *serial, void *data);
enum cb_err fill_lb_serial(struct lb_serial *serial);
void lb_add_console(uint16_t consoletype, void *data);

enum cb_err lb_fill_pcie(struct lb_pcie *pcie);
Expand Down
29 changes: 16 additions & 13 deletions src/lib/coreboot_table.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,19 +96,22 @@ static struct lb_memory *lb_memory(struct lb_header *header)
return mem;
}

void lb_add_serial(struct lb_serial *new_serial, void *data)
static void lb_add_serial(struct lb_header *header)
{
struct lb_header *header = (struct lb_header *)data;
struct lb_serial *serial;

serial = (struct lb_serial *)lb_new_record(header);
serial->tag = LB_TAG_SERIAL;
serial->size = sizeof(*serial);
serial->type = new_serial->type;
serial->baseaddr = new_serial->baseaddr;
serial->baud = new_serial->baud;
serial->regwidth = new_serial->regwidth;
serial->input_hertz = new_serial->input_hertz;
struct lb_serial new_serial = { .tag = LB_TAG_SERIAL,
.size = sizeof(struct lb_serial),
};
if (fill_lb_serial(&new_serial) != CB_SUCCESS)
return;

struct lb_serial *serial = (struct lb_serial *)lb_new_record(header);
memcpy(serial, &new_serial, sizeof(*serial));
assert(serial->type == LB_SERIAL_TYPE_IO_MAPPED
|| serial->type == LB_SERIAL_TYPE_MEMORY_MAPPED)
if (serial->type == LB_SERIAL_TYPE_IO_MAPPED)
lb_add_console(LB_TAG_CONSOLE_SERIAL8250, header);
else
lb_add_console(LB_TAG_CONSOLE_SERIAL8250MEM, header);
}

void lb_add_console(uint16_t consoletype, void *data)
Expand Down Expand Up @@ -492,7 +495,7 @@ static uintptr_t write_coreboot_table(uintptr_t rom_table_end)

/* Record the serial ports and consoles */
if (CONFIG(CONSOLE_SERIAL))
uart_fill_lb(head);
lb_add_serial(head);

if (CONFIG(CONSOLE_USB))
lb_add_console(LB_TAG_CONSOLE_EHCI, head);
Expand Down
17 changes: 7 additions & 10 deletions src/mainboard/emulation/qemu-power8/uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,13 @@ void uart_tx_flush(unsigned int idx)
{
}

void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{
struct lb_serial serial;
serial->type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial->baseaddr = 0;
serial->baud = 115200;
serial->regwidth = 1;
serial->input_hertz = uart_platform_refclk();

serial.type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial.baseaddr = 0;
serial.baud = 115200;
serial.regwidth = 1;
serial.input_hertz = uart_platform_refclk();
lb_add_serial(&serial, data);

lb_add_console(LB_TAG_CONSOLE_SERIAL8250MEM, data);
return CB_SUCCESS;
}
18 changes: 8 additions & 10 deletions src/soc/mediatek/common/uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,15 +159,13 @@ void uart_tx_flush(unsigned int idx)
mtk_uart_tx_flush();
}

void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{
struct lb_serial serial;
serial.type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial.baseaddr = UART0_BASE;
serial.baud = get_uart_baudrate();
serial.regwidth = 4;
serial.input_hertz = UART_HZ;
lb_add_serial(&serial, data);

lb_add_console(LB_TAG_CONSOLE_SERIAL8250MEM, data);
serial->type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial->baseaddr = UART0_BASE;
serial->baud = get_uart_baudrate();
serial->regwidth = 4;
serial->input_hertz = UART_HZ;

return CB_SUCCESS;
}
18 changes: 8 additions & 10 deletions src/soc/nvidia/tegra124/uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,15 +114,13 @@ void uart_tx_flush(unsigned int idx)
tegra124_uart_tx_flush(uart_ptr);
}

void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{
struct lb_serial serial;
serial.type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial.baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE);
serial.baud = get_uart_baudrate();
serial.regwidth = 4;
serial.input_hertz = uart_platform_refclk();
lb_add_serial(&serial, data);

lb_add_console(LB_TAG_CONSOLE_SERIAL8250MEM, data);
serial->type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial->baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE);
serial->baud = get_uart_baudrate();
serial->regwidth = 4;
serial->input_hertz = uart_platform_refclk();

return CB_SUCCESS;
}
18 changes: 8 additions & 10 deletions src/soc/nvidia/tegra210/uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,15 +101,13 @@ unsigned char uart_rx_byte(unsigned int idx)
return tegra210_uart_rx_byte();
}

void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{
struct lb_serial serial;
serial.type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial.baseaddr = CONFIG_CONSOLE_SERIAL_TEGRA210_UART_ADDRESS;
serial.baud = get_uart_baudrate();
serial.regwidth = 4;
serial.input_hertz = uart_platform_refclk();
lb_add_serial(&serial, data);

lb_add_console(LB_TAG_CONSOLE_SERIAL8250MEM, data);
serial->type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial->baseaddr = CONFIG_CONSOLE_SERIAL_TEGRA210_UART_ADDRESS;
serial->baud = get_uart_baudrate();
serial->regwidth = 4;
serial->input_hertz = uart_platform_refclk();

return CB_SUCCESS;
}
16 changes: 7 additions & 9 deletions src/soc/qualcomm/common/qupv3_uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,15 +140,13 @@ uintptr_t uart_platform_base(unsigned int idx)
return (uintptr_t)qup[idx].regs;
}

void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{
struct lb_serial serial = {0};
serial->type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial->baseaddr = (uint32_t)uart_platform_base(CONFIG_UART_FOR_CONSOLE);
serial->baud = get_uart_baudrate();
serial->regwidth = 4;
serial->input_hertz = SRC_XO_HZ;

serial.type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial.baseaddr = (uint32_t)uart_platform_base(CONFIG_UART_FOR_CONSOLE);
serial.baud = get_uart_baudrate();
serial.regwidth = 4;
serial.input_hertz = SRC_XO_HZ;

lb_add_serial(&serial, data);
return CB_SUCCESS;
}
4 changes: 2 additions & 2 deletions src/soc/qualcomm/common/uart_bitbang.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
#include <boot/coreboot_tables.h>
#include <soc/uart.h>

void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{

return CB_ERR;
}

static void set_tx(int line_state)
Expand Down
17 changes: 7 additions & 10 deletions src/soc/qualcomm/ipq40xx/uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -256,16 +256,13 @@ uint8_t uart_rx_byte(unsigned int idx)
}

/* TODO: Implement function */
void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{
struct lb_serial serial;
serial->type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial->baseaddr = (uint32_t)UART1_DM_BASE;
serial->baud = get_uart_baudrate();
serial->regwidth = 1;
serial->input_hertz = uart_platform_refclk();

serial.type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial.baseaddr = (uint32_t)UART1_DM_BASE;
serial.baud = get_uart_baudrate();
serial.regwidth = 1;
serial.input_hertz = uart_platform_refclk();
lb_add_serial(&serial, data);

lb_add_console(LB_TAG_CONSOLE_SERIAL8250MEM, data);
return CB_SUCCESS;
}
3 changes: 2 additions & 1 deletion src/soc/qualcomm/ipq806x/uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,7 @@ uint8_t uart_rx_byte(unsigned int idx)
}

/* TODO: Implement function */
void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{
return CB_ERR;
}
17 changes: 7 additions & 10 deletions src/soc/qualcomm/qcs405/uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -257,16 +257,13 @@ uint8_t uart_rx_byte(unsigned int idx)
}
#endif

void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{
struct lb_serial serial;
serial->type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial->baseaddr = (uint64_t)UART2_DM_BASE;
serial->baud = get_uart_baudrate();
serial->regwidth = 1;
serial->input_hertz = uart_platform_refclk();

serial.type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial.baseaddr = (uint64_t)UART2_DM_BASE;
serial.baud = get_uart_baudrate();
serial.regwidth = 1;
serial.input_hertz = uart_platform_refclk();
lb_add_serial(&serial, data);

lb_add_console(LB_TAG_CONSOLE_SERIAL8250MEM, data);
return CB_SUCCESS;
}
18 changes: 8 additions & 10 deletions src/soc/samsung/exynos5250/uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,15 +132,13 @@ void uart_tx_flush(unsigned int idx)
exynos5_uart_tx_flush(uart);
}

void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{
struct lb_serial serial;
serial.type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial.baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE);
serial.baud = get_uart_baudrate();
serial.regwidth = 4;
serial.input_hertz = uart_platform_refclk();
lb_add_serial(&serial, data);

lb_add_console(LB_TAG_CONSOLE_SERIAL8250MEM, data);
serial->type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial->baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE);
serial->baud = get_uart_baudrate();
serial->regwidth = 4;
serial->input_hertz = uart_platform_refclk();

return CB_SUCCESS;
}
18 changes: 8 additions & 10 deletions src/soc/samsung/exynos5420/uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -123,15 +123,13 @@ void uart_tx_flush(unsigned int idx)
/* Exynos5250 implements this too. */
}

void uart_fill_lb(void *data)
enum cb_err fill_lb_serial(struct lb_serial *serial)
{
struct lb_serial serial;
serial.type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial.baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE);
serial.baud = get_uart_baudrate();
serial.regwidth = 4;
serial.input_hertz = uart_platform_refclk();
lb_add_serial(&serial, data);

lb_add_console(LB_TAG_CONSOLE_SERIAL8250MEM, data);
serial->type = LB_SERIAL_TYPE_MEMORY_MAPPED;
serial->baseaddr = uart_platform_base(CONFIG_UART_FOR_CONSOLE);
serial->baud = get_uart_baudrate();
serial->regwidth = 4;
serial->input_hertz = uart_platform_refclk();

return CB_SUCCESS;
}

0 comments on commit 9948c52

Please sign in to comment.