spice: make number of surfaces runtime-configurable.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
		
							parent
							
								
									2e0e3c399a
								
							
						
					
					
						commit
						ddd8fdc78e
					
				
							
								
								
									
										29
									
								
								hw/qxl.c
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								hw/qxl.c
									
									
									
									
									
								
							@ -236,7 +236,8 @@ static void qxl_spice_destroy_surfaces_complete(PCIQXLDevice *qxl)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    trace_qxl_spice_destroy_surfaces_complete(qxl->id);
 | 
					    trace_qxl_spice_destroy_surfaces_complete(qxl->id);
 | 
				
			||||||
    qemu_mutex_lock(&qxl->track_lock);
 | 
					    qemu_mutex_lock(&qxl->track_lock);
 | 
				
			||||||
    memset(&qxl->guest_surfaces.cmds, 0, sizeof(qxl->guest_surfaces.cmds));
 | 
					    memset(qxl->guest_surfaces.cmds, 0,
 | 
				
			||||||
 | 
					           sizeof(qxl->guest_surfaces.cmds) * qxl->ssd.num_surfaces);
 | 
				
			||||||
    qxl->guest_surfaces.count = 0;
 | 
					    qxl->guest_surfaces.count = 0;
 | 
				
			||||||
    qemu_mutex_unlock(&qxl->track_lock);
 | 
					    qemu_mutex_unlock(&qxl->track_lock);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -345,7 +346,7 @@ static void init_qxl_rom(PCIQXLDevice *d)
 | 
				
			|||||||
    rom->slot_id_bits  = MEMSLOT_SLOT_BITS;
 | 
					    rom->slot_id_bits  = MEMSLOT_SLOT_BITS;
 | 
				
			||||||
    rom->slots_start   = 1;
 | 
					    rom->slots_start   = 1;
 | 
				
			||||||
    rom->slots_end     = NUM_MEMSLOTS - 1;
 | 
					    rom->slots_end     = NUM_MEMSLOTS - 1;
 | 
				
			||||||
    rom->n_surfaces    = cpu_to_le32(NUM_SURFACES);
 | 
					    rom->n_surfaces    = cpu_to_le32(d->ssd.num_surfaces);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0, n = 0; i < ARRAY_SIZE(qxl_modes); i++) {
 | 
					    for (i = 0, n = 0; i < ARRAY_SIZE(qxl_modes); i++) {
 | 
				
			||||||
        fb = qxl_modes[i].y_res * qxl_modes[i].stride;
 | 
					        fb = qxl_modes[i].y_res * qxl_modes[i].stride;
 | 
				
			||||||
@ -449,9 +450,9 @@ static int qxl_track_command(PCIQXLDevice *qxl, struct QXLCommandExt *ext)
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        uint32_t id = le32_to_cpu(cmd->surface_id);
 | 
					        uint32_t id = le32_to_cpu(cmd->surface_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (id >= NUM_SURFACES) {
 | 
					        if (id >= qxl->ssd.num_surfaces) {
 | 
				
			||||||
            qxl_set_guest_bug(qxl, "QXL_CMD_SURFACE id %d >= %d", id,
 | 
					            qxl_set_guest_bug(qxl, "QXL_CMD_SURFACE id %d >= %d", id,
 | 
				
			||||||
                              NUM_SURFACES);
 | 
					                              qxl->ssd.num_surfaces);
 | 
				
			||||||
            return 1;
 | 
					            return 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        qemu_mutex_lock(&qxl->track_lock);
 | 
					        qemu_mutex_lock(&qxl->track_lock);
 | 
				
			||||||
@ -527,7 +528,7 @@ static void interface_get_init_info(QXLInstance *sin, QXLDevInitInfo *info)
 | 
				
			|||||||
    info->num_memslots_groups = NUM_MEMSLOTS_GROUPS;
 | 
					    info->num_memslots_groups = NUM_MEMSLOTS_GROUPS;
 | 
				
			||||||
    info->internal_groupslot_id = 0;
 | 
					    info->internal_groupslot_id = 0;
 | 
				
			||||||
    info->qxl_ram_size = le32_to_cpu(qxl->shadow_rom.num_pages) << TARGET_PAGE_BITS;
 | 
					    info->qxl_ram_size = le32_to_cpu(qxl->shadow_rom.num_pages) << TARGET_PAGE_BITS;
 | 
				
			||||||
    info->n_surfaces = NUM_SURFACES;
 | 
					    info->n_surfaces = qxl->ssd.num_surfaces;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const char *qxl_mode_to_string(int mode)
 | 
					static const char *qxl_mode_to_string(int mode)
 | 
				
			||||||
@ -1436,7 +1437,7 @@ async_common:
 | 
				
			|||||||
        QXLCookie *cookie = NULL;
 | 
					        QXLCookie *cookie = NULL;
 | 
				
			||||||
        QXLRect update = d->ram->update_area;
 | 
					        QXLRect update = d->ram->update_area;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (d->ram->update_surface > NUM_SURFACES) {
 | 
					        if (d->ram->update_surface > d->ssd.num_surfaces) {
 | 
				
			||||||
            qxl_set_guest_bug(d, "QXL_IO_UPDATE_AREA: invalid surface id %d\n",
 | 
					            qxl_set_guest_bug(d, "QXL_IO_UPDATE_AREA: invalid surface id %d\n",
 | 
				
			||||||
                              d->ram->update_surface);
 | 
					                              d->ram->update_surface);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@ -1529,7 +1530,7 @@ async_common:
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case QXL_IO_DESTROY_SURFACE_WAIT:
 | 
					    case QXL_IO_DESTROY_SURFACE_WAIT:
 | 
				
			||||||
        if (val >= NUM_SURFACES) {
 | 
					        if (val >= d->ssd.num_surfaces) {
 | 
				
			||||||
            qxl_set_guest_bug(d, "QXL_IO_DESTROY_SURFACE (async=%d):"
 | 
					            qxl_set_guest_bug(d, "QXL_IO_DESTROY_SURFACE (async=%d):"
 | 
				
			||||||
                             "%" PRIu64 " >= NUM_SURFACES", async, val);
 | 
					                             "%" PRIu64 " >= NUM_SURFACES", async, val);
 | 
				
			||||||
            goto cancel_async;
 | 
					            goto cancel_async;
 | 
				
			||||||
@ -1707,7 +1708,7 @@ static void qxl_dirty_surfaces(PCIQXLDevice *qxl)
 | 
				
			|||||||
    vram_start =  (intptr_t)memory_region_get_ram_ptr(&qxl->vram_bar);
 | 
					    vram_start =  (intptr_t)memory_region_get_ram_ptr(&qxl->vram_bar);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* dirty the off-screen surfaces */
 | 
					    /* dirty the off-screen surfaces */
 | 
				
			||||||
    for (i = 0; i < NUM_SURFACES; i++) {
 | 
					    for (i = 0; i < qxl->ssd.num_surfaces; i++) {
 | 
				
			||||||
        QXLSurfaceCmd *cmd;
 | 
					        QXLSurfaceCmd *cmd;
 | 
				
			||||||
        intptr_t surface_offset;
 | 
					        intptr_t surface_offset;
 | 
				
			||||||
        int surface_size;
 | 
					        int surface_size;
 | 
				
			||||||
@ -1835,7 +1836,6 @@ static int qxl_init_common(PCIQXLDevice *qxl)
 | 
				
			|||||||
    qxl->mode = QXL_MODE_UNDEFINED;
 | 
					    qxl->mode = QXL_MODE_UNDEFINED;
 | 
				
			||||||
    qxl->generation = 1;
 | 
					    qxl->generation = 1;
 | 
				
			||||||
    qxl->num_memslots = NUM_MEMSLOTS;
 | 
					    qxl->num_memslots = NUM_MEMSLOTS;
 | 
				
			||||||
    qxl->num_surfaces = NUM_SURFACES;
 | 
					 | 
				
			||||||
    qemu_mutex_init(&qxl->track_lock);
 | 
					    qemu_mutex_init(&qxl->track_lock);
 | 
				
			||||||
    qemu_mutex_init(&qxl->async_lock);
 | 
					    qemu_mutex_init(&qxl->async_lock);
 | 
				
			||||||
    qxl->current_async = QXL_UNDEFINED_IO;
 | 
					    qxl->current_async = QXL_UNDEFINED_IO;
 | 
				
			||||||
@ -1877,6 +1877,7 @@ static int qxl_init_common(PCIQXLDevice *qxl)
 | 
				
			|||||||
    init_qxl_rom(qxl);
 | 
					    init_qxl_rom(qxl);
 | 
				
			||||||
    init_qxl_ram(qxl);
 | 
					    init_qxl_ram(qxl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qxl->guest_surfaces.cmds = g_new0(QXLPHYSICAL, qxl->ssd.num_surfaces);
 | 
				
			||||||
    memory_region_init_ram(&qxl->vram_bar, "qxl.vram", qxl->vram_size);
 | 
					    memory_region_init_ram(&qxl->vram_bar, "qxl.vram", qxl->vram_size);
 | 
				
			||||||
    vmstate_register_ram(&qxl->vram_bar, &qxl->pci.qdev);
 | 
					    vmstate_register_ram(&qxl->vram_bar, &qxl->pci.qdev);
 | 
				
			||||||
    memory_region_init_alias(&qxl->vram32_bar, "qxl.vram32", &qxl->vram_bar,
 | 
					    memory_region_init_alias(&qxl->vram32_bar, "qxl.vram32", &qxl->vram_bar,
 | 
				
			||||||
@ -2042,8 +2043,8 @@ static int qxl_post_load(void *opaque, int version)
 | 
				
			|||||||
        qxl_create_guest_primary(d, 1, QXL_SYNC);
 | 
					        qxl_create_guest_primary(d, 1, QXL_SYNC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* replay surface-create and cursor-set commands */
 | 
					        /* replay surface-create and cursor-set commands */
 | 
				
			||||||
        cmds = g_malloc0(sizeof(QXLCommandExt) * (NUM_SURFACES + 1));
 | 
					        cmds = g_malloc0(sizeof(QXLCommandExt) * (d->ssd.num_surfaces + 1));
 | 
				
			||||||
        for (in = 0, out = 0; in < NUM_SURFACES; in++) {
 | 
					        for (in = 0, out = 0; in < d->ssd.num_surfaces; in++) {
 | 
				
			||||||
            if (d->guest_surfaces.cmds[in] == 0) {
 | 
					            if (d->guest_surfaces.cmds[in] == 0) {
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -2143,8 +2144,9 @@ static VMStateDescription qxl_vmstate = {
 | 
				
			|||||||
                             qxl_memslot, struct guest_slots),
 | 
					                             qxl_memslot, struct guest_slots),
 | 
				
			||||||
        VMSTATE_STRUCT(guest_primary.surface, PCIQXLDevice, 0,
 | 
					        VMSTATE_STRUCT(guest_primary.surface, PCIQXLDevice, 0,
 | 
				
			||||||
                       qxl_surface, QXLSurfaceCreate),
 | 
					                       qxl_surface, QXLSurfaceCreate),
 | 
				
			||||||
        VMSTATE_INT32_EQUAL(num_surfaces, PCIQXLDevice),
 | 
					        VMSTATE_INT32_EQUAL(ssd.num_surfaces, PCIQXLDevice),
 | 
				
			||||||
        VMSTATE_ARRAY(guest_surfaces.cmds, PCIQXLDevice, NUM_SURFACES, 0,
 | 
					        VMSTATE_VARRAY_INT32(guest_surfaces.cmds, PCIQXLDevice,
 | 
				
			||||||
 | 
					                             ssd.num_surfaces, 0,
 | 
				
			||||||
                             vmstate_info_uint64, uint64_t),
 | 
					                             vmstate_info_uint64, uint64_t),
 | 
				
			||||||
        VMSTATE_UINT64(guest_cursor, PCIQXLDevice),
 | 
					        VMSTATE_UINT64(guest_cursor, PCIQXLDevice),
 | 
				
			||||||
        VMSTATE_END_OF_LIST()
 | 
					        VMSTATE_END_OF_LIST()
 | 
				
			||||||
@ -2173,6 +2175,7 @@ static Property qxl_properties[] = {
 | 
				
			|||||||
        DEFINE_PROP_UINT32("vram_size_mb", PCIQXLDevice, vram32_size_mb, -1),
 | 
					        DEFINE_PROP_UINT32("vram_size_mb", PCIQXLDevice, vram32_size_mb, -1),
 | 
				
			||||||
        DEFINE_PROP_UINT32("vram64_size_mb", PCIQXLDevice, vram_size_mb, -1),
 | 
					        DEFINE_PROP_UINT32("vram64_size_mb", PCIQXLDevice, vram_size_mb, -1),
 | 
				
			||||||
        DEFINE_PROP_UINT32("vgamem_mb", PCIQXLDevice, vgamem_size_mb, 16),
 | 
					        DEFINE_PROP_UINT32("vgamem_mb", PCIQXLDevice, vgamem_size_mb, 16),
 | 
				
			||||||
 | 
					        DEFINE_PROP_INT32("surfaces", PCIQXLDevice, ssd.num_surfaces, 1024),
 | 
				
			||||||
        DEFINE_PROP_END_OF_LIST(),
 | 
					        DEFINE_PROP_END_OF_LIST(),
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										3
									
								
								hw/qxl.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								hw/qxl.h
									
									
									
									
									
								
							@ -40,7 +40,6 @@ typedef struct PCIQXLDevice {
 | 
				
			|||||||
    uint32_t           revision;
 | 
					    uint32_t           revision;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int32_t            num_memslots;
 | 
					    int32_t            num_memslots;
 | 
				
			||||||
    int32_t            num_surfaces;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uint32_t           current_async;
 | 
					    uint32_t           current_async;
 | 
				
			||||||
    QemuMutex          async_lock;
 | 
					    QemuMutex          async_lock;
 | 
				
			||||||
@ -65,7 +64,7 @@ typedef struct PCIQXLDevice {
 | 
				
			|||||||
    } guest_primary;
 | 
					    } guest_primary;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    struct surfaces {
 | 
					    struct surfaces {
 | 
				
			||||||
        QXLPHYSICAL    cmds[NUM_SURFACES];
 | 
					        QXLPHYSICAL    *cmds;
 | 
				
			||||||
        uint32_t       count;
 | 
					        uint32_t       count;
 | 
				
			||||||
        uint32_t       max;
 | 
					        uint32_t       max;
 | 
				
			||||||
    } guest_surfaces;
 | 
					    } guest_surfaces;
 | 
				
			||||||
 | 
				
			|||||||
@ -317,6 +317,9 @@ void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd, DisplayState *ds)
 | 
				
			|||||||
    qemu_mutex_init(&ssd->lock);
 | 
					    qemu_mutex_init(&ssd->lock);
 | 
				
			||||||
    ssd->mouse_x = -1;
 | 
					    ssd->mouse_x = -1;
 | 
				
			||||||
    ssd->mouse_y = -1;
 | 
					    ssd->mouse_y = -1;
 | 
				
			||||||
 | 
					    if (ssd->num_surfaces == 0) {
 | 
				
			||||||
 | 
					        ssd->num_surfaces = 1024;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    ssd->bufsize = (16 * 1024 * 1024);
 | 
					    ssd->bufsize = (16 * 1024 * 1024);
 | 
				
			||||||
    ssd->buf = g_malloc(ssd->bufsize);
 | 
					    ssd->buf = g_malloc(ssd->bufsize);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -427,7 +430,7 @@ static void interface_get_init_info(QXLInstance *sin, QXLDevInitInfo *info)
 | 
				
			|||||||
    info->num_memslots_groups = NUM_MEMSLOTS_GROUPS;
 | 
					    info->num_memslots_groups = NUM_MEMSLOTS_GROUPS;
 | 
				
			||||||
    info->internal_groupslot_id = 0;
 | 
					    info->internal_groupslot_id = 0;
 | 
				
			||||||
    info->qxl_ram_size = ssd->bufsize;
 | 
					    info->qxl_ram_size = ssd->bufsize;
 | 
				
			||||||
    info->n_surfaces = NUM_SURFACES;
 | 
					    info->n_surfaces = ssd->num_surfaces;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int interface_get_command(QXLInstance *sin, struct QXLCommandExt *ext)
 | 
					static int interface_get_command(QXLInstance *sin, struct QXLCommandExt *ext)
 | 
				
			||||||
 | 
				
			|||||||
@ -32,8 +32,6 @@
 | 
				
			|||||||
#define MEMSLOT_GROUP_GUEST 1
 | 
					#define MEMSLOT_GROUP_GUEST 1
 | 
				
			||||||
#define NUM_MEMSLOTS_GROUPS 2
 | 
					#define NUM_MEMSLOTS_GROUPS 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NUM_SURFACES 1024
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Internal enum to differenciate between options for
 | 
					 * Internal enum to differenciate between options for
 | 
				
			||||||
 * io calls that have a sync (old) version and an _async (new)
 | 
					 * io calls that have a sync (old) version and an _async (new)
 | 
				
			||||||
@ -80,6 +78,7 @@ struct SimpleSpiceDisplay {
 | 
				
			|||||||
    QXLInstance qxl;
 | 
					    QXLInstance qxl;
 | 
				
			||||||
    uint32_t unique;
 | 
					    uint32_t unique;
 | 
				
			||||||
    QemuPfConv *conv;
 | 
					    QemuPfConv *conv;
 | 
				
			||||||
 | 
					    int32_t num_surfaces;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QXLRect dirty;
 | 
					    QXLRect dirty;
 | 
				
			||||||
    int notify;
 | 
					    int notify;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user