提交 ddd8fdc7 编写于 作者: G Gerd Hoffmann

spice: make number of surfaces runtime-configurable.

Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
上级 2e0e3c39
...@@ -236,7 +236,8 @@ static void qxl_spice_destroy_surfaces_complete(PCIQXLDevice *qxl) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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: ...@@ -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: ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 = { ...@@ -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[] = { ...@@ -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(),
}; };
......
...@@ -40,7 +40,6 @@ typedef struct PCIQXLDevice { ...@@ -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 { ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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 { ...@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册