[libvirt] [PATCH v1 2/7] qemu: Add support for virtio-gpu-ccw device

Farhan Ali posted 7 patches 7 years, 2 months ago
There is a newer version of this series
[libvirt] [PATCH v1 2/7] qemu: Add support for virtio-gpu-ccw device
Posted by Farhan Ali 7 years, 2 months ago
QEMU on S390 (since v2.11) can support the virtio-gpu-ccw device,
so on S390 assign CCW address for a video device.

Also introduce a new capability for the virtio-gpu-ccw
device.

Signed-off-by: Farhan Ali <alifm@linux.vnet.ibm.com>
Signed-off-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
---
 docs/formatdomain.html.in                          |  3 +
 src/qemu/qemu_capabilities.c                       |  5 ++
 src/qemu/qemu_capabilities.h                       |  1 +
 src/qemu/qemu_command.c                            | 18 ++++-
 src/qemu/qemu_domain.c                             |  2 +-
 src/qemu/qemu_domain_address.c                     |  8 +++
 src/qemu/qemu_process.c                            |  5 +-
 .../qemucapabilitiesdata/caps_2.11.0.s390x.replies | 83 +++++++++++++++++++---
 tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml   |  3 +-
 9 files changed, 114 insertions(+), 14 deletions(-)

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_capabilities.c b/src/qemu/qemu_capabilities.c
index b5eb8cf..9db4c31 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -459,6 +459,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
               "pl011",
               "machine.pseries.max-cpu-compat",
               "dump-completed",
+              "virtio-gpu-ccw",
     );
 
 
@@ -1694,6 +1695,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
     { "sclplmconsole", QEMU_CAPS_DEVICE_SCLPLMCONSOLE },
     { "isa-serial", QEMU_CAPS_DEVICE_ISA_SERIAL },
     { "pl011", QEMU_CAPS_DEVICE_PL011 },
