This commit introduces QEMU capability detection and validation for
virtio-multitouch devices.

1. Capability flag (QEMU_CAPS_VIRTIO_MULTITOUCH): A new capability flag is
   defined in src/qemu/qemu_capabilities.h to track whether the QEMU binary
   supports virtio-multitouch devices.

2. Device detection (src/qemu/qemu_capabilities.c): The capability probing
   code is updated to detect the presence of "virtio-multitouch-device" and
   "virtio-multitouch-pci" device types when querying QEMU. This allows
   libvirt to determine at runtime whether the installed QEMU version
   supports multitouch devices (available since QEMU 8.1.0).

3. Validation (src/qemu/qemu_validate.c): Validation logic is added to ensure
   that multitouch devices are only used when QEMU supports them. If a domain
   configuration specifies a multitouch device but QEMU lacks support, libvirt
   will reject the configuration with a clear error message rather than
   generating invalid command-line arguments.

This capability-based approach ensures that libvirt gracefully handles
different QEMU versions, allowing multitouch devices on newer QEMU while
preventing configuration errors on older versions.

Signed-off-by: Julio Faracco <[email protected]>
---
 src/qemu/qemu_capabilities.c | 3 +++
 src/qemu/qemu_capabilities.h | 1 +
 src/qemu/qemu_validate.c     | 5 +++++
 3 files changed, 9 insertions(+)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 92b863a826..bc19aa1a5d 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -755,6 +755,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
               "disk-timed-stats", /* QEMU_CAPS_DISK_TIMED_STATS */
               "query-accelerators", /* QEMU_CAPS_QUERY_ACCELERATORS */
               "mshv", /* QEMU_CAPS_MSHV */
+             "virtio-multitouch", /* QEMU_CAPS_VIRTIO_MULTITOUCH */
     );
 
 
@@ -1345,6 +1346,8 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
     { "virtio-keyboard-pci", QEMU_CAPS_VIRTIO_KEYBOARD },
     { "virtio-mouse-device", QEMU_CAPS_VIRTIO_MOUSE },
     { "virtio-mouse-pci", QEMU_CAPS_VIRTIO_MOUSE },
+    { "virtio-multitouch-device", QEMU_CAPS_VIRTIO_MULTITOUCH },
+    { "virtio-multitouch-pci", QEMU_CAPS_VIRTIO_MULTITOUCH },
     { "virtio-tablet-device", QEMU_CAPS_VIRTIO_TABLET },
     { "virtio-tablet-pci", QEMU_CAPS_VIRTIO_TABLET },
     { "virtio-input-host-device", QEMU_CAPS_VIRTIO_INPUT_HOST },
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index f180844e66..44a3350cf9 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -730,6 +730,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for 
syntax-check */
     QEMU_CAPS_DISK_TIMED_STATS, /* timed stats support ('stats-intervals' 
property of disk frontends) */
     QEMU_CAPS_QUERY_ACCELERATORS, /* query-accelerators command */
     QEMU_CAPS_MSHV, /* -accel mshv */
+    QEMU_CAPS_VIRTIO_MULTITOUCH, /* -device virtio-multitouch-{device,pci} */
 
     QEMU_CAPS_LAST /* this must always be the last item */
 } virQEMUCapsFlags;
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 184c23d307..6589939290 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -5485,6 +5485,11 @@ qemuValidateDomainDeviceDefInput(const virDomainInputDef 
*input,
         cap = QEMU_CAPS_VIRTIO_INPUT_HOST;
         ccwCap = QEMU_CAPS_LAST;
         break;
+    case VIR_DOMAIN_INPUT_TYPE_MULTITOUCH:
+        baseName = "virtio-multitouch";
+        cap = QEMU_CAPS_VIRTIO_MULTITOUCH;
+        ccwCap = QEMU_CAPS_LAST;
+        break;
     case VIR_DOMAIN_INPUT_TYPE_EVDEV:
         baseName = "input-linux";
         cap = QEMU_CAPS_INPUT_LINUX;
-- 
2.52.0

Reply via email to