]> xenbits.xensource.com Git - people/royger/xen.git/commitdiff
xen/arm: vpl011: Handle correctly TXFE when backend in Xen
authorMichal Orzel <michal.orzel@amd.com>
Wed, 5 Apr 2023 11:17:49 +0000 (13:17 +0200)
committerStefano Stabellini <stefano.stabellini@amd.com>
Mon, 17 Apr 2023 20:01:05 +0000 (13:01 -0700)
When backend is in Xen, the handling of data written to DR register is a
bit special because we want to tell guest that we are always ready for new
data to be written (i.e. no real FIFO, TXFF/BUSY never set and TXI always
set). This conflicts with the current handling of TXFE bit, which we
always clear and never set on a write path (we happen to set it when we
receive char from serial input due to use of vpl011_data_avail() but this
might never be called). This can lead to issues if a guest driver makes
use of TXFE bit to check for TX transmission completion (such guest could
then wait endlessly). Fix it by keeping TXFE always set to match the
current emulation logic.

Signed-off-by: Michal Orzel <michal.orzel@amd.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
Reviewed-by: Henry Wang <Henry.Wang@arm.com>
Tested-by: Henry Wang <Henry.Wang@arm.com>
xen/arch/arm/vpl011.c

index 0186d8a31834d413fb62c6d660d50fed16aa3802..ff06deeb645c9ca392722c872e926daa08f96066 100644 (file)
@@ -112,8 +112,14 @@ static void vpl011_write_data_xen(struct domain *d, uint8_t data)
         }
     }
 
+    /*
+     * When backend is in Xen, we tell guest we are always ready for new data
+     * to be written. This is fulfilled by having:
+     * - TXI/TXFE -> always set,
+     * - TXFF/BUSY -> never set.
+     */
     vpl011->uartris |= TXI;
-    vpl011->uartfr &= ~TXFE;
+    vpl011->uartfr |= TXFE;
     vpl011_update_interrupt_status(d);
 
     VPL011_UNLOCK(d, flags);