On Wed, Nov 09, 2011 at 05:30:28PM +0200, Alon Levy wrote: > rebased. > > From: Gerd Hofmann <kra...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/spice-devel _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel