9c6c51
From 5ad0f7cc1b2444ee9355229316fb008919d22c71 Mon Sep 17 00:00:00 2001
9c6c51
Message-Id: <5ad0f7cc1b2444ee9355229316fb008919d22c71@dist-git>
9c6c51
From: Erik Skultety <eskultet@redhat.com>
9c6c51
Date: Thu, 19 Jul 2018 15:04:02 +0200
9c6c51
Subject: [PATCH] conf: Introduce new <hostdev> attribute 'display'
9c6c51
MIME-Version: 1.0
9c6c51
Content-Type: text/plain; charset=UTF-8
9c6c51
Content-Transfer-Encoding: 8bit
9c6c51
9c6c51
QEMU 2.12 introduced a new type of display for mediated devices using
9c6c51
vfio-pci backend which allows a mediated device to be used as a VGA
9c6c51
compatible device as an alternative to an emulated video device. QEMU
9c6c51
exposes this feature via a vfio device property 'display' with supported
9c6c51
values 'on/off/auto' (libvirt will default to 'off').
9c6c51
9c6c51
This patch adds the necessary bits to domain config handling in order to
9c6c51
expose this feature. Since there's no convenient way for libvirt to come
9c6c51
up with usable defaults for the display setting, simply because libvirt
9c6c51
is not able to figure out which of the display implementations - dma-buf
9c6c51
which requires OpenGL support vs vfio regions which doesn't need OpenGL
9c6c51
(works with OpenGL enabled too) - the underlying mdev uses.
9c6c51
9c6c51
Reviewed-by: Ján Tomko <jtomko@redhat.com>
9c6c51
Signed-off-by: Erik Skultety <eskultet@redhat.com>
9c6c51
(cherry picked from commit d54e45b6edd7623e488a19e30bc4148a21fa8b03)
9c6c51
9c6c51
https://bugzilla.redhat.com/show_bug.cgi?id=1475770
9c6c51
Signed-off-by: Erik Skultety <eskultet@redhat.com>
9c6c51
Reviewed-by: Ján Tomko <jtomko@redhat.com>
9c6c51
---
9c6c51
 docs/formatdomain.html.in                     | 20 +++-
9c6c51
 docs/schemas/domaincommon.rng                 |  5 +
9c6c51
 src/conf/domain_conf.c                        | 19 +++-
9c6c51
 src/conf/domain_conf.h                        |  1 +
9c6c51
 src/qemu/qemu_domain.c                        | 98 ++++++++++++++++++-
9c6c51
 .../qemuxml2argvdata/hostdev-mdev-display.xml | 39 ++++++++
9c6c51
 .../hostdev-mdev-display.xml                  | 47 +++++++++
9c6c51
 tests/qemuxml2xmltest.c                       |  1 +
9c6c51
 8 files changed, 222 insertions(+), 8 deletions(-)
9c6c51
 create mode 100644 tests/qemuxml2argvdata/hostdev-mdev-display.xml
9c6c51
 create mode 100644 tests/qemuxml2xmloutdata/hostdev-mdev-display.xml
9c6c51
9c6c51
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
9c6c51
index 9dd22554ad..3554c3dc30 100644
9c6c51
--- a/docs/formatdomain.html.in
9c6c51
+++ b/docs/formatdomain.html.in
9c6c51
@@ -4510,9 +4510,23 @@
9c6c51
           guest. Currently, model='vfio-pci' and
9c6c51
           model='vfio-ccw' (Since 4.4.0)
9c6c51
           is supported. Refer MDEV to create
9c6c51
-          a mediated device on the host. There are also some implications on the
9c6c51
-          usage of guest's address type depending on the model
9c6c51
-          attribute, see the address element below.
9c6c51
+          a mediated device on the host.
9c6c51
+          Since 4.6.0 (QEMU 2.12) an optional
9c6c51
+          display attribute may be used to enable or disable
9c6c51
+          support for an accelerated remote desktop backed by a mediated
9c6c51
+          device (such as NVIDIA vGPU or Intel GVT-g) as an alternative to
9c6c51
+          emulated video devices. This attribute
9c6c51
+          is limited to model='vfio-pci' only. Supported values
9c6c51
+          are either on or off (default is 'off').
9c6c51
+          It is required to use a
9c6c51
+          graphical framebuffer in order to
9c6c51
+          use this attribute, currently only supported with VNC, Spice and
9c6c51
+          egl-headless graphics devices.
9c6c51
+          

