summaryrefslogtreecommitdiff
path: root/arch/powerpc/platforms/powernv/opal.c
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2018-05-01 00:55:50 +1000
committerMichael Ellerman <mpe@ellerman.id.au>2018-07-24 22:09:57 +1000
commitac4ac788fdadc6b703ff3322de07dee442e08e1c (patch)
treeea1fbf4f4ec19a771adf1c7ce42272cd12aea3ab /arch/powerpc/platforms/powernv/opal.c
parentb74d2807ae0cdb17ccc45d22260fc151a1b2d46b (diff)
powerpc/powernv: move opal console flushing to udbg
OPAL console writes do not have to synchronously flush firmware / hardware buffers unless they are going through the udbg path. Remove the unconditional flushing from opal_put_chars. Flush if there was no space in the buffer as an optimisation (callers loop waiting for success in that case). udbg flushing is moved to udbg_opal_putc. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc/platforms/powernv/opal.c')
-rw-r--r--arch/powerpc/platforms/powernv/opal.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c
index e18472757617..cf02e602237a 100644
--- a/arch/powerpc/platforms/powernv/opal.c
+++ b/arch/powerpc/platforms/powernv/opal.c
@@ -400,12 +400,14 @@ int opal_put_chars(uint32_t vtermno, const char *data, int total_len)
out:
spin_unlock_irqrestore(&opal_write_lock, flags);
- /* This is a bit nasty but we need that for the console to
- * flush when there aren't any interrupts. We will clean
- * things a bit later to limit that to synchronous path
- * such as the kernel console and xmon/udbg
+ /* In the -EAGAIN case, callers loop, so we have to flush the console
+ * here in case they have interrupts off (and we don't want to wait
+ * for async flushing if we can make immediate progress here). If
+ * necessary the API could be made entirely non-flushing if the
+ * callers had a ->flush API to use.
*/
- opal_flush_console(vtermno);
+ if (written == -EAGAIN)
+ opal_flush_console(vtermno);
return written;
}