[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 17/21] xen/arm: refactor vpl011_data_avail
Move the code to calculate in_fifo_level and out_fifo_level out of vpl011_data_avail, to the caller. This change will make it possible to reuse vpl011_data_avail with different ring structures in a later patch. Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx> --- Changes in v2: - new patch --- xen/arch/arm/vpl011.c | 70 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/xen/arch/arm/vpl011.c b/xen/arch/arm/vpl011.c index 33fcaa0..e75957f 100644 --- a/xen/arch/arm/vpl011.c +++ b/xen/arch/arm/vpl011.c @@ -34,6 +34,12 @@ #include <asm/vgic-emul.h> #include <asm/vpl011.h> +static void vpl011_data_avail(struct domain *d, + XENCONS_RING_IDX in_fifo_level, + XENCONS_RING_IDX in_size, + XENCONS_RING_IDX out_fifo_level, + XENCONS_RING_IDX out_size); + /* * Since pl011 registers are 32-bit registers, all registers * are handled similarly allowing 8-bit, 16-bit and 32-bit @@ -378,30 +384,13 @@ static const struct mmio_handler_ops vpl011_mmio_handler = { .write = vpl011_mmio_write, }; -static void vpl011_data_avail(struct domain *d) +static void vpl011_data_avail(struct domain *d, + XENCONS_RING_IDX in_fifo_level, + XENCONS_RING_IDX in_size, + XENCONS_RING_IDX out_fifo_level, + XENCONS_RING_IDX out_size) { - unsigned long flags; struct vpl011 *vpl011 = &d->arch.vpl011; - struct xencons_interface *intf = vpl011->ring.ring_buf; - XENCONS_RING_IDX in_cons, in_prod, out_cons, out_prod; - XENCONS_RING_IDX in_fifo_level, out_fifo_level; - - VPL011_LOCK(d, flags); - - in_cons = intf->in_cons; - in_prod = intf->in_prod; - out_cons = intf->out_cons; - out_prod = intf->out_prod; - - smp_rmb(); - - in_fifo_level = xencons_queued(in_prod, - in_cons, - sizeof(intf->in)); - - out_fifo_level = xencons_queued(out_prod, - out_cons, - sizeof(intf->out)); /**** Update the UART RX state ****/ @@ -410,11 +399,11 @@ static void vpl011_data_avail(struct domain *d) vpl011->uartfr &= ~RXFE; /* Set the FIFO_FULL bit if the Xen buffer is full. */ - if ( in_fifo_level == sizeof(intf->in) ) + if ( in_fifo_level == in_size ) vpl011->uartfr |= RXFF; /* Assert the RX interrupt if the FIFO is more than half way filled. */ - if ( in_fifo_level >= sizeof(intf->in) - SBSA_UART_FIFO_LEVEL ) + if ( in_fifo_level >= in_size - SBSA_UART_FIFO_LEVEL ) vpl011->uartris |= RXI; /* @@ -427,7 +416,7 @@ static void vpl011_data_avail(struct domain *d) /**** Update the UART TX state ****/ - if ( out_fifo_level != sizeof(intf->out) ) + if ( out_fifo_level != out_size ) { vpl011->uartfr &= ~TXFF; @@ -445,13 +434,38 @@ static void vpl011_data_avail(struct domain *d) if ( out_fifo_level == 0 ) vpl011->uartfr |= TXFE; - - VPL011_UNLOCK(d, flags); } static void vpl011_notification(struct vcpu *v, unsigned int port) { - vpl011_data_avail(v->domain); + unsigned long flags; + struct domain *d = v->domain; + struct vpl011 *vpl011 = &d->arch.vpl011; + struct xencons_interface *intf = vpl011->ring.ring_buf; + XENCONS_RING_IDX in_cons, in_prod, out_cons, out_prod; + XENCONS_RING_IDX in_fifo_level, out_fifo_level; + + VPL011_LOCK(d, flags); + + in_cons = intf->in_cons; + in_prod = intf->in_prod; + out_cons = intf->out_cons; + out_prod = intf->out_prod; + + smp_rmb(); + + in_fifo_level = xencons_queued(in_prod, + in_cons, + sizeof(intf->in)); + + out_fifo_level = xencons_queued(out_prod, + out_cons, + sizeof(intf->out)); + + vpl011_data_avail(v->domain, in_fifo_level, sizeof(intf->in), + out_fifo_level, sizeof(intf->out)); + + VPL011_UNLOCK(d, flags); } int domain_vpl011_init(struct domain *d, struct vpl011_init_info *info) -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |