QEMU on S390 (since v2.11) can support the virtio-gpu-ccw device,
which can be used as a video device.
Signed-off-by: Farhan Ali <alifm(a)linux.vnet.ibm.com>
---
docs/formatdomain.html.in | 3 +++
src/qemu/qemu_command.c | 13 ++++++++++--
src/qemu/qemu_domain_address.c | 12 ++++++++++--
src/qemu/qemu_process.c | 5 ++++-
tests/qemuxml2argvdata/video-virtio-gpu-ccw.args | 25 ++++++++++++++++++++++++
tests/qemuxml2argvtest.c | 7 +++++++
6 files changed, 60 insertions(+), 5 deletions(-)
create mode 100644 tests/qemuxml2argvdata/video-virtio-gpu-ccw.args
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 6fd2189..0908709 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -6484,6 +6484,9 @@ qemu-kvm -net nic,model=? /dev/null
<dd>
The optional <code>address</code> sub-element can be used to
tie the video device to a particular PCI slot.
+ On S390, <code>address</code> can be used to provide the
+ CCW address for the video device (<span class="since">
+ since 4.2.0</span>).
</dd>
<dt><code>driver</code></dt>
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index a8afbd1..5882637 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -132,7 +132,7 @@ VIR_ENUM_IMPL(qemuDeviceVideoSecondary, VIR_DOMAIN_VIDEO_TYPE_LAST,
"", /* don't support vbox */
"qxl",
"", /* don't support parallels */
- "virtio-gpu-pci",
+ "virtio-gpu",
"" /* don't support gop */);
VIR_ENUM_DECL(qemuSoundCodec)
@@ -4296,7 +4296,16 @@ qemuBuildDeviceVideoStr(const virDomainDef *def,
goto error;
}
- virBufferAsprintf(&buf, "%s,id=%s", model, video->info.alias);
+ if (STREQ(model, "virtio-gpu")) {
+ if (video->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW)
+ virBufferAsprintf(&buf, "%s-ccw", model);
+ else
+ virBufferAsprintf(&buf, "%s-pci", model);
+ } else {
+ virBufferAsprintf(&buf, "%s", model);
+ }
+
+ virBufferAsprintf(&buf, ",id=%s", video->info.alias);
if (video->accel && video->accel->accel3d == VIR_TRISTATE_SWITCH_ON)
{
virBufferAsprintf(&buf, ",virgl=%s",
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index 2551706..37473eb 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -287,8 +287,8 @@ qemuDomainPrimeVirtioDeviceAddresses(virDomainDefPtr def,
{
/*
declare address-less virtio devices to be of address type 'type'
- disks, networks, consoles, controllers, memballoon and rng in this
- order
+ disks, networks, videos, consoles, controllers, memballoon and rng
+ in this order
if type is ccw filesystem devices are declared to be of address type ccw
*/
size_t i;
@@ -308,6 +308,14 @@ qemuDomainPrimeVirtioDeviceAddresses(virDomainDefPtr def,
}
}
+ for (i = 0; i < def->nvideos; i++) {
+ virDomainVideoDefPtr video = def->videos[i];
+
+ if (video->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
+ video->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO)
+ video->info.type = type;
+ }
+
for (i = 0; i < def->ninputs; i++) {
if (def->inputs[i]->bus == VIR_DOMAIN_INPUT_BUS_VIRTIO &&
def->inputs[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 57c06c7..1afb71f 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -4778,7 +4778,10 @@ qemuProcessStartValidateVideo(virDomainObjPtr vm,
(video->type == VIR_DOMAIN_VIDEO_TYPE_QXL &&
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QXL)) ||
(video->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO &&
- !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_GPU))) {
+ !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_GPU)) ||
+ (video->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO &&
+ video->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW &&
+ !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_GPU_CCW))) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("this QEMU does not support '%s' video
device"),
virDomainVideoTypeToString(video->type));
diff --git a/tests/qemuxml2argvdata/video-virtio-gpu-ccw.args
b/tests/qemuxml2argvdata/video-virtio-gpu-ccw.args
new file mode 100644
index 0000000..e5e8854
--- /dev/null
+++ b/tests/qemuxml2argvdata/video-virtio-gpu-ccw.args
@@ -0,0 +1,25 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=none \
+/usr/bin/qemu-system-s390x \
+-name QEMUGuest1 \
+-S \
+-M s390-ccw-virtio \
+-m 214 \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1803 \
+-nodefaults \
+-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
+server,nowait \
+-mon chardev=charmonitor,id=monitor,mode=readline \
+-boot c \
+-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-virtio-disk0 \
+-device virtio-blk-ccw,devno=fe.0.0000,drive=drive-virtio-disk0,\
+id=virtio-disk0 \
+-vnc 127.0.0.1:0 \
+-device virtio-gpu-ccw,id=video0,max_outputs=1,devno=fe.0.0002 \
+-device virtio-gpu-ccw,id=video1,max_outputs=1,devno=fe.0.0003 \
+-device virtio-balloon-ccw,id=balloon0,devno=fe.0.0001
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 5ece3f0..d9ae3ee 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -3007,6 +3007,13 @@ mymain(void)
DO_TEST("disk-many-format-probing", QEMU_CAPS_DRIVE_BOOT);
driver.config->allowDiskFormatProbing = false;
+ DO_TEST("video-virtio-gpu-ccw", QEMU_CAPS_VIRTIO_CCW,
+ QEMU_CAPS_DEVICE_VIRTIO_GPU,
+ QEMU_CAPS_DEVICE_VIDEO_PRIMARY,
+ QEMU_CAPS_VIRTIO_GPU_MAX_OUTPUTS,
+ QEMU_CAPS_VNC,
+ QEMU_CAPS_DEVICE_VIRTIO_GPU_CCW);
+
if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
virFileDeleteTree(fakerootdir);
--
2.7.4