提交 67ff64e0 编写于 作者: P Peter Maydell

Merge remote-tracking branch 'remotes/spice/tags/pull-spice-20150716-1' into staging

qxl: allow to specify head limit to qxl driver

# gpg: Signature made Thu Jul 16 16:31:40 2015 BST using RSA key ID D3E87138
# gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
# gpg:                 aka "Gerd Hoffmann <gerd@kraxel.org>"
# gpg:                 aka "Gerd Hoffmann (private) <kraxel@gmail.com>"

* remotes/spice/tags/pull-spice-20150716-1:
  qxl: allow to specify head limit to qxl driver
Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
...@@ -271,6 +271,12 @@ static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay) ...@@ -271,6 +271,12 @@ static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay)
QXL_COOKIE_TYPE_POST_LOAD_MONITORS_CONFIG, QXL_COOKIE_TYPE_POST_LOAD_MONITORS_CONFIG,
0)); 0));
} else { } else {
#if SPICE_SERVER_VERSION >= 0x000c06 /* release 0.12.6 */
if (qxl->max_outputs) {
spice_qxl_set_monitors_config_limit(&qxl->ssd.qxl,
qxl->max_outputs);
}
#endif
qxl->guest_monitors_config = qxl->ram->monitors_config; qxl->guest_monitors_config = qxl->ram->monitors_config;
spice_qxl_monitors_config_async(&qxl->ssd.qxl, spice_qxl_monitors_config_async(&qxl->ssd.qxl,
qxl->ram->monitors_config, qxl->ram->monitors_config,
...@@ -991,6 +997,7 @@ static int interface_client_monitors_config(QXLInstance *sin, ...@@ -991,6 +997,7 @@ static int interface_client_monitors_config(QXLInstance *sin,
PCIQXLDevice *qxl = container_of(sin, PCIQXLDevice, ssd.qxl); PCIQXLDevice *qxl = container_of(sin, PCIQXLDevice, ssd.qxl);
QXLRom *rom = memory_region_get_ram_ptr(&qxl->rom_bar); QXLRom *rom = memory_region_get_ram_ptr(&qxl->rom_bar);
int i; int i;
unsigned max_outputs = ARRAY_SIZE(rom->client_monitors_config.heads);
if (qxl->revision < 4) { if (qxl->revision < 4) {
trace_qxl_client_monitors_config_unsupported_by_device(qxl->id, trace_qxl_client_monitors_config_unsupported_by_device(qxl->id,
...@@ -1013,17 +1020,23 @@ static int interface_client_monitors_config(QXLInstance *sin, ...@@ -1013,17 +1020,23 @@ static int interface_client_monitors_config(QXLInstance *sin,
if (!monitors_config) { if (!monitors_config) {
return 1; return 1;
} }
#if SPICE_SERVER_VERSION >= 0x000c06 /* release 0.12.6 */
/* limit number of outputs based on setting limit */
if (qxl->max_outputs && qxl->max_outputs <= max_outputs) {
max_outputs = qxl->max_outputs;
}
#endif
memset(&rom->client_monitors_config, 0, memset(&rom->client_monitors_config, 0,
sizeof(rom->client_monitors_config)); sizeof(rom->client_monitors_config));
rom->client_monitors_config.count = monitors_config->num_of_monitors; rom->client_monitors_config.count = monitors_config->num_of_monitors;
/* monitors_config->flags ignored */ /* monitors_config->flags ignored */
if (rom->client_monitors_config.count >= if (rom->client_monitors_config.count >= max_outputs) {
ARRAY_SIZE(rom->client_monitors_config.heads)) {
trace_qxl_client_monitors_config_capped(qxl->id, trace_qxl_client_monitors_config_capped(qxl->id,
monitors_config->num_of_monitors, monitors_config->num_of_monitors,
ARRAY_SIZE(rom->client_monitors_config.heads)); max_outputs);
rom->client_monitors_config.count = rom->client_monitors_config.count = max_outputs;
ARRAY_SIZE(rom->client_monitors_config.heads);
} }
for (i = 0 ; i < rom->client_monitors_config.count ; ++i) { for (i = 0 ; i < rom->client_monitors_config.count ; ++i) {
VDAgentMonConfig *monitor = &monitors_config->monitors[i]; VDAgentMonConfig *monitor = &monitors_config->monitors[i];
...@@ -2274,6 +2287,9 @@ static Property qxl_properties[] = { ...@@ -2274,6 +2287,9 @@ static Property qxl_properties[] = {
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_INT32("surfaces", PCIQXLDevice, ssd.num_surfaces, 1024),
#if SPICE_SERVER_VERSION >= 0x000c06 /* release 0.12.6 */
DEFINE_PROP_UINT16("max_outputs", PCIQXLDevice, max_outputs, 0),
#endif
DEFINE_PROP_END_OF_LIST(), DEFINE_PROP_END_OF_LIST(),
}; };
......
...@@ -99,6 +99,9 @@ typedef struct PCIQXLDevice { ...@@ -99,6 +99,9 @@ typedef struct PCIQXLDevice {
QXLModes *modes; QXLModes *modes;
uint32_t rom_size; uint32_t rom_size;
MemoryRegion rom_bar; MemoryRegion rom_bar;
#if SPICE_SERVER_VERSION >= 0x000c06 /* release 0.12.6 */
uint16_t max_outputs;
#endif
/* vram pci bar */ /* vram pci bar */
uint32_t vram_size; uint32_t vram_size;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册