powerpc/powernv: move opal console flushing to udbg
authorNicholas Piggin <npiggin@gmail.com>
Mon, 30 Apr 2018 14:55:50 +0000 (00:55 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 24 Jul 2018 12:09:57 +0000 (22:09 +1000)
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>
arch/powerpc/platforms/powernv/opal.c
drivers/tty/hvc/hvc_opal.c

index e18472757617121875580619dacb1365e3e57eee..cf02e602237a32894670a2ab8a785416533c9c10 100644 (file)
@@ -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;
 }
index 9645c0062a900e2385b63cccdf203f7f82b7f0bb..958c61c8f35a3542ad70d36cc13b3002e78b1a1a 100644 (file)
@@ -275,6 +275,11 @@ static void udbg_opal_putc(char c)
                        count = hvc_opal_hvsi_put_chars(termno, &c, 1);
                        break;
                }
+
+               /* This is needed for the cosole to flush
+                * when there aren't any interrupts.
+                */
+               opal_flush_console(termno);
        } while(count == 0 || count == -EAGAIN);
 }