1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-20 07:59:00 +00:00

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

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

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

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

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

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

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