9c6c51
+            Note: There are also some implications on the usage of guest's
9c6c51
+            address type depending on the model attribute,
9c6c51
+            see the address element below.
9c6c51
+          

9c6c51
           
9c6c51
         
9c6c51
         

9c6c51
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
9c6c51
index 157726752c..be8430ab22 100644
9c6c51
--- a/docs/schemas/domaincommon.rng
9c6c51
+++ b/docs/schemas/domaincommon.rng
9c6c51
@@ -4579,6 +4579,11 @@
9c6c51
         <value>vfio-ccw</value>
9c6c51
       </choice>
9c6c51
     </attribute>
9c6c51
+    <optional>
9c6c51
+      <attribute name="display">
9c6c51
+        <ref name="virOnOff"/>
9c6c51
+      </attribute>
9c6c51
+    </optional>
9c6c51
     <element name="source">
9c6c51
       <ref name="mdevaddress"/>
9c6c51
     </element>
9c6c51
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
9c6c51
index 72086f9e86..830c298158 100644
9c6c51
--- a/src/conf/domain_conf.c
9c6c51
+++ b/src/conf/domain_conf.c
9c6c51
@@ -7656,6 +7656,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
9c6c51
     char *rawio = NULL;
9c6c51
     char *backendStr = NULL;
9c6c51
     char *model = NULL;
9c6c51
+    char *display = NULL;
9c6c51
     int backend;
9c6c51
     int ret = -1;
9c6c51
     virDomainHostdevSubsysPCIPtr pcisrc = &def->source.subsys.u.pci;
9c6c51
@@ -7675,6 +7676,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
9c6c51
     sgio = virXMLPropString(node, "sgio");
9c6c51
     rawio = virXMLPropString(node, "rawio");
9c6c51
     model = virXMLPropString(node, "model");
9c6c51
+    display = virXMLPropString(node, "display");
9c6c51
 
9c6c51
     /* @type is passed in from the caller rather than read from the
9c6c51
      * xml document, because it is specified in different places for
9c6c51
@@ -7762,6 +7764,15 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
9c6c51
                            model);
9c6c51
             goto cleanup;
9c6c51
         }
9c6c51
+
9c6c51
+        if (display &&
9c6c51
+            (mdevsrc->display = virTristateSwitchTypeFromString(display)) <= 0) {
9c6c51
+            virReportError(VIR_ERR_XML_ERROR,
9c6c51
+                           _("unknown value '%s' for <hostdev> attribute "
9c6c51
+                             "'display'"),
9c6c51
+                           display);
9c6c51
+            goto cleanup;
9c6c51
+        }
9c6c51
     }
9c6c51
 
9c6c51
     switch (def->source.subsys.type) {
9c6c51
@@ -7815,6 +7826,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
9c6c51
     VIR_FREE(rawio);
9c6c51
     VIR_FREE(backendStr);
9c6c51
     VIR_FREE(model);
9c6c51
+    VIR_FREE(display);
9c6c51
     return ret;
9c6c51
 }
9c6c51
 
9c6c51
@@ -26568,9 +26580,14 @@ virDomainHostdevDefFormat(virBufferPtr buf,
9c6c51
                               virTristateBoolTypeToString(scsisrc->rawio));
9c6c51
         }
9c6c51
 
9c6c51
-        if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV)
9c6c51
+        if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV) {
9c6c51
             virBufferAsprintf(buf, " model='%s'",
9c6c51
                               virMediatedDeviceModelTypeToString(mdevsrc->model));
9c6c51
+            if (mdevsrc->display != VIR_TRISTATE_SWITCH_ABSENT)
9c6c51
+                virBufferAsprintf(buf, " display='%s'",
9c6c51
+                                  virTristateSwitchTypeToString(mdevsrc->display));
9c6c51
+        }
9c6c51
+
9c6c51
     }
9c6c51
     virBufferAddLit(buf, ">\n");
9c6c51
     virBufferAdjustIndent(buf, 2);
9c6c51
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
9c6c51
index 3deda1d978..8ca9558ceb 100644
9c6c51
--- a/src/conf/domain_conf.h
9c6c51
+++ b/src/conf/domain_conf.h
9c6c51
@@ -382,6 +382,7 @@ typedef struct _virDomainHostdevSubsysMediatedDev virDomainHostdevSubsysMediated
9c6c51
 typedef virDomainHostdevSubsysMediatedDev *virDomainHostdevSubsysMediatedDevPtr;
9c6c51
 struct _virDomainHostdevSubsysMediatedDev {
9c6c51
     int model;                          /* enum virMediatedDeviceModelType */
