qemu: Add support for virtio-gpu-ccw video device on S390

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@linux.vnet.ibm.com>
This commit is contained in:
Farhan Ali 2018-03-23 13:22:39 -04:00 committed by Ján Tomko
parent a6441402a5
commit 4bbf7f8cb5
6 changed files with 60 additions and 5 deletions

View File

@ -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>

View File

@ -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",

View File

@ -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)

View File

@ -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));

View File

@ -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

View File

@ -3008,6 +3008,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);