[Spice-devel] [PATCH] support _ASYNC io calls and interrupt handling (busy wait)
Alon Levy
alevy at redhat.com
Wed Nov 9 07:41:51 PST 2011
On Wed, Nov 09, 2011 at 05:30:28PM +0200, Alon Levy wrote:
> rebased.
>
> From: Gerd Hofmann <kraxel at redhat.com>
I'll correct Gerd's last name before committing if it's acked. Sorry
Gerd!
> ---
> This is Gerd's patch from the original async io in qemu series, rebased and
> tested by me.
>
> src/qxl.h | 8 ++++++
> src/qxl_driver.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++---
> src/qxl_surface.c | 4 +-
> 3 files changed, 72 insertions(+), 6 deletions(-)
>
> diff --git a/src/qxl.h b/src/qxl.h
> index 23ed2dc..62c3086 100644
> --- a/src/qxl.h
> +++ b/src/qxl.h
> @@ -410,6 +410,14 @@ void * qxl_allocnf (qxl_screen_t *qxl,
> unsigned long size);
> int qxl_garbage_collect (qxl_screen_t *qxl);
>
> +/*
> + * I/O port commands
> + */
> +void qxl_update_area(qxl_screen_t *qxl);
> +void qxl_memslot_add(qxl_screen_t *qxl, uint8_t id);
> +void qxl_create_primary(qxl_screen_t *qxl);
> +void qxl_notify_oom(qxl_screen_t *qxl);
> +
> #ifdef XSPICE
> /* device to spice-server, now xspice to spice-server */
> void ioport_write(qxl_screen_t *qxl, uint32_t io_port, uint32_t val);
> diff --git a/src/qxl_driver.c b/src/qxl_driver.c
> index 428735a..ada0943 100644
> --- a/src/qxl_driver.c
> +++ b/src/qxl_driver.c
> @@ -102,6 +102,64 @@ const OptionInfoRec DefaultOptions[] = {
> { -1, NULL, OPTV_NONE, {0}, FALSE }
> };
>
> +static void qxl_wait_for_io_command(qxl_screen_t *qxl)
> +{
> + struct QXLRam *ram_header = (void *)(
> + (unsigned long)qxl->ram + qxl->rom->ram_header_offset);
> +
> + while (!(ram_header->int_pending & QXL_INTERRUPT_IO_CMD)) {
> + usleep(1);
> + }
> + ram_header->int_pending &= ~QXL_INTERRUPT_IO_CMD;
> +}
> +
> +void qxl_update_area(qxl_screen_t *qxl)
> +{
> +#ifndef XSPICE
> + if (qxl->pci->revision >= 3) {
> + ioport_write(qxl, QXL_IO_UPDATE_AREA_ASYNC, 0);
> + qxl_wait_for_io_command(qxl);
> + } else {
> + ioport_write(qxl, QXL_IO_UPDATE_AREA, 0);
> + }
> +#else
> + ioport_write(qxl, QXL_IO_UPDATE_AREA, 0);
> +#endif
> +}
> +
> +void qxl_memslot_add(qxl_screen_t *qxl, uint8_t id)
> +{
> +#ifndef XSPICE
> + if (qxl->pci->revision >= 3) {
> + ioport_write(qxl, QXL_IO_MEMSLOT_ADD_ASYNC, id);
> + qxl_wait_for_io_command(qxl);
> + } else {
> + ioport_write(qxl, QXL_IO_MEMSLOT_ADD, id);
> + }
> +#else
> + ioport_write(qxl, QXL_IO_MEMSLOT_ADD, id);
> +#endif
> +}
> +
> +void qxl_create_primary(qxl_screen_t *qxl)
> +{
> +#ifndef XSPICE
> + if (qxl->pci->revision >= 3) {
> + ioport_write(qxl, QXL_IO_CREATE_PRIMARY_ASYNC, 0);
> + qxl_wait_for_io_command(qxl);
> + } else {
> + ioport_write(qxl, QXL_IO_CREATE_PRIMARY, 0);
> + }
> +#else
> + ioport_write(qxl, QXL_IO_CREATE_PRIMARY, 0);
> +#endif
> +}
> +
> +void qxl_notify_oom(qxl_screen_t *qxl)
> +{
> + ioport_write(qxl, QXL_IO_NOTIFY_OOM, 0);
> +}
> +
> int
> qxl_garbage_collect (qxl_screen_t *qxl)
> {
> @@ -190,8 +248,8 @@ qxl_usleep (int useconds)
> int
> qxl_handle_oom (qxl_screen_t *qxl)
> {
> - ioport_write(qxl, QXL_IO_NOTIFY_OOM, 0);
> -
> + qxl_notify_oom(qxl);
> +
> #if 0
> ErrorF (".");
> qxl_usleep (10000);
> @@ -228,7 +286,7 @@ qxl_allocnf (qxl_screen_t *qxl, unsigned long size)
> ram_header->update_area.right = qxl->virtual_x;
> ram_header->update_surface = 0; /* Only primary for now */
>
> - ioport_write(qxl, QXL_IO_UPDATE_AREA, 0);
> + qxl_update_area(qxl);
>
> #if 0
> ErrorF ("eliminated memory (%d)\n", nth_oom++);
> @@ -471,7 +529,7 @@ setup_slot(qxl_screen_t *qxl, uint8_t slot_index_offset,
> ram_header->mem_slot.mem_start = slot->start_phys_addr;
> ram_header->mem_slot.mem_end = slot->end_phys_addr;
>
> - ioport_write(qxl, QXL_IO_MEMSLOT_ADD, slot_index);
> + qxl_memslot_add(qxl, slot_index);
>
> slot->generation = qxl->rom->slot_generation;
>
> diff --git a/src/qxl_surface.c b/src/qxl_surface.c
> index 047b35a..5a26ba6 100644
> --- a/src/qxl_surface.c
> +++ b/src/qxl_surface.c
> @@ -378,7 +378,7 @@ qxl_surface_cache_create_primary (surface_cache_t *cache,
> create->type = QXL_SURF_TYPE_PRIMARY;
> create->mem = physical_address (cache->qxl, cache->qxl->ram, cache->qxl->main_mem_slot);
>
> - ioport_write(qxl, QXL_IO_CREATE_PRIMARY, 0);
> + qxl_create_primary(qxl);
>
> dev_addr = (uint8_t *)qxl->ram + mode->stride * (mode->y_res - 1);
>
> @@ -920,7 +920,7 @@ download_box (qxl_surface_t *surface, int x1, int y1, int x2, int y2)
> ErrorF ("Issuing update command for %d\n", surface->id);
> #endif
>
> - ioport_write(surface->cache->qxl, QXL_IO_UPDATE_AREA, 0);
> + qxl_update_area(surface->cache->qxl);
>
> pixman_image_composite (PIXMAN_OP_SRC,
> surface->dev_image,
> --
> 1.7.7.1
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
More information about the Spice-devel
mailing list