9c6c51
+    int display; /* virTristateSwitch */
9c6c51
     char uuidstr[VIR_UUID_STRING_BUFLEN];   /* mediated device's uuid string */
9c6c51
 };
9c6c51
 
9c6c51
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
9c6c51
index 9498594857..5337f1ce55 100644
9c6c51
--- a/src/qemu/qemu_domain.c
9c6c51
+++ b/src/qemu/qemu_domain.c
9c6c51
@@ -4451,9 +4451,48 @@ qemuDomainDeviceDefValidateNetwork(const virDomainNetDef *net)
9c6c51
 
9c6c51
 
9c6c51
 static int
9c6c51
-qemuDomainDeviceDefValidateHostdev(const virDomainHostdevDef *hostdev,
9c6c51
-                                   const virDomainDef *def)
9c6c51
+qemuDomainMdevDefValidate(const virDomainHostdevSubsysMediatedDev *mdevsrc,
9c6c51
+                          const virDomainDef *def,
9c6c51
+                          virQEMUCapsPtr qemuCaps)
9c6c51
 {
9c6c51
+    if (mdevsrc->display == VIR_TRISTATE_SWITCH_ABSENT)
9c6c51
+        return 0;
9c6c51
+
9c6c51
+    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VFIO_PCI_DISPLAY)) {
9c6c51
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
9c6c51
+                       _("display property of device vfio-pci is "
9c6c51
+                         "not supported by this version of QEMU"));
9c6c51
+        return -1;
9c6c51
+    }
9c6c51
+
9c6c51
+    if (mdevsrc->model != VIR_MDEV_MODEL_TYPE_VFIO_PCI) {
9c6c51
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
9c6c51
+                       _("<hostdev> attribute 'display' is only supported"
9c6c51
+                         " with model='vfio-pci'"));
9c6c51
+
9c6c51
+        return -1;
9c6c51
+    }
9c6c51
+
9c6c51
+    if (mdevsrc->display == VIR_TRISTATE_SWITCH_ON) {
9c6c51
+        if (def->ngraphics == 0) {
9c6c51
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
9c6c51
+                           _("graphics device is needed for attribute value "
9c6c51
+                             "'display=on' in <hostdev>"));
9c6c51
+            return -1;
9c6c51
+        }
9c6c51
+    }
9c6c51
+
9c6c51
+    return 0;
9c6c51
+}
9c6c51
+
9c6c51
+
9c6c51
+static int
9c6c51
+qemuDomainDeviceDefValidateHostdev(const virDomainHostdevDef *hostdev,
9c6c51
+                                   const virDomainDef *def,
9c6c51
+                                   virQEMUCapsPtr qemuCaps)
9c6c51
+{
9c6c51
+    const virDomainHostdevSubsysMediatedDev *mdevsrc;
9c6c51
+
9c6c51
     /* forbid capabilities mode hostdev in this kind of hypervisor */
9c6c51
     if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES) {
9c6c51
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
9c6c51
@@ -4463,6 +4502,24 @@ qemuDomainDeviceDefValidateHostdev(const virDomainHostdevDef *hostdev,
9c6c51
         return -1;
9c6c51
     }
9c6c51
 
9c6c51
+    if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
9c6c51
+        switch ((virDomainHostdevSubsysType) hostdev->source.subsys.type) {
9c6c51
+        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
9c6c51
+        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
9c6c51
+        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
9c6c51
+        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
9c6c51
+            break;
9c6c51
+        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
9c6c51
+            mdevsrc = &hostdev->source.subsys.u.mdev;
9c6c51
+            return qemuDomainMdevDefValidate(mdevsrc, def, qemuCaps);
9c6c51
+        case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
9c6c51
+        default:
9c6c51
+            virReportEnumRangeError(virDomainHostdevSubsysType,
9c6c51
+                                    hostdev->source.subsys.type);
9c6c51
+            return -1;
9c6c51
+        }
9c6c51
+    }
9c6c51
+
9c6c51
     return 0;
9c6c51
 }
9c6c51
 
9c6c51
@@ -5595,7 +5652,8 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev,
9c6c51
         break;
9c6c51
 
9c6c51
     case VIR_DOMAIN_DEVICE_HOSTDEV:
9c6c51
-        ret = qemuDomainDeviceDefValidateHostdev(dev->data.hostdev, def);
9c6c51
+        ret = qemuDomainDeviceDefValidateHostdev(dev->data.hostdev, def,
9c6c51
+                                                 qemuCaps);
9c6c51
         break;
9c6c51
 
