[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v1 16/16] drivers/vuart: hook simple MMIO-based UART to vUART framework



From: Denis Mukhin <dmukhin@xxxxxxxx> 

Add new emulation flag DOMAIN_EMU_UART_MMIO and add it to domain_has_vuart().

Add needed shims for vuart framework integration to MMIO-based UART emulator.

Remove domain_vuart_{init,free}() and use generic vuart_{init,exit}() calls.

No functional change intended.

Signed-off-by: Denis Mukhin <dmukhin@xxxxxxxx>
---
 xen/arch/arm/domain.c          |  7 +++++--
 xen/common/domain.c            |  3 +++
 xen/drivers/vuart/vuart-mmio.c | 36 ++++++++++++++++++++++++++++++++--
 xen/include/xen/domain-emu.h   |  1 +
 xen/include/xen/vuart.h        | 20 -------------------
 5 files changed, 43 insertions(+), 24 deletions(-)

diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
index 3579d10d7e1d..5d7006241be0 100644
--- a/xen/arch/arm/domain.c
+++ b/xen/arch/arm/domain.c
@@ -780,7 +780,10 @@ int arch_domain_create(struct domain *d,
      * Only use it for the hardware domain because the linux kernel may not
      * support multi-platform.
      */
-    if ( is_hardware_domain(d) && (rc = domain_vuart_init(d)) )
+    if ( is_hardware_domain(d) && IS_ENABLED(CONFIG_HAS_VUART_MMIO) )
+        d->emulation_flags |= DOMAIN_EMU_UART_MMIO;
+
+    if ( domain_has_vuart(d) && (rc = vuart_init(d, NULL)) != 0 )
         goto fail;
 
     if ( (rc = domain_vpci_init(d)) != 0 )
@@ -849,7 +852,7 @@ void arch_domain_destroy(struct domain *d)
     iommu_domain_destroy(d);
     p2m_final_teardown(d);
     domain_vgic_free(d);
-    domain_vuart_free(d);
+    vuart_exit(d);
     free_xenheap_page(d->shared_info);
 #ifdef CONFIG_ACPI
     free_xenheap_pages(d->arch.efi_acpi_table,
diff --git a/xen/common/domain.c b/xen/common/domain.c
index 071fee81fe2c..fc0ceb266d88 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -2443,6 +2443,9 @@ bool domain_has_vuart(const struct domain *d)
     if ( IS_ENABLED(CONFIG_HAS_VUART_PL011) )
         mask |= DOMAIN_EMU_UART_PL011;
 
+    if ( IS_ENABLED(CONFIG_HAS_VUART_MMIO) )
+        mask |= DOMAIN_EMU_UART_MMIO;
+
     return !!(d->emulation_flags & mask);
 }
 
diff --git a/xen/drivers/vuart/vuart-mmio.c b/xen/drivers/vuart/vuart-mmio.c
index 66fac6c994ce..1888e44e3d94 100644
--- a/xen/drivers/vuart/vuart-mmio.c
+++ b/xen/drivers/vuart/vuart-mmio.c
@@ -49,7 +49,7 @@ static const struct mmio_handler_ops vuart_mmio_handler = {
     .write = vuart_mmio_write,
 };
 
-int domain_vuart_init(struct domain *d)
+static int cf_check vuart_mmio_init(struct domain *d, struct vuart_params 
*params)
 {
     const struct vuart_info *info;
     struct vuart *vdev;
@@ -86,7 +86,7 @@ int domain_vuart_init(struct domain *d)
     return 0;
 }
 
-void domain_vuart_free(struct domain *d)
+static void cf_check vuart_mmio_exit(struct domain *d)
 {
     struct vuart *vdev = d->arch.vuart;
 
@@ -147,6 +147,38 @@ static int vuart_mmio_write(struct vcpu *v, mmio_info_t 
*info,
     return 1;
 }
 
+static void cf_check vuart_mmio_dump(const struct domain *d)
+{
+    struct vuart *vdev = d->arch.vuart;
+
+    if ( !vdev )
+        return;
+
+    /* Allow printing state in case of a deadlock. */
+    if ( !spin_trylock(&vdev->lock) )
+        return;
+
+    printk("Virtual MMIO UART@%"PRIpaddr" owner %pd\n",
+           vdev->info->base_addr, d);
+    printk("  RX FIFO size %u idx %u\n",
+           VUART_BUF_SIZE, vdev->idx);
+    printk("  status 0x%lx 0x%lx\n",
+           vdev->info->status_off, vdev->info->status);
+
+    spin_unlock(&vdev->lock);
+}
+
+static const struct vuart_ops vuart_mmio_ops = {
+    .add_fwnode = NULL,
+    .init       = vuart_mmio_init,
+    .exit       = vuart_mmio_exit,
+    .dump       = vuart_mmio_dump,
+    /* Physical console focus is not supported */
+    .putchar    = NULL,
+};
+
+VUART_REGISTER(mmio, &vuart_mmio_ops);
+
 /*
  * Local variables:
  * mode: C
diff --git a/xen/include/xen/domain-emu.h b/xen/include/xen/domain-emu.h
index 1d3a6c80fadd..9ef607666842 100644
--- a/xen/include/xen/domain-emu.h
+++ b/xen/include/xen/domain-emu.h
@@ -18,6 +18,7 @@
 #define DOMAIN_EMU_PCI              (1U << 10)
 
 #define DOMAIN_EMU_UART_PL011       (1U << 15)
+#define DOMAIN_EMU_UART_MMIO        (1U << 16)
 
 #endif /* XEN_DOMAIN_EMU_H */
 
diff --git a/xen/include/xen/vuart.h b/xen/include/xen/vuart.h
index 1f4b47575359..4c923025b4eb 100644
--- a/xen/include/xen/vuart.h
+++ b/xen/include/xen/vuart.h
@@ -60,26 +60,6 @@ static inline int vuart_putchar(struct domain *d, char c)
 
 #endif /* CONFIG_HAS_VUART */
 
-#ifdef CONFIG_HAS_VUART_MMIO
-
-int domain_vuart_init(struct domain *d);
-void domain_vuart_free(struct domain *d);
-
-#else
-
-static inline int domain_vuart_init(struct domain *d)
-{
-    /*
-     * The vUART is unconditionally inialized for the hw domain. So we
-     * can't return an error.
-     */
-    return 0;
-}
-
-static inline void domain_vuart_free(struct domain *d) {};
-
-#endif /* CONFIG_HAS_VUART_MMIO */
-
 #endif /* XEN_VUART_H */
 
 /*
-- 
2.34.1





 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.