+    { "virtio-gpu-ccw", QEMU_CAPS_DEVICE_VIRTIO_GPU_CCW },
 };
 
 static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBalloon[] = {
@@ -1932,6 +1934,9 @@ static struct virQEMUCapsObjectTypeProps virQEMUCapsObjectProps[] = {
     { "spapr-pci-host-bridge", virQEMUCapsObjectPropsSpaprPCIHostBridge,
       ARRAY_CARDINALITY(virQEMUCapsObjectPropsSpaprPCIHostBridge),
       QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE },
+    { "virtio-gpu-ccw", virQEMUCapsObjectPropsVirtioGpu,
+      ARRAY_CARDINALITY(virQEMUCapsObjectPropsVirtioGpu),
+      QEMU_CAPS_DEVICE_VIRTIO_GPU_CCW },
 };
 
 struct virQEMUCapsPropTypeObjects {
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index c2ec2be..b4852e5 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -444,6 +444,7 @@ typedef enum {
     QEMU_CAPS_DEVICE_PL011, /* -device pl011 (not user-instantiable) */
     QEMU_CAPS_MACHINE_PSERIES_MAX_CPU_COMPAT, /* -machine pseries,max-cpu-compat= */
     QEMU_CAPS_DUMP_COMPLETED, /* DUMP_COMPLETED event */
+    QEMU_CAPS_DEVICE_VIRTIO_GPU_CCW, /* -device virtio-gpu-ccw */
 
     QEMU_CAPS_LAST /* this must always be the last item */
 } virQEMUCapsFlags;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index fa0aa5d..ba63670 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)
@@ -4262,7 +4262,21 @@ qemuBuildDeviceVideoStr(const virDomainDef *def,
         goto error;
     }
 
-    virBufferAsprintf(&buf, "%s,id=%s", model, video->info.alias);
+    if (STREQ(model, "virtio-gpu")) {
+        switch (video->info.type) {
+        case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
+            virBufferAsprintf(&buf, "%s-pci", model);
+            break;
+
+        case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW:
+            virBufferAsprintf(&buf, "%s-ccw", model);
+            break;
+        }
+    } 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.c b/src/qemu/qemu_domain.c
index ee02ecd..b47b4d1 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -5156,7 +5156,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
         if (dev->data.video->type == VIR_DOMAIN_VIDEO_TYPE_DEFAULT) {
             if ARCH_IS_PPC64(def->os.arch)
                 dev->data.video->type = VIR_DOMAIN_VIDEO_TYPE_VGA;
-            else if (qemuDomainIsVirt(def))
+            else if (qemuDomainIsVirt(def) || ARCH_IS_S390(def->os.arch))
                 dev->data.video->type = VIR_DOMAIN_VIDEO_TYPE_VIRTIO;
             else
                 dev->data.video->type = VIR_DOMAIN_VIDEO_TYPE_CIRRUS;
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index ae49cf2..49a293e 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -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_DISK_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/qemucapabilitiesdata/caps_2.11.0.s390x.replies b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.replies
index 6768937..53c4804 100644
--- a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.replies
+++ b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.replies
@@ -3515,6 +3515,71 @@
 {
   "return": [
     {
+      "name": "notify_on_empty",
+      "description": "on/off",
+      "type": "bool"
+    },
+    {
+      "name": "ioeventfd",
+      "description": "on/off",
+      "type": "bool"
+    },
+    {
+      "name": "any_layout",
+      "description": "on/off",
+      "type": "bool"
+    },
+    {
+      "name": "devno",
+      "description": "Identifier of an I/O device in the channel subsystem, example: fe.1.23ab",
+      "type": "str"
+    },
+    {
+      "name": "indirect_desc",
+      "description": "on/off",
+      "type": "bool"
+    },
+    {
+      "name": "event_idx",
+      "description": "on/off",
+      "type": "bool"
+    },
+    {
+      "name": "virtio-backend",
+      "type": "child<virtio-gpu-device>"
+    },
+    {
+      "name": "yres",
+      "type": "uint32"
+    },
+    {
+      "name": "xres",
+      "type": "uint32"
+    },
+    {
+      "name": "iommu_platform",
+      "description": "on/off",
+      "type": "bool"
+    },
+    {
+      "name": "max_outputs",
+      "type": "uint32"
+    },
+    {
+      "name": "max_hostmem",
+      "type": "size"
+    },
+    {
+      "name": "max_revision",
+      "type": "uint32"
+    }
+  ],
+  "id": "libvirt-41"
+}
+
+{
+  "return": [
+    {
       "hotpluggable-cpus": true,
       "name": "s390-ccw-virtio-2.7",
       "cpu-max": 248
@@ -3562,7 +3627,7 @@
       "cpu-max": 248
     }
   ],
-  "id": "libvirt-41"
+  "id": "libvirt-42"
 }
 
 {
@@ -4096,20 +4161,20 @@
       "migration-safe": true
     }
   ],
-  "id": "libvirt-42"
+  "id": "libvirt-43"
 }
 
 {
   "return": [
   ],
-  "id": "libvirt-43"
+  "id": "libvirt-44"
 }
 
 {
   "return": [
     "emulator"
   ],
-  "id": "libvirt-44"
+  "id": "libvirt-45"
 }
 
 {
@@ -5230,7 +5295,7 @@
       "option": "drive"
     }
   ],
-  "id": "libvirt-45"
+  "id": "libvirt-46"
 }
 
 {
@@ -5288,7 +5353,7 @@
       "capability": "x-multifd"
     }
   ],
-  "id": "libvirt-46"
+  "id": "libvirt-47"
 }
 
 {
@@ -15156,7 +15221,7 @@
       "meta-type": "object"
     }
   ],
-  "id": "libvirt-47"
+  "id": "libvirt-48"
 }
 
 {
@@ -15195,11 +15260,11 @@
       }
     }
   },