9c6c51
     case VIR_DOMAIN_DEVICE_VIDEO:
9c6c51
@@ -6205,6 +6263,35 @@ qemuDomainVsockDefPostParse(virDomainVsockDefPtr vsock)
9c6c51
 }
9c6c51
 
9c6c51
 
9c6c51
+static int
9c6c51
+qemuDomainHostdevDefMdevPostParse(virDomainHostdevSubsysMediatedDevPtr mdevsrc,
9c6c51
+                                  virQEMUCapsPtr qemuCaps)
9c6c51
+{
9c6c51
+    /* QEMU 2.12 added support for vfio-pci display type, we default to
9c6c51
+     * 'display=off' to stay safe from future changes */
9c6c51
+    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VFIO_PCI_DISPLAY) &&
9c6c51
+        mdevsrc->display == VIR_TRISTATE_SWITCH_ABSENT)
9c6c51
+        mdevsrc->display = VIR_TRISTATE_SWITCH_OFF;
9c6c51
+
9c6c51
+    return 0;
9c6c51
+}
9c6c51
+
9c6c51
+
9c6c51
+static int
9c6c51
+qemuDomainHostdevDefPostParse(virDomainHostdevDefPtr hostdev,
9c6c51
+                              virQEMUCapsPtr qemuCaps)
9c6c51
+{
9c6c51
+    virDomainHostdevSubsysPtr subsys = &hostdev->source.subsys;
9c6c51
+
9c6c51
+    if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
9c6c51
+        hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV &&
9c6c51
+        qemuDomainHostdevDefMdevPostParse(&subsys->u.mdev, qemuCaps) < 0)
9c6c51
+        return -1;
9c6c51
+
9c6c51
+    return 0;
9c6c51
+}
9c6c51
+
9c6c51
+
9c6c51
 static int
9c6c51
 qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
9c6c51
                              const virDomainDef *def,
9c6c51
@@ -6255,11 +6342,14 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
9c6c51
         ret = qemuDomainVsockDefPostParse(dev->data.vsock);
9c6c51
         break;
9c6c51
 
9c6c51
+    case VIR_DOMAIN_DEVICE_HOSTDEV:
9c6c51
+        ret = qemuDomainHostdevDefPostParse(dev->data.hostdev, qemuCaps);
9c6c51
+        break;
9c6c51
+
9c6c51
     case VIR_DOMAIN_DEVICE_LEASE:
9c6c51
     case VIR_DOMAIN_DEVICE_FS:
9c6c51
     case VIR_DOMAIN_DEVICE_INPUT:
9c6c51
     case VIR_DOMAIN_DEVICE_SOUND:
9c6c51
-    case VIR_DOMAIN_DEVICE_HOSTDEV:
9c6c51
     case VIR_DOMAIN_DEVICE_WATCHDOG:
9c6c51
     case VIR_DOMAIN_DEVICE_GRAPHICS:
9c6c51
     case VIR_DOMAIN_DEVICE_HUB:
