From 7edaf63587aace2729f70144d6ff5e9c3a3766c4 Mon Sep 17 00:00:00 2001 From: Oliver O'Halloran Date: Wed, 21 Dec 2016 15:52:25 +1100 Subject: [PATCH] console: add helper to create serial console nodes The creation of /ibm,skiboot/console/serial@ nodes is pretty much identical across the various OPAL console drivers. This patch moves it into a helper function as a cleanup. Reviewed-by: Andrew Donnellan Signed-off-by: Oliver O'Halloran Signed-off-by: Stewart Smith --- core/console.c | 43 +++++++++++++++++++++++++++++++------------ hw/fsp/fsp-console.c | 24 ++++++++---------------- hw/lpc-uart.c | 16 ++-------------- include/console.h | 3 +++ 4 files changed, 44 insertions(+), 42 deletions(-) diff --git a/core/console.c b/core/console.c index ad8b2440d21d..3189c4fcdda7 100644 --- a/core/console.c +++ b/core/console.c @@ -103,6 +103,36 @@ void enable_mambo_console(void) set_console(&mambo_con_driver); } +/* + * Helper function for adding /ibm,opal/consoles/serial@ nodes + */ +struct dt_node *add_opal_console_node(int index, const char *type, + uint32_t write_buffer_size) +{ + struct dt_node *con, *consoles; + char buffer[32]; + + consoles = dt_find_by_name(opal_node, "consoles"); + if (!consoles) { + consoles = dt_new(opal_node, "consoles"); + assert(consoles); + dt_add_property_cells(consoles, "#address-cells", 1); + dt_add_property_cells(consoles, "#size-cells", 0); + } + + con = dt_new_addr(consoles, "serial", index); + assert(con); + + snprintf(buffer, sizeof(buffer), "ibm,opal-console-%s", type); + dt_add_property_string(con, "compatible", buffer); + + dt_add_property_cells(con, "#write-buffer-size", write_buffer_size); + dt_add_property_cells(con, "reg", index); + dt_add_property_string(con, "device_type", "serial"); + + return con; +} + void clear_console(void) { memset(con_buf, 0, INMEM_CON_LEN); @@ -396,20 +426,9 @@ static void dummy_console_poll(void *data __unused) void dummy_console_add_nodes(void) { - struct dt_node *con, *consoles; struct dt_property *p; - consoles = dt_new(opal_node, "consoles"); - assert(consoles); - dt_add_property_cells(consoles, "#address-cells", 1); - dt_add_property_cells(consoles, "#size-cells", 0); - - con = dt_new_addr(consoles, "serial", 0); - assert(con); - dt_add_property_string(con, "compatible", "ibm,opal-console-raw"); - dt_add_property_cells(con, "#write-buffer-size", INMEM_CON_OUT_LEN); - dt_add_property_cells(con, "reg", 0); - dt_add_property_string(con, "device_type", "serial"); + add_opal_console_node(0, "raw", memcons.obuf_size); /* Mambo might have left a crap one, clear it */ p = __dt_find_property(dt_chosen, "linux,stdout-path"); diff --git a/hw/fsp/fsp-console.c b/hw/fsp/fsp-console.c index 46ac28bbd822..8fd18d1a8f03 100644 --- a/hw/fsp/fsp-console.c +++ b/hw/fsp/fsp-console.c @@ -917,37 +917,29 @@ void fsp_console_reset(void) void fsp_console_add_nodes(void) { + struct dt_node *opal_event; unsigned int i; - struct dt_node *consoles, *opal_event; - consoles = dt_new(opal_node, "consoles"); - dt_add_property_cells(consoles, "#address-cells", 1); - dt_add_property_cells(consoles, "#size-cells", 0); + opal_event = dt_find_by_name(opal_node, "event"); + for (i = 0; i < MAX_SERIAL; i++) { struct fsp_serial *fs = &fsp_serials[i]; struct dt_node *fs_node; - char name[32]; + const char *type; if (fs->log_port || !fs->available) continue; - snprintf(name, sizeof(name), "serial@%d", i); - fs_node = dt_new(consoles, name); if (fs->rsrc_id == 0xffff) - dt_add_property_string(fs_node, "compatible", - "ibm,opal-console-raw"); + type = "raw"; else - dt_add_property_string(fs_node, "compatible", - "ibm,opal-console-hvsi"); - dt_add_property_cells(fs_node, - "#write-buffer-size", SER_BUF_DATA_SIZE); - dt_add_property_cells(fs_node, "reg", i); - dt_add_property_string(fs_node, "device_type", "serial"); + type = "hvsi"; + + fs_node = add_opal_console_node(i, type, SER_BUF_DATA_SIZE); fs->irq = opal_dynamic_event_alloc(); dt_add_property_cells(fs_node, "interrupts", ilog2(fs->irq)); - opal_event = dt_find_by_name(opal_node, "event"); if (opal_event) dt_add_property_cells(fs_node, "interrupt-parent", opal_event->phandle); diff --git a/hw/lpc-uart.c b/hw/lpc-uart.c index 66932652608e..2383ff54ee32 100644 --- a/hw/lpc-uart.c +++ b/hw/lpc-uart.c @@ -420,20 +420,8 @@ void uart_setup_linux_passthrough(void) void uart_setup_opal_console(void) { - struct dt_node *con, *consoles; - - /* Create OPAL console node */ - consoles = dt_new(opal_node, "consoles"); - assert(consoles); - dt_add_property_cells(consoles, "#address-cells", 1); - dt_add_property_cells(consoles, "#size-cells", 0); - - con = dt_new_addr(consoles, "serial", 0); - assert(con); - dt_add_property_string(con, "compatible", "ibm,opal-console-raw"); - dt_add_property_cells(con, "#write-buffer-size", INMEM_CON_OUT_LEN); - dt_add_property_cells(con, "reg", 0); - dt_add_property_string(con, "device_type", "serial"); + /* Add the opal console node */ + add_opal_console_node(0, "raw", OUT_BUF_SIZE); dt_add_property_string(dt_chosen, "linux,stdout-path", "/ibm,opal/consoles/serial@0"); diff --git a/include/console.h b/include/console.h index 4c77433421f6..6a80bef96c7a 100644 --- a/include/console.h +++ b/include/console.h @@ -71,4 +71,7 @@ extern void clear_console(void); extern void memcons_add_properties(void); extern void dummy_console_add_nodes(void); +struct dt_node *add_opal_console_node(int index, const char *type, + uint32_t write_buffer_size); + #endif /* __CONSOLE_H */