Slow performance of VUART on AST2500 with 5.15.5

Zev Weiss zweiss at
Thu Dec 16 15:27:30 AEDT 2021

On Wed, Dec 15, 2021 at 07:38:36PM PST, Oskar Senft wrote:
>Hi everyone
>I'm doing some more validation work with meta-tyan
>(*/49181 ) on the
>current 5.15.5 kernel. I noticed that when using ttyS0 from the host
>(being the VUART in the AST2500), that the transfer host->BMC is
>really slow (like 300 baud slow). This is true even after stopping
>obmc-console-server and just doing `cat /dev/ttyVUART0`, so I figured
>it must be a kernel problem. When I then tried kernel 5.2.11 (with the
>DTS from 5.15.5 minus the uart_routing node), then VUART behaved
>normally. After having done this comparison, I think that 5.15.5 is
>generally just much slower.
>Is anyone aware of AST2500 VUART (or something else that would affect
>performance on an AST2500) having gotten broken somewhere between
>5.2.11 and 5.15.5?

Yes, this is a known issue.

Prior to commit 54da3e381c2 ("serial: 8250_aspeed_vuart: use UPF_IOREMAP
to set up register mapping"), a long-standing bug in the aspeed-vuart
driver had a side-effect of unintentionally leaving the VUART's FIFOs
disabled.  With that patch applied to fix the bug, the FIFOs get enabled
as they were originally intended to be, but that in turn seems to expose
another bug with the host-side THRE bit not getting set when it should,
so the host-side driver's write routine ends up waiting for a timeout to
expire on every character (when it would otherwise continue on to the
next character upon seeing THRE asserted).  I think this may be a VUART
hardware problem, though that hasn't been officially confirmed thus far.

I'm hoping we can land on a better solution, but as a temporary
band-aid, hacking the driver to treat the device as an 8250 instead of a
16550A (effectively just re-disabling the FIFOs) should speed things
back up:

diff --git a/drivers/tty/serial/8250/8250_aspeed_vuart.c b/drivers/tty/serial/8250/8250_aspeed_vuart.c
index 2350fb3bb5e4..c335f2b482bd 100644
--- a/drivers/tty/serial/8250/8250_aspeed_vuart.c
+++ b/drivers/tty/serial/8250/8250_aspeed_vuart.c
@@ -487,7 +487,7 @@ static int aspeed_vuart_probe(struct platform_device *pdev)
 	port.port.irq = irq_of_parse_and_map(np, 0);
 	port.port.handle_irq = aspeed_vuart_handle_irq;
 	port.port.iotype = UPIO_MEM;
-	port.port.type = PORT_16550A;
+	port.port.type = PORT_8250;
 	port.port.uartclk = clk;



More information about the openbmc mailing list