9c6c51
diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display.xml b/tests/qemuxml2argvdata/hostdev-mdev-display.xml
9c6c51
new file mode 100644
9c6c51
index 0000000000..f37e08e1b9
9c6c51
--- /dev/null
9c6c51
+++ b/tests/qemuxml2argvdata/hostdev-mdev-display.xml
9c6c51
@@ -0,0 +1,39 @@
9c6c51
+<domain type='qemu'>
9c6c51
+  <name>QEMUGuest2</name>
9c6c51
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
9c6c51
+  <memory unit='KiB'>219136</memory>
9c6c51
+  <currentMemory unit='KiB'>219136</currentMemory>
9c6c51
+  <vcpu placement='static'>1</vcpu>
9c6c51
+  <os>
9c6c51
+    <type arch='i686' machine='pc'>hvm</type>
9c6c51
+    <boot dev='hd'/>
9c6c51
+  </os>
9c6c51
+  <clock offset='utc'/>
9c6c51
+  <on_poweroff>destroy</on_poweroff>
9c6c51
+  <on_reboot>restart</on_reboot>
9c6c51
+  <on_crash>destroy</on_crash>
9c6c51
+  <devices>
9c6c51
+    <emulator>/usr/bin/qemu-system-i686</emulator>
9c6c51
+    <disk type='block' device='disk'>
9c6c51
+      <driver name='qemu' type='raw'/>
9c6c51
+      <source dev='/dev/HostVG/QEMUGuest2'/>
9c6c51
+      <target dev='hda' bus='ide'/>
9c6c51
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
9c6c51
+    </disk>
9c6c51
+    <controller type='usb' index='0'>
9c6c51
+    </controller>
9c6c51
+    <controller type='pci' index='0' model='pci-root'/>
9c6c51
+    <controller type='ide' index='0'>
9c6c51
+    </controller>
9c6c51
+    <graphics type='vnc'/>
9c6c51
+    <hostdev mode='subsystem' type='mdev' model='vfio-pci' display='on'>
9c6c51
+      <source>
9c6c51
+        <address uuid='53764d0e-85a0-42b4-af5c-2046b460b1dc'/>
9c6c51
+      </source>
9c6c51
+    </hostdev>
9c6c51
+    <video>
9c6c51
+      <model type='qxl' heads='1'/>
9c6c51
+    </video>
9c6c51
+    <memballoon model='none'/>
9c6c51
+  </devices>
9c6c51
+</domain>
9c6c51
diff --git a/tests/qemuxml2xmloutdata/hostdev-mdev-display.xml b/tests/qemuxml2xmloutdata/hostdev-mdev-display.xml
9c6c51
new file mode 100644
9c6c51
index 0000000000..94c11b1199
9c6c51
--- /dev/null
9c6c51
+++ b/tests/qemuxml2xmloutdata/hostdev-mdev-display.xml
9c6c51
@@ -0,0 +1,47 @@
9c6c51
+<domain type='qemu'>
9c6c51
+  <name>QEMUGuest2</name>
9c6c51
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
9c6c51
+  <memory unit='KiB'>219136</memory>
9c6c51
+  <currentMemory unit='KiB'>219136</currentMemory>
9c6c51
+  <vcpu placement='static'>1</vcpu>
9c6c51
+  <os>
9c6c51
+    <type arch='i686' machine='pc'>hvm</type>
9c6c51
+    <boot dev='hd'/>
9c6c51
+  </os>
9c6c51
+  <clock offset='utc'/>
9c6c51
+  <on_poweroff>destroy</on_poweroff>
9c6c51
+  <on_reboot>restart</on_reboot>
9c6c51
+  <on_crash>destroy</on_crash>
9c6c51
+  <devices>
9c6c51
+    <emulator>/usr/bin/qemu-system-i686</emulator>
9c6c51
+    <disk type='block' device='disk'>
9c6c51
+      <driver name='qemu' type='raw'/>
9c6c51
+      <source dev='/dev/HostVG/QEMUGuest2'/>
9c6c51
+      <target dev='hda' bus='ide'/>
9c6c51
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
9c6c51
+    </disk>
9c6c51
+    <controller type='usb' index='0'>
9c6c51
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
9c6c51
+    </controller>
9c6c51
+    <controller type='pci' index='0' model='pci-root'/>
9c6c51
+    <controller type='ide' index='0'>
9c6c51
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
9c6c51
+    </controller>
9c6c51
+    <input type='mouse' bus='ps2'/>
9c6c51
+    <input type='keyboard' bus='ps2'/>
9c6c51
+    <graphics type='vnc' port='-1' autoport='yes'>
9c6c51
+      <listen type='address'/>
9c6c51
+    </graphics>
9c6c51
+    <video>
9c6c51
+      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
9c6c51
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
9c6c51
+    </video>
9c6c51
+    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'>
9c6c51
+      <source>
9c6c51
+        <address uuid='53764d0e-85a0-42b4-af5c-2046b460b1dc'/>
9c6c51
+      </source>
9c6c51
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
9c6c51
+    </hostdev>
9c6c51
+    <memballoon model='none'/>
9c6c51
+  </devices>
9c6c51
+</domain>
9c6c51
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
9c6c51
index fa57221d62..e418e67f6c 100644
9c6c51
--- a/tests/qemuxml2xmltest.c
9c6c51
+++ b/tests/qemuxml2xmltest.c
9c6c51
@@ -479,6 +479,7 @@ mymain(void)
9c6c51
     DO_TEST("hostdev-pci-address", NONE);
9c6c51
     DO_TEST("hostdev-vfio", NONE);
9c6c51
     DO_TEST("hostdev-mdev-precreated", NONE);
9c6c51
+    DO_TEST("hostdev-mdev-display", QEMU_CAPS_VFIO_PCI_DISPLAY);
9c6c51
     DO_TEST("pci-rom", NONE);
9c6c51
     DO_TEST("pci-rom-disabled", NONE);
9c6c51
     DO_TEST("pci-rom-disabled-invalid", NONE);
9c6c51
-- 
9c6c51
2.18.0
9c6c51