--- src/qxl.h | 1 - src/qxl_driver.c | 26 -------------------------- src/qxl_surface.c | 24 ++++++++++++------------ src/qxlhw.c | 5 +++++ src/qxlhw.h | 2 ++ src/qxlhw_pci.c | 26 ++++++++++++++++++++++++++ 6 files changed, 45 insertions(+), 39 deletions(-)
diff --git a/src/qxl.h b/src/qxl.h index 96144d6..0b00474 100644 --- a/src/qxl.h +++ b/src/qxl.h @@ -374,7 +374,6 @@ int qxl_garbage_collect (qxl_screen_t *qxl); * I/O port commands */ 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 diff --git a/src/qxl_driver.c b/src/qxl_driver.c index 0db9221..0394016 100644 --- a/src/qxl_driver.c +++ b/src/qxl_driver.c @@ -133,32 +133,6 @@ qxl_available_options (int chipid, int busid) return DefaultOptions; } -#ifndef XSPICE -static void qxl_wait_for_io_command(qxl_screen_t *qxl) -{ - struct QXLRam *ram_header = qxlhw_pci_get_ram_header(qxl->hw); - - while (!(ram_header->int_pending & QXL_INTERRUPT_IO_CMD)) { - usleep(1); - } - ram_header->int_pending &= ~QXL_INTERRUPT_IO_CMD; -} -#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); diff --git a/src/qxl_surface.c b/src/qxl_surface.c index 8052998..1747dca 100644 --- a/src/qxl_surface.c +++ b/src/qxl_surface.c @@ -51,6 +51,7 @@ #include "qxl.h" #include "qxl_ring.h" #include "qxl_mem.h" +#include "qxlhw.h" #include "qxlhw_pci.h" typedef struct evacuated_surface_t evacuated_surface_t; @@ -298,9 +299,8 @@ qxl_surface_cache_create_primary (surface_cache_t *cache, struct QXLMode *mode) { qxl_screen_t *qxl = cache->qxl; - struct QXLRam *ram_header = qxlhw_pci_get_ram_header(qxl->hw); void *ram = qxlhw_pci_get_ram(qxl->hw); - struct QXLSurfaceCreate *create = &(ram_header->create_surface); + struct QXLSurfaceCreate create; pixman_format_code_t format; uint8_t *dev_addr; pixman_image_t *dev_image, *host_image; @@ -321,16 +321,16 @@ qxl_surface_cache_create_primary (surface_cache_t *cache, return NULL; } - create->width = mode->x_res; - create->height = mode->y_res; - create->stride = - mode->stride; - create->format = mode->bits; - create->position = 0; /* What is this? The Windows driver doesn't use it */ - create->flags = 0; - create->type = QXL_SURF_TYPE_PRIMARY; - create->mem = physical_address (qxl, ram, qxl->main_mem_slot); - - qxl_create_primary(qxl); + create.width = mode->x_res; + create.height = mode->y_res; + create.stride = - mode->stride; + create.format = mode->bits; + create.position = 0; /* What is this? The Windows driver doesn't use it */ + create.flags = 0; + create.type = QXL_SURF_TYPE_PRIMARY; + create.mem = 0; // filled in by qxlhw_create_primary_surface + + qxlhw_create_primary_surface(qxl->hw, &create); dev_addr = (uint8_t *)ram + mode->stride * (mode->y_res - 1); diff --git a/src/qxlhw.c b/src/qxlhw.c index d412c83..9706141 100644 --- a/src/qxlhw.c +++ b/src/qxlhw.c @@ -53,6 +53,11 @@ void *qxlhw_data_alloc(struct qxlhw *base, unsigned long size) return base->data_alloc(base, size); } +void qxlhw_create_primary_surface(struct qxlhw *base, QXLSurfaceCreate *create) +{ + base->create_primary_surface(base, create); +} + void qxlhw_update_area(struct qxlhw *base, int surface_id, struct QXLRect rect) { base->update_area(base, surface_id, rect); diff --git a/src/qxlhw.h b/src/qxlhw.h index 34023d0..741d951 100644 --- a/src/qxlhw.h +++ b/src/qxlhw.h @@ -19,6 +19,7 @@ struct qxlhw { /* memory handling callbacks */ void *(*data_alloc)(struct qxlhw *base, unsigned long size); void (*data_free)(struct qxlhw *base, void *p); + void (*create_primary_surface)(struct qxlhw *base, QXLSurfaceCreate *create); void (*update_area)(struct qxlhw *base, int surface_id, struct QXLRect rect); /* tried to avoid this. but qxl_surface.c wants to check when failing to * find a surface in the free list, which it populates using @@ -33,6 +34,7 @@ void qxlhw_init(struct qxlhw *base, qxl_screen_t *qxl); struct qxlhw *qxlhw_create(qxl_screen_t *qxl, ScrnInfoPtr pScrn); void qxlhw_update_area(struct qxlhw *base, int surface_id, struct QXLRect rect); +void qxlhw_create_primary_surface(struct qxlhw *base, QXLSurfaceCreate *create); /* reset vs device_reset - device_reset is just the io / drm call, * reset does -- what? (definition, not contents) */ diff --git a/src/qxlhw_pci.c b/src/qxlhw_pci.c index 1caf778..ac8b6f8 100644 --- a/src/qxlhw_pci.c +++ b/src/qxlhw_pci.c @@ -571,6 +571,31 @@ static void qxlhw_pci_data_free(struct qxlhw *base, void *p) qxl_free (hw->mem, p); } +static void qxlhw_pci_create_primary_surface(struct qxlhw *base, QXLSurfaceCreate *create) +{ + struct qxlhw_pci *hw = (struct qxlhw_pci *)base; + struct QXLRam *ram_header = (void *)( + (unsigned long)hw->ram + hw->rom->ram_header_offset); +#ifndef XSPICE + qxl_screen_t *qxl = base->qxl; +#endif + + memcpy(&ram_header->create_surface, create, sizeof(*create)); + ram_header->create_surface.mem = + qxlhw_physical_address (hw, hw->ram, hw->main_mem_slot); + +#ifndef XSPICE + if (qxl->pci->revision >= 3) { + qxlhw_pci_ioport_write(hw, QXL_IO_CREATE_PRIMARY_ASYNC, 0); + qxlhw_pci_wait_for_io_command(hw); + } else { + qxlhw_pci_ioport_write(hw, QXL_IO_CREATE_PRIMARY, 0); + } +#else + qxlhw_pci_ioport_write(hw, QXL_IO_CREATE_PRIMARY, 0); +#endif +} + static void qxlhw_pci_update_area(struct qxlhw *base, int surface_id, struct QXLRect rect) { struct qxlhw_pci *hw = (struct qxlhw_pci *)base; @@ -608,6 +633,7 @@ struct qxlhw *create_qxlhw_pci(qxl_screen_t *qxl, ScrnInfoPtr pScrn) base->unmap_memory = qxlhw_pci_unmap_memory; base->data_alloc = qxlhw_pci_data_alloc; base->data_free = qxlhw_pci_data_free; + base->create_primary_surface = qxlhw_pci_create_primary_surface; base->update_area = qxlhw_pci_update_area; return base; } -- 1.7.9.3 _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel