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

[PATCH v1 09/16] arm/vuart: use void pointer in domain struct



From: Denis Mukhin <dmukhin@xxxxxxxx> 

Make all public data structures private to simple MMIO-based vUART
implementation and switch struct domain to using void pointer to reduce
compile-time dependencies.

Signed-off-by: Denis Mukhin <dmukhin@xxxxxxxx>
---
 xen/arch/arm/include/asm/domain.h | 14 ++-----
 xen/arch/arm/vuart.c              | 68 ++++++++++++++++++++++---------
 2 files changed, 52 insertions(+), 30 deletions(-)

diff --git a/xen/arch/arm/include/asm/domain.h 
b/xen/arch/arm/include/asm/domain.h
index d668c11d7e2c..38873c66f1f8 100644
--- a/xen/arch/arm/include/asm/domain.h
+++ b/xen/arch/arm/include/asm/domain.h
@@ -90,16 +90,6 @@ struct arch_domain
 
     struct vgic_dist vgic;
 
-#ifdef CONFIG_HAS_VUART_MMIO
-    struct vuart {
-#define VUART_BUF_SIZE 128
-        char                        *buf;
-        int                         idx;
-        const struct vuart_info     *info;
-        spinlock_t                  lock;
-    } vuart;
-#endif
-
     unsigned int evtchn_irq;
 #ifdef CONFIG_ACPI
     void *efi_acpi_table;
@@ -116,6 +106,10 @@ struct arch_domain
     void *vpl011;
 #endif
 
+#ifdef CONFIG_HAS_VUART_MMIO
+    void *vuart;
+#endif
+
 #ifdef CONFIG_TEE
     void *tee;
 #endif
diff --git a/xen/arch/arm/vuart.c b/xen/arch/arm/vuart.c
index 5403ed284846..d2f90ab0c64f 100644
--- a/xen/arch/arm/vuart.c
+++ b/xen/arch/arm/vuart.c
@@ -29,8 +29,16 @@
 #include <asm/mmio.h>
 #include <xen/perfc.h>
 #include <xen/vuart.h>
+#include <xen/xvmalloc.h>
 
-#define domain_has_vuart(d) ((d)->arch.vuart.info != NULL)
+#define VUART_BUF_SIZE          128
+
+struct vuart {
+    char                        *buf;
+    int                         idx;
+    const struct vuart_info     *info;
+    spinlock_t                  lock;
+};
 
 static int vuart_mmio_read(struct vcpu *v, mmio_info_t *info,
                            register_t *r, void *priv);
@@ -44,39 +52,57 @@ static const struct mmio_handler_ops vuart_mmio_handler = {
 
 int domain_vuart_init(struct domain *d)
 {
-    ASSERT( is_hardware_domain(d) );
+    const struct vuart_info *info;
+    struct vuart *vdev;
 
-    d->arch.vuart.info = serial_vuart_info(SERHND_DTUART);
-    if ( !d->arch.vuart.info )
+    if ( !is_hardware_domain(d) )
         return 0;
 
-    spin_lock_init(&d->arch.vuart.lock);
-    d->arch.vuart.idx = 0;
+    info = serial_vuart_info(SERHND_DTUART);
+    if ( !info )
+        return 0;
 
-    d->arch.vuart.buf = xzalloc_array(char, VUART_BUF_SIZE);
-    if ( !d->arch.vuart.buf )
+    vdev = xvzalloc(typeof(*vdev));
+    if ( !vdev )
         return -ENOMEM;
 
-    register_mmio_handler(d, &vuart_mmio_handler,
-                          d->arch.vuart.info->base_addr,
-                          d->arch.vuart.info->size,
+    vdev->buf = xzalloc_array(char, VUART_BUF_SIZE);
+    if ( !vdev->buf )
+    {
+        xfree(vdev);
+        return -ENOMEM;
+    }
+
+    spin_lock_init(&vdev->lock);
+
+    register_mmio_handler(d,
+                          &vuart_mmio_handler,
+                          info->base_addr,
+                          info->size,
                           NULL);
 
+    vdev->info = info;
+    d->arch.vuart = vdev;
+
     return 0;
 }
 
 void domain_vuart_free(struct domain *d)
 {
-    if ( !domain_has_vuart(d) )
-        return;
+    struct vuart *vdev = d->arch.vuart;
 
-    xfree(d->arch.vuart.buf);
+    if ( vdev )
+    {
+        xfree(vdev->buf);
+        xfree(vdev);
+        d->arch.vuart = NULL;
+    }
 }
 
 static void vuart_print_char(struct vcpu *v, char c)
 {
     struct domain *d = v->domain;
-    struct vuart *uart = &d->arch.vuart;
+    struct vuart *uart = d->arch.vuart;
 
     if ( !is_console_printable(c) )
         return ;
@@ -98,16 +124,17 @@ static int vuart_mmio_read(struct vcpu *v, mmio_info_t 
*info,
                            register_t *r, void *priv)
 {
     struct domain *d = v->domain;
-    paddr_t offset = info->gpa - d->arch.vuart.info->base_addr;
+    struct vuart *vdev = d->arch.vuart;
+    paddr_t offset = info->gpa - vdev->info->base_addr;
 
     perfc_incr(vuart_reads);
 
     /* By default zeroed the register */
     *r = 0;
 
-    if ( offset == d->arch.vuart.info->status_off )
+    if ( offset == vdev->info->status_off )
         /* All holding registers empty, ready to send etc */
-        *r = d->arch.vuart.info->status;
+        *r = vdev->info->status;
 
     return 1;
 }
@@ -116,11 +143,12 @@ static int vuart_mmio_write(struct vcpu *v, mmio_info_t 
*info,
                             register_t r, void *priv)
 {
     struct domain *d = v->domain;
-    paddr_t offset = info->gpa - d->arch.vuart.info->base_addr;
+    struct vuart *vdev = d->arch.vuart;
+    paddr_t offset = info->gpa - vdev->info->base_addr;
 
     perfc_incr(vuart_writes);
 
-    if ( offset == d->arch.vuart.info->data_off )
+    if ( offset == vdev->info->data_off )
         /* ignore any status bits */
         vuart_print_char(v, r & 0xFF);
 
-- 
2.34.1





 


Rackspace

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