|
[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 |