[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |