aboutsummaryrefslogtreecommitdiff
path: root/hw/lpc-uart.c
diff options
context:
space:
mode:
authorRussell Currey <ruscur@russell.cc>2015-10-23 16:15:26 +1100
committerStewart Smith <stewart@linux.vnet.ibm.com>2015-11-09 14:13:25 +1100
commitdd7980e6d9ffeaac4ae440e6d2f9e8aa88e7ebc7 (patch)
tree992948033fb395bcc24186fa8f76b295dfeaaf63 /hw/lpc-uart.c
parenta0be766f49e1161014f0a02dc3b2fa4800592e8f (diff)
downloadskiboot-dd7980e6d9ffeaac4ae440e6d2f9e8aa88e7ebc7.zip
skiboot-dd7980e6d9ffeaac4ae440e6d2f9e8aa88e7ebc7.tar.gz
skiboot-dd7980e6d9ffeaac4ae440e6d2f9e8aa88e7ebc7.tar.bz2
console: Completely flush output buffer before power down and reboot
Completely flush the output buffer of the console driver before power down and reboot. Implements the flushing function for uart consoles, which includes the astbmc and rhesus platforms. Adds a new function, flush(), to the con_ops struct that allows each console driver to specify how their output buffers are flushed. In the cec_power_down and cec_reboot functions, the flush function of the driver is called if it exists. This fixes an issue where some console output is sometimes lost before power down or reboot in uart consoles. If this issue is also prevalent in other console types then it can be fixed later by adding a .flush to that driver's con_ops. Signed-off-by: Russell Currey <ruscur@russell.cc> [stewart@linux.vnet.ibm.com: reduce diff size, change flush function name] Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'hw/lpc-uart.c')
-rw-r--r--hw/lpc-uart.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/hw/lpc-uart.c b/hw/lpc-uart.c
index 5c5d942..e856563 100644
--- a/hw/lpc-uart.c
+++ b/hw/lpc-uart.c
@@ -156,8 +156,11 @@ static size_t uart_con_write(const char *buf, size_t len)
return written;
}
+static void uart_con_flush_all(void);
+
static struct con_ops uart_con_driver = {
- .write = uart_con_write
+ .write = uart_con_write,
+ .flush = uart_con_flush_all
};
/*
@@ -376,6 +379,15 @@ static void uart_irq(uint32_t chip_id __unused, uint32_t irq_mask __unused)
}
/*
+ * Flush the entire buffer all at once
+ */
+static void uart_con_flush_all(void)
+{
+ while(out_buf_prod != out_buf_cons)
+ uart_flush_out();
+}
+
+/*
* Common setup/inits
*/