-  "id": "libvirt-48"
+  "id": "libvirt-49"
 }
 
 {
-  "id": "libvirt-49",
+  "id": "libvirt-50",
   "error": {
     "class": "GenericError",
     "desc": "Property '.migratable' not found"
diff --git a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml
index f7f102f..ec5c396 100644
--- a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml
@@ -146,9 +146,10 @@
   <flag name='disk-share-rw'/>
   <flag name='iscsi.password-secret'/>
   <flag name='dump-completed'/>
+  <flag name='virtio-gpu-ccw'/>
   <version>2011000</version>
   <kvmVersion>0</kvmVersion>
-  <microcodeVersion>341724</microcodeVersion>
+  <microcodeVersion>342885</microcodeVersion>
   <package></package>
   <arch>s390x</arch>
   <hostCPU type='kvm' model='z14-base' migratability='no'>
-- 
2.7.4

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v1 2/7] qemu: Add support for virtio-gpu-ccw device
Posted by John Ferlan 7 years, 1 month ago

On 03/08/2018 11:07 AM, Farhan Ali wrote:
> QEMU on S390 (since v2.11) can support the virtio-gpu-ccw device,
> so on S390 assign CCW address for a video device.
> 
> Also introduce a new capability for the virtio-gpu-ccw
> device.
> 
> Signed-off-by: Farhan Ali <alifm@linux.vnet.ibm.com>
> Signed-off-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
> ---
>  docs/formatdomain.html.in                          |  3 +
>  src/qemu/qemu_capabilities.c                       |  5 ++
>  src/qemu/qemu_capabilities.h                       |  1 +
>  src/qemu/qemu_command.c                            | 18 ++++-
>  src/qemu/qemu_domain.c                             |  2 +-
>  src/qemu/qemu_domain_address.c                     |  8 +++
>  src/qemu/qemu_process.c                            |  5 +-
>  .../qemucapabilitiesdata/caps_2.11.0.s390x.replies | 83 +++++++++++++++++++---
>  tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml   |  3 +-
>  9 files changed, 114 insertions(+), 14 deletions(-)
> 

First off - other upstream changes has caused this to not be able to
apply w/ git am -3 - so once patch1 is pushed, you'll need to rework and
repost the series (hopefully this time you won't have the strange split
with a CC address having "--dry-run" appended to an email ;-)

Since I cannot compile this one - I'll just be able to go through
visually and note a few things...  Primarily though - this particular
patch should be split up a bit more.  Separate out the capabilities into
their own separate "capabilities" patch and the second patch becomes a
"functionality" patch.

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


... The above would go with the "functionality" patch and the next few
with a "capability" patch...

> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index b5eb8cf..9db4c31 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -459,6 +459,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
>                "pl011",
>                "machine.pseries.max-cpu-compat",
>                "dump-completed",
> +              "virtio-gpu-ccw",
>      );
>  
>  
> @@ -1694,6 +1695,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
>      { "sclplmconsole", QEMU_CAPS_DEVICE_SCLPLMCONSOLE },
>      { "isa-serial", QEMU_CAPS_DEVICE_ISA_SERIAL },
>      { "pl011", QEMU_CAPS_DEVICE_PL011 },
> +    { "virtio-gpu-ccw", QEMU_CAPS_DEVICE_VIRTIO_GPU_CCW },
>  };
>  
>  static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBalloon[] = {
> @@ -1932,6 +1934,9 @@ static struct virQEMUCapsObjectTypeProps virQEMUCapsObjectProps[] = {
>      { "spapr-pci-host-bridge", virQEMUCapsObjectPropsSpaprPCIHostBridge,
>        ARRAY_CARDINALITY(virQEMUCapsObjectPropsSpaprPCIHostBridge),
>        QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE },
> +    { "virtio-gpu-ccw", virQEMUCapsObjectPropsVirtioGpu,
> +      ARRAY_CARDINALITY(virQEMUCapsObjectPropsVirtioGpu),
> +      QEMU_CAPS_DEVICE_VIRTIO_GPU_CCW },
>  };
>  
>  struct virQEMUCapsPropTypeObjects {
> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
> index c2ec2be..b4852e5 100644
> --- a/src/qemu/qemu_capabilities.h
> +++ b/src/qemu/qemu_capabilities.h
> @@ -444,6 +444,7 @@ typedef enum {
>      QEMU_CAPS_DEVICE_PL011, /* -device pl011 (not user-instantiable) */
>      QEMU_CAPS_MACHINE_PSERIES_MAX_CPU_COMPAT, /* -machine pseries,max-cpu-compat= */
>      QEMU_CAPS_DUMP_COMPLETED, /* DUMP_COMPLETED event */
> +    QEMU_CAPS_DEVICE_VIRTIO_GPU_CCW, /* -device virtio-gpu-ccw */
>  
>      QEMU_CAPS_LAST /* this must always be the last item */
>  } virQEMUCapsFlags;

... Above here with the "capability" patch and below with the
"functionality" patch...

> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index fa0aa5d..ba63670 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)
> @@ -4262,7 +4262,21 @@ qemuBuildDeviceVideoStr(const virDomainDef *def,
>          goto error;
>      }
>  
> -    virBufferAsprintf(&buf, "%s,id=%s", model, video->info.alias);
> +    if (STREQ(model, "virtio-gpu")) {

Rather than STREQ comparison perhaps:

if (video->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO) {

since that's what derives "virtio-gpu" for model anyway.

> +        switch (video->info.type) {
> +        case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
> +            virBufferAsprintf(&buf, "%s-pci", model);
> +            break;
> +
> +        case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW:
> +            virBufferAsprintf(&buf, "%s-ccw", model);
> +            break;
> +        }

Let's not use a switch here - as that implies there could be more than
just two values in the '.type' field... I'd go with:

    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.c b/src/qemu/qemu_domain.c
> index ee02ecd..b47b4d1 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -5156,7 +5156,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
>          if (dev->data.video->type == VIR_DOMAIN_VIDEO_TYPE_DEFAULT) {
>              if ARCH_IS_PPC64(def->os.arch)
>                  dev->data.video->type = VIR_DOMAIN_VIDEO_TYPE_VGA;
> -            else if (qemuDomainIsVirt(def))
> +            else if (qemuDomainIsVirt(def) || ARCH_IS_S390(def->os.arch))
>                  dev->data.video->type = VIR_DOMAIN_VIDEO_TYPE_VIRTIO;
>              else
>                  dev->data.video->type = VIR_DOMAIN_VIDEO_TYPE_CIRRUS;
> diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
> index ae49cf2..49a293e 100644
> --- a/src/qemu/qemu_domain_address.c
> +++ b/src/qemu/qemu_domain_address.c
> @@ -308,6 +308,14 @@ qemuDomainPrimeVirtioDeviceAddresses(virDomainDefPtr def,
>          }
>      }
>  

There's a comment at the top of the function that could add "video" to
the list as well...

> +    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_DISK_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));


... The rest would go with the capabilities patch....

> diff --git a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.replies b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.replies
> index 6768937..53c4804 100644
> --- a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.replies
> +++ b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.replies
> @@ -3515,6 +3515,71 @@
>  {
>    "return": [
>      {
> +      "name": "notify_on_empty",
> +      "description": "on/off",
> +      "type": "bool"
> +    },
> +    {
> +      "name": "ioeventfd",
> +      "description": "on/off",
> +      "type": "bool"
> +    },
> +    {
> +      "name": "any_layout",
> +      "description": "on/off",
> +      "type": "bool"
> +    },
> +    {
> +      "name": "devno",
> +      "description": "Identifier of an I/O device in the channel subsystem, example: fe.1.23ab",
> +      "type": "str"
> +    },
> +    {
> +      "name": "indirect_desc",
> +      "description": "on/off",
> +      "type": "bool"
> +    },
> +    {
> +      "name": "event_idx",
> +      "description": "on/off",
> +      "type": "bool"
> +    },
> +    {
> +      "name": "virtio-backend",
> +      "type": "child<virtio-gpu-device>"
> +    },
> +    {
> +      "name": "yres",
> +      "type": "uint32"
> +    },
> +    {
> +      "name": "xres",
> +      "type": "uint32"
> +    },
> +    {
> +      "name": "iommu_platform",
> +      "description": "on/off",
> +      "type": "bool"
> +    },
> +    {
> +      "name": "max_outputs",
> +      "type": "uint32"
> +    },
> +    {
> +      "name": "max_hostmem",
> +      "type": "size"
> +    },
> +    {
> +      "name": "max_revision",
> +      "type": "uint32"
> +    }
> +  ],
> +  "id": "libvirt-41"
> +}
> +
> +{
> +  "return": [
> +    {
>        "hotpluggable-cpus": true,
>        "name": "s390-ccw-virtio-2.7",
>        "cpu-max": 248
> @@ -3562,7 +3627,7 @@
>        "cpu-max": 248
>      }
>    ],
> -  "id": "libvirt-41"
> +  "id": "libvirt-42"
>  }
>  
>  {
> @@ -4096,20 +4161,20 @@
>        "migration-safe": true
>      }
>    ],
> -  "id": "libvirt-42"
> +  "id": "libvirt-43"
>  }
>  
>  {
>    "return": [
>    ],
> -  "id": "libvirt-43"
> +  "id": "libvirt-44"
>  }
>  
>  {
>    "return": [
>      "emulator"
>    ],
> -  "id": "libvirt-44"
> +  "id": "libvirt-45"
>  }
>  
>  {
> @@ -5230,7 +5295,7 @@
>        "option": "drive"
>      }
>    ],
> -  "id": "libvirt-45"
> +  "id": "libvirt-46"
>  }
>  
>  {
> @@ -5288,7 +5353,7 @@
>        "capability": "x-multifd"
>      }
>    ],
> -  "id": "libvirt-46"
> +  "id": "libvirt-47"
>  }
>  
>  {
> @@ -15156,7 +15221,7 @@
>        "meta-type": "object"
>      }
>    ],
> -  "id": "libvirt-47"
> +  "id": "libvirt-48"
>  }
>  
>  {
> @@ -15195,11 +15260,11 @@
>        }
>      }
>    },
> -  "id": "libvirt-48"
> +  "id": "libvirt-49"
>  }
>  
>  {
> -  "id": "libvirt-49",
> +  "id": "libvirt-50",
>    "error": {
>      "class": "GenericError",
>      "desc": "Property '.migratable' not found"
> diff --git a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml
> index f7f102f..ec5c396 100644
> --- a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml
> +++ b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml
> @@ -146,9 +146,10 @@
>    <flag name='disk-share-rw'/>
>    <flag name='iscsi.password-secret'/>
>    <flag name='dump-completed'/>
> +  <flag name='virtio-gpu-ccw'/>
>    <version>2011000</version>
>    <kvmVersion>0</kvmVersion>
> -  <microcodeVersion>341724</microcodeVersion>
> +  <microcodeVersion>342885</microcodeVersion>

<sigh> - I assume this is because someone updated something after the
original pull of the 2.11 caps...

You used the VIR_TEST_REGENERATE_OUTPUT=1 to create too, right?

John

>    <package></package>
>    <arch>s390x</arch>
>    <hostCPU type='kvm' model='z14-base' migratability='no'>
> 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v1 2/7] qemu: Add support for virtio-gpu-ccw device
Posted by Farhan Ali 7 years, 1 month ago
Hi Jon,

On 03/16/2018 09:38 AM, John Ferlan wrote:
> 
> 
> On 03/08/2018 11:07 AM, Farhan Ali wrote:
>> QEMU on S390 (since v2.11) can support the virtio-gpu-ccw device,
>> so on S390 assign CCW address for a video device.
>>
>> Also introduce a new capability for the virtio-gpu-ccw
>> device.
>>
>> Signed-off-by: Farhan Ali <alifm@linux.vnet.ibm.com>
>> Signed-off-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
>> ---
>>   docs/formatdomain.html.in                          |  3 +
>>   src/qemu/qemu_capabilities.c                       |  5 ++
>>   src/qemu/qemu_capabilities.h                       |  1 +
>>   src/qemu/qemu_command.c                            | 18 ++++-
>>   src/qemu/qemu_domain.c                             |  2 +-
>>   src/qemu/qemu_domain_address.c                     |  8 +++
>>   src/qemu/qemu_process.c                            |  5 +-
>>   .../qemucapabilitiesdata/caps_2.11.0.s390x.replies | 83 +++++++++++++++++++---
>>   tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml   |  3 +-
>>   9 files changed, 114 insertions(+), 14 deletions(-)
>>
> 
> First off - other upstream changes has caused this to not be able to
> apply w/ git am -3 - so once patch1 is pushed, you'll need to rework and
> repost the series (hopefully this time you won't have the strange split
> with a CC address having "--dry-run" appended to an email ;-)
> 
Ah yes, it was silly of me! I didn't realize till it was too late :)


> Since I cannot compile this one - I'll just be able to go through
> visually and note a few things...  Primarily though - this particular
> patch should be split up a bit more.  Separate out the capabilities into
> their own separate "capabilities" patch and the second patch becomes a
> "functionality" patch.
> 

Sure, I will move capabilities into a different patch.

>> 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>
> 
> 
> ... The above would go with the "functionality" patch and the next few
> with a "capability" patch...
> 
>> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
>> index b5eb8cf..9db4c31 100644
>> --- a/src/qemu/qemu_capabilities.c
>> +++ b/src/qemu/qemu_capabilities.c
>> @@ -459,6 +459,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
>>                 "pl011",
>>                 "machine.pseries.max-cpu-compat",
>>                 "dump-completed",
>> +              "virtio-gpu-ccw",
>>       );
>>   
>>   
>> @@ -1694,6 +1695,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
>>       { "sclplmconsole", QEMU_CAPS_DEVICE_SCLPLMCONSOLE },
>>       { "isa-serial", QEMU_CAPS_DEVICE_ISA_SERIAL },
>>       { "pl011", QEMU_CAPS_DEVICE_PL011 },
>> +    { "virtio-gpu-ccw", QEMU_CAPS_DEVICE_VIRTIO_GPU_CCW },
>>   };
>>   
>>   static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBalloon[] = {
>> @@ -1932,6 +1934,9 @@ static struct virQEMUCapsObjectTypeProps virQEMUCapsObjectProps[] = {
>>       { "spapr-pci-host-bridge", virQEMUCapsObjectPropsSpaprPCIHostBridge,
>>         ARRAY_CARDINALITY(virQEMUCapsObjectPropsSpaprPCIHostBridge),
>>         QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE },
>> +    { "virtio-gpu-ccw", virQEMUCapsObjectPropsVirtioGpu,
>> +      ARRAY_CARDINALITY(virQEMUCapsObjectPropsVirtioGpu),
>> +      QEMU_CAPS_DEVICE_VIRTIO_GPU_CCW },
>>   };
>>   
>>   struct virQEMUCapsPropTypeObjects {
>> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
>> index c2ec2be..b4852e5 100644
>> --- a/src/qemu/qemu_capabilities.h
>> +++ b/src/qemu/qemu_capabilities.h
>> @@ -444,6 +444,7 @@ typedef enum {
>>       QEMU_CAPS_DEVICE_PL011, /* -device pl011 (not user-instantiable) */
>>       QEMU_CAPS_MACHINE_PSERIES_MAX_CPU_COMPAT, /* -machine pseries,max-cpu-compat= */
>>       QEMU_CAPS_DUMP_COMPLETED, /* DUMP_COMPLETED event */
>> +    QEMU_CAPS_DEVICE_VIRTIO_GPU_CCW, /* -device virtio-gpu-ccw */
>>   
>>       QEMU_CAPS_LAST /* this must always be the last item */
>>   } virQEMUCapsFlags;
> 
> ... Above here with the "capability" patch and below with the
> "functionality" patch...
> 
>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>> index fa0aa5d..ba63670 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)
>> @@ -4262,7 +4262,21 @@ qemuBuildDeviceVideoStr(const virDomainDef *def,
>>           goto error;
>>       }
>>   
>> -    virBufferAsprintf(&buf, "%s,id=%s", model, video->info.alias);
>> +    if (STREQ(model, "virtio-gpu")) {
> 
> Rather than STREQ comparison perhaps:
> 
> if (video->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO) {
> 
> since that's what derives "virtio-gpu" for model anyway.


VIR_DOMAIN_VIDEO_TYPE_VIRTIO can be both "virtio-gpu" 
(qemuDeviceVideoSecondary) and "virtio-vga" (qemuDeviceVideo), so that's 
why I didn't use video.type check.


> 
>> +        switch (video->info.type) {
>> +        case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
>> +            virBufferAsprintf(&buf, "%s-pci", model);
>> +            break;
>> +
>> +        case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW:
>> +            virBufferAsprintf(&buf, "%s-ccw", model);
>> +            break;
>> +        }
> 
> Let's not use a switch here - as that implies there could be more than
> just two values in the '.type' field... I'd go with:

Sure.

> 
>      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.c b/src/qemu/qemu_domain.c
>> index ee02ecd..b47b4d1 100644
>> --- a/src/qemu/qemu_domain.c
>> +++ b/src/qemu/qemu_domain.c
>> @@ -5156,7 +5156,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
>>           if (dev->data.video->type == VIR_DOMAIN_VIDEO_TYPE_DEFAULT) {
>>               if ARCH_IS_PPC64(def->os.arch)
>>                   dev->data.video->type = VIR_DOMAIN_VIDEO_TYPE_VGA;
>> -            else if (qemuDomainIsVirt(def))
>> +            else if (qemuDomainIsVirt(def) || ARCH_IS_S390(def->os.arch))
>>                   dev->data.video->type = VIR_DOMAIN_VIDEO_TYPE_VIRTIO;
>>               else
>>                   dev->data.video->type = VIR_DOMAIN_VIDEO_TYPE_CIRRUS;
>> diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
>> index ae49cf2..49a293e 100644
>> --- a/src/qemu/qemu_domain_address.c
>> +++ b/src/qemu/qemu_domain_address.c
>> @@ -308,6 +308,14 @@ qemuDomainPrimeVirtioDeviceAddresses(virDomainDefPtr def,
>>           }
>>       }
>>   
> 
> There's a comment at the top of the function that could add "video" to
> the list as well...
> 
>> +    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_DISK_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));
> 
> 
> ... The rest would go with the capabilities patch....
> 
>> diff --git a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.replies b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.replies
>> index 6768937..53c4804 100644
>> --- a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.replies
>> +++ b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.replies
>> @@ -3515,6 +3515,71 @@
>>   {
>>     "return": [
>>       {
>> +      "name": "notify_on_empty",
>> +      "description": "on/off",
>> +      "type": "bool"
>> +    },
>> +    {
>> +      "name": "ioeventfd",
>> +      "description": "on/off",
>> +      "type": "bool"
>> +    },
>> +    {
>> +      "name": "any_layout",
>> +      "description": "on/off",
>> +      "type": "bool"
>> +    },
>> +    {
>> +      "name": "devno",
>> +      "description": "Identifier of an I/O device in the channel subsystem, example: fe.1.23ab",
>> +      "type": "str"
>> +    },
>> +    {
>> +      "name": "indirect_desc",
>> +      "description": "on/off",
>> +      "type": "bool"
>> +    },
>> +    {
>> +      "name": "event_idx",
>> +      "description": "on/off",
>> +      "type": "bool"
>> +    },
>> +    {
>> +      "name": "virtio-backend",
>> +      "type": "child<virtio-gpu-device>"
>> +    },
>> +    {
>> +      "name": "yres",
>> +      "type": "uint32"
>> +    },
>> +    {
>> +      "name": "xres",
>> +      "type": "uint32"
>> +    },
>> +    {
>> +      "name": "iommu_platform",
>> +      "description": "on/off",
>> +      "type": "bool"
>> +    },
>> +    {
>> +      "name": "max_outputs",
>> +      "type": "uint32"
>> +    },
>> +    {
>> +      "name": "max_hostmem",
>> +      "type": "size"
>> +    },
>> +    {
>> +      "name": "max_revision",
>> +      "type": "uint32"
>> +    }
>> +  ],
>> +  "id": "libvirt-41"
>> +}
>> +
>> +{
>> +  "return": [
>> +    {
>>         "hotpluggable-cpus": true,
>>         "name": "s390-ccw-virtio-2.7",
>>         "cpu-max": 248
>> @@ -3562,7 +3627,7 @@
>>         "cpu-max": 248
>>       }
>>     ],
>> -  "id": "libvirt-41"
>> +  "id": "libvirt-42"
>>   }
>>   
>>   {
>> @@ -4096,20 +4161,20 @@
>>         "migration-safe": true
>>       }
>>     ],
>> -  "id": "libvirt-42"
>> +  "id": "libvirt-43"
>>   }
>>   
>>   {
>>     "return": [
>>     ],
>> -  "id": "libvirt-43"
>> +  "id": "libvirt-44"
>>   }
>>   
>>   {
>>     "return": [
>>       "emulator"
>>     ],
>> -  "id": "libvirt-44"
>> +  "id": "libvirt-45"
>>   }
>>   
>>   {
>> @@ -5230,7 +5295,7 @@
>>         "option": "drive"
>>       }
>>     ],
>> -  "id": "libvirt-45"
>> +  "id": "libvirt-46"
>>   }
>>   
>>   {
>> @@ -5288,7 +5353,7 @@
>>         "capability": "x-multifd"
>>       }
>>     ],
>> -  "id": "libvirt-46"
>> +  "id": "libvirt-47"
>>   }
>>   
>>   {
>> @@ -15156,7 +15221,7 @@
>>         "meta-type": "object"
>>       }
>>     ],
>> -  "id": "libvirt-47"
>> +  "id": "libvirt-48"
>>   }
>>   
>>   {
>> @@ -15195,11 +15260,11 @@
>>         }
>>       }
>>     },
>> -  "id": "libvirt-48"
>> +  "id": "libvirt-49"
>>   }
>>   
>>   {
>> -  "id": "libvirt-49",
>> +  "id": "libvirt-50",
>>     "error": {
>>       "class": "GenericError",
>>       "desc": "Property '.migratable' not found"
>> diff --git a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml
>> index f7f102f..ec5c396 100644
>> --- a/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml
>> +++ b/tests/qemucapabilitiesdata/caps_2.11.0.s390x.xml
>> @@ -146,9 +146,10 @@
>>     <flag name='disk-share-rw'/>
>>     <flag name='iscsi.password-secret'/>
>>     <flag name='dump-completed'/>
>> +  <flag name='virtio-gpu-ccw'/>
>>     <version>2011000</version>
>>     <kvmVersion>0</kvmVersion>
>> -  <microcodeVersion>341724</microcodeVersion>
>> +  <microcodeVersion>342885</microcodeVersion>
> 
> <sigh> - I assume this is because someone updated something after the
> original pull of the 2.11 caps...
> 
> You used the VIR_TEST_REGENERATE_OUTPUT=1 to create too, right?
> 
> John
> 
>>     <package></package>
>>     <arch>s390x</arch>
>>     <hostCPU type='kvm' model='z14-base' migratability='no'>
>>
> 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list