[PATCH 0/3] qemu: Add support for virtio sound model

virtio-sound-pci and virtio-sound-device were recently introduced in QEMU 8.2.0. The full documentation of the virtio sound implementation in QEMU can be found here: https://www.qemu.org/docs/master/system/devices/virtio-snd.html Example: <sound model='virtio' streams='2'/> Rayhan Faizel (3): qemu_capabilities: Add QEMU_CAPS_DEVICE_VIRTIO_SOUND capability conf: Introduce support for virtio-sound devices qemu: Generate command line for sound devices with model 'virtio' docs/formatdomain.rst | 11 ++++- src/conf/domain_conf.c | 25 +++++++++++ src/conf/domain_conf.h | 4 ++ src/conf/domain_postparse.c | 13 +++++- src/conf/schemas/domaincommon.rng | 11 +++++ src/libxl/libxl_domain.c | 1 + src/qemu/qemu_capabilities.c | 3 ++ src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 24 +++++++++- src/qemu/qemu_domain_address.c | 9 ++++ src/qemu/qemu_validate.c | 8 ++++ .../caps_8.2.0_aarch64.xml | 1 + .../caps_8.2.0_armv7l.xml | 1 + .../caps_8.2.0_loongarch64.xml | 1 + .../qemucapabilitiesdata/caps_8.2.0_s390x.xml | 1 + .../caps_8.2.0_x86_64.xml | 1 + .../caps_9.0.0_x86_64.xml | 1 + .../arm-vexpressa9-virtio.aarch64-latest.args | 1 + .../arm-vexpressa9-virtio.aarch64-latest.xml | 3 ++ .../qemuxmlconfdata/arm-vexpressa9-virtio.xml | 3 +- .../sound-device-virtio.x86_64-latest.args | 36 +++++++++++++++ .../sound-device-virtio.x86_64-latest.xml | 44 +++++++++++++++++++ tests/qemuxmlconfdata/sound-device-virtio.xml | 28 ++++++++++++ tests/qemuxmlconftest.c | 1 + 24 files changed, 226 insertions(+), 6 deletions(-) create mode 100644 tests/qemuxmlconfdata/sound-device-virtio.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/sound-device-virtio.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/sound-device-virtio.xml -- 2.34.1

Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com> --- src/qemu/qemu_capabilities.c | 3 +++ src/qemu/qemu_capabilities.h | 1 + tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml | 1 + tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml | 1 + tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml | 1 + tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml | 1 + 8 files changed, 10 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 21f93c6774..de38eaf453 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -706,6 +706,7 @@ VIR_ENUM_IMPL(virQEMUCaps, "blockjob.backing-mask-protocol", /* QEMU_CAPS_BLOCKJOB_BACKING_MASK_PROTOCOL */ "display-reload", /* QEMU_CAPS_DISPLAY_RELOAD */ "usb-mtp", /* QEMU_CAPS_DEVICE_USB_MTP */ + "virtio-sound", /* QEMU_CAPS_DEVICE_VIRTIO_SOUND */ ); @@ -1395,6 +1396,8 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { { "cryptodev-backend-lkcf", QEMU_CAPS_OBJECT_CRYPTO_LKCF }, { "pvpanic-pci", QEMU_CAPS_DEVICE_PANIC_PCI }, { "usb-mtp", QEMU_CAPS_DEVICE_USB_MTP }, + { "virtio-sound-pci", QEMU_CAPS_DEVICE_VIRTIO_SOUND }, + { "virtio-sound-device", QEMU_CAPS_DEVICE_VIRTIO_SOUND }, }; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 5082967cba..23580da8fd 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -685,6 +685,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ QEMU_CAPS_BLOCKJOB_BACKING_MASK_PROTOCOL, /* backing-mask-protocol of block-commit/block-stream */ QEMU_CAPS_DISPLAY_RELOAD, /* 'display-reload' qmp command is supported */ QEMU_CAPS_DEVICE_USB_MTP, /* -device usb-mtp */ + QEMU_CAPS_DEVICE_VIRTIO_SOUND, /* -device virtio-sound-* */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml index fe4c65c9b7..1ccf2cd972 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml @@ -165,6 +165,7 @@ <flag name='virtio-mem-pci.dynamic-memslots'/> <flag name='display-reload'/> <flag name='usb-mtp'/> + <flag name='virtio-sound'/> <version>8002000</version> <microcodeVersion>61700246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml index e26dc43963..58da0f857d 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml @@ -172,6 +172,7 @@ <flag name='virtio-mem-pci.dynamic-memslots'/> <flag name='display-reload'/> <flag name='usb-mtp'/> + <flag name='virtio-sound'/> <version>8002000</version> <microcodeVersion>0</microcodeVersion> <package>qemu-8.2.0-7.fc39</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml index bfe59f0c29..618a7075df 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml @@ -156,6 +156,7 @@ <flag name='smp-clusters'/> <flag name='display-reload'/> <flag name='usb-mtp'/> + <flag name='virtio-sound'/> <version>8002000</version> <microcodeVersion>106300246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml index 70e85bef28..acf18d5896 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml @@ -121,6 +121,7 @@ <flag name='smp-clusters'/> <flag name='display-reload'/> <flag name='usb-mtp'/> + <flag name='virtio-sound'/> <version>8002000</version> <microcodeVersion>39100246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml index 40716fa8d1..5d7755a65e 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml @@ -202,6 +202,7 @@ <flag name='virtio-mem-pci.dynamic-memslots'/> <flag name='display-reload'/> <flag name='usb-mtp'/> + <flag name='virtio-sound'/> <version>8002000</version> <microcodeVersion>43100246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml index fcfd9cdda9..3a73547b1c 100644 --- a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml @@ -204,6 +204,7 @@ <flag name='blockjob.backing-mask-protocol'/> <flag name='display-reload'/> <flag name='usb-mtp'/> + <flag name='virtio-sound'/> <version>8002091</version> <microcodeVersion>43100245</microcodeVersion> <package>v9.0.0-rc1-55-g7fcf7575f3</package> -- 2.34.1

This patch adds parsing of the virtio sound model, along with parsing of virtio options and PCI/virtio-mmio address assignment. A new 'streams' attribute is added for configuring number of PCM streams (default is 2) in virtio sound devices. QEMU additionally has jacks and chmaps parameters but these are currently stubbed, hence they are excluded in this patch series. Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com> --- docs/formatdomain.rst | 11 +++++++++-- src/conf/domain_conf.c | 25 +++++++++++++++++++++++++ src/conf/domain_conf.h | 4 ++++ src/conf/domain_postparse.c | 13 ++++++++++++- src/conf/schemas/domaincommon.rng | 11 +++++++++++ src/libxl/libxl_domain.c | 1 + src/qemu/qemu_command.c | 1 + src/qemu/qemu_domain_address.c | 9 +++++++++ src/qemu/qemu_validate.c | 8 ++++++++ 9 files changed, 80 insertions(+), 3 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index e2f66b982c..43d5928ffa 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -7390,8 +7390,9 @@ A virtual sound card can be attached to the host via the ``sound`` element. what real sound device is emulated. Valid values are specific to the underlying hypervisor, though typical choices are ``sb16``, ``es1370``, ``pcspk``, ``ac97`` (:since:`Since 0.6.0`), ``ich6`` (:since:`Since 0.8.8`), - ``ich9`` (:since:`Since 1.1.3`), ``usb`` (:since:`Since 1.2.8`) and ``ich7`` - (:since:`Since 6.7.0`, bhyve only). + ``ich9`` (:since:`Since 1.1.3`), ``usb`` (:since:`Since 1.2.8`), ``ich7`` + (:since:`Since 6.7.0`, bhyve only) and ``virtio`` + (:since:`Since 10.3.0 and QEMU 8.2.0`). :since:`Since 0.9.13`, a sound element with ``ich6`` or ``ich9`` models can have optional sub-elements ``<codec>`` to attach various audio codecs to the audio @@ -7419,6 +7420,12 @@ multi-channel mode by using the ``multichannel`` attribute:: <sound model='usb' multichannel='yes'/> +:since:`Since 10.3.0 and QEMU 8.2.0` the number of PCM streams in a ``virtio`` +sound device can be configured by using the ``streams`` attribute, which +defaults to ``2`` if left unspecified:: + + <sound model='virtio' streams='2'/> + Each ``sound`` element has an optional sub-element ``<address>`` which can tie the device to a particular PCI slot. See `Device Addresses`_. diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 48c5d546da..d63cb9bf64 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -778,6 +778,7 @@ VIR_ENUM_IMPL(virDomainSoundModel, "ich9", "usb", "ich7", + "virtio", ); VIR_ENUM_IMPL(virDomainAudioType, @@ -3211,6 +3212,7 @@ void virDomainSoundDefFree(virDomainSoundDef *def) virDomainSoundCodecDefFree(def->codecs[i]); g_free(def->codecs); + g_free(def->virtio); g_free(def); } @@ -11881,6 +11883,13 @@ virDomainSoundDefParseXML(virDomainXMLOption *xmlopt, return NULL; } + if (def->model == VIR_DOMAIN_SOUND_MODEL_VIRTIO) { + if (virXMLPropUInt(node, "streams", 10, + VIR_XML_PROP_NONZERO, + &def->streams) < 0) + return NULL; + } + audioNode = virXPathNode("./audio", ctxt); if (audioNode) { if (virXMLPropUInt(audioNode, "id", 10, @@ -11892,6 +11901,10 @@ virDomainSoundDefParseXML(virDomainXMLOption *xmlopt, if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, &def->info, flags) < 0) return NULL; + if (virDomainVirtioOptionsParseXML(virXPathNode("./driver", ctxt), + &def->virtio) < 0) + return NULL; + return g_steal_pointer(&def); } @@ -11916,6 +11929,9 @@ virDomainSoundDefEquals(const virDomainSoundDef *a, if (a->multichannel != b->multichannel) return false; + if (a->streams != b->streams) + return false; + if (a->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && !virDomainDeviceInfoAddressIsEqual(&a->info, &b->info)) return false; @@ -24836,6 +24852,7 @@ virDomainSoundDefFormat(virBuffer *buf, const char *model = virDomainSoundModelTypeToString(def->model); g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf); g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) driverAttrBuf = VIR_BUFFER_INITIALIZER; size_t i; if (!model) { @@ -24860,6 +24877,14 @@ virDomainSoundDefFormat(virBuffer *buf, virTristateBoolTypeToString(def->multichannel)); } + if (def->model == VIR_DOMAIN_SOUND_MODEL_VIRTIO) { + virBufferAsprintf(&attrBuf, " streams='%d'", def->streams); + + virDomainVirtioOptionsFormat(&driverAttrBuf, def->virtio); + + virXMLFormatElement(&childBuf, "driver", &driverAttrBuf, NULL); + } + virXMLFormatElement(buf, "sound", &attrBuf, &childBuf); return 0; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 5925faaf1a..13ca722019 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1565,6 +1565,7 @@ typedef enum { VIR_DOMAIN_SOUND_MODEL_ICH9, VIR_DOMAIN_SOUND_MODEL_USB, VIR_DOMAIN_SOUND_MODEL_ICH7, + VIR_DOMAIN_SOUND_MODEL_VIRTIO, VIR_DOMAIN_SOUND_MODEL_LAST } virDomainSoundModel; @@ -1586,6 +1587,9 @@ struct _virDomainSoundDef { virTristateBool multichannel; unsigned int audioId; + + unsigned int streams; + virDomainVirtioOptions *virtio; }; typedef enum { diff --git a/src/conf/domain_postparse.c b/src/conf/domain_postparse.c index cafa2d235d..112795ea65 100644 --- a/src/conf/domain_postparse.c +++ b/src/conf/domain_postparse.c @@ -677,6 +677,13 @@ virDomainInputDefPostParse(virDomainInputDef *input, } } +static void +virDomainSoundDefPostParse(virDomainSoundDef *sound) +{ + if (sound->model == VIR_DOMAIN_SOUND_MODEL_VIRTIO && sound->streams == 0) + sound->streams = 2; +} + static int virDomainDeviceDefPostParseCommon(virDomainDeviceDef *dev, const virDomainDef *def, @@ -730,9 +737,13 @@ virDomainDeviceDefPostParseCommon(virDomainDeviceDef *dev, ret = 0; break; + case VIR_DOMAIN_DEVICE_SOUND: + virDomainSoundDefPostParse(dev->data.sound); + ret = 0; + break; + case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_NET: - case VIR_DOMAIN_DEVICE_SOUND: case VIR_DOMAIN_DEVICE_WATCHDOG: case VIR_DOMAIN_DEVICE_GRAPHICS: case VIR_DOMAIN_DEVICE_HUB: diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index f386e46fae..5cdd8328b6 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -5057,6 +5057,7 @@ <value>ich7</value> <value>ich9</value> <value>usb</value> + <value>virtio</value> </choice> </attribute> <optional> @@ -5064,6 +5065,11 @@ <ref name="virYesNo"/> </attribute> </optional> + <optional> + <attribute name="streams"> + <ref name="uint32"/> + </attribute> + </optional> <interleave> <optional> <ref name="alias"/> @@ -5084,6 +5090,11 @@ <zeroOrMore> <ref name="codec"/> </zeroOrMore> + <optional> + <element name="driver"> + <ref name="virtioOptions"/> + </element> + </optional> </interleave> </element> </define> diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index 16c2ab973b..0f129ec69c 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -344,6 +344,7 @@ libxlDomainDefValidate(const virDomainDef *def, case VIR_DOMAIN_SOUND_MODEL_ICH7: case VIR_DOMAIN_SOUND_MODEL_USB: case VIR_DOMAIN_SOUND_MODEL_ICH9: + case VIR_DOMAIN_SOUND_MODEL_VIRTIO: case VIR_DOMAIN_SOUND_MODEL_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unsupported audio model %1$s"), diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 9d4563861f..5e69e71c6f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4479,6 +4479,7 @@ qemuBuildSoundDevCmd(virCommand *cmd, case VIR_DOMAIN_SOUND_MODEL_SB16: model = "sb16"; break; + case VIR_DOMAIN_SOUND_MODEL_VIRTIO: case VIR_DOMAIN_SOUND_MODEL_PCSPK: /* pc-speaker is handled separately */ case VIR_DOMAIN_SOUND_MODEL_ICH7: case VIR_DOMAIN_SOUND_MODEL_LAST: diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index 7690021ca7..251f5b7e1a 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -324,6 +324,12 @@ qemuDomainPrimeVirtioDeviceAddresses(virDomainDef *def, if (def->cryptos[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) def->cryptos[i]->info.type = type; } + + for (i = 0; i < def->nsounds; i++) { + if (def->sounds[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && + def->sounds[i]->model == VIR_DOMAIN_SOUND_MODEL_VIRTIO) + def->sounds[i]->info.type = type; + } } @@ -694,6 +700,9 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef *dev, case VIR_DOMAIN_SOUND_MODEL_ICH9: return pciFlags; + case VIR_DOMAIN_SOUND_MODEL_VIRTIO: + return virtioFlags; + case VIR_DOMAIN_SOUND_MODEL_SB16: case VIR_DOMAIN_SOUND_MODEL_PCSPK: case VIR_DOMAIN_SOUND_MODEL_USB: diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index de0867c4b1..9dea33bb53 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -4625,6 +4625,14 @@ qemuValidateDomainDeviceDefSound(virDomainSoundDef *sound, } break; + case VIR_DOMAIN_SOUND_MODEL_VIRTIO: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_SOUND)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("virtio-sound controller is not supported in this QEMU binary")); + return -1; + } + break; + case VIR_DOMAIN_SOUND_MODEL_ES1370: case VIR_DOMAIN_SOUND_MODEL_AC97: case VIR_DOMAIN_SOUND_MODEL_ICH6: -- 2.34.1

Allow generation of command line for virtio-sound-pci and virtio-sound-device devices along with additional virtio options. A new testcase is added to test virtio-sound-pci. The arm-vexpressa9-virtio testcase is also extended to test virtio-sound-device. Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com> --- src/qemu/qemu_command.c | 23 +++++++++- .../arm-vexpressa9-virtio.aarch64-latest.args | 1 + .../arm-vexpressa9-virtio.aarch64-latest.xml | 3 ++ .../qemuxmlconfdata/arm-vexpressa9-virtio.xml | 3 +- .../sound-device-virtio.x86_64-latest.args | 36 +++++++++++++++ .../sound-device-virtio.x86_64-latest.xml | 44 +++++++++++++++++++ tests/qemuxmlconfdata/sound-device-virtio.xml | 28 ++++++++++++ tests/qemuxmlconftest.c | 1 + 8 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 tests/qemuxmlconfdata/sound-device-virtio.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/sound-device-virtio.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/sound-device-virtio.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 5e69e71c6f..b5537d1e8f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -952,8 +952,12 @@ qemuBuildVirtioDevGetConfigDev(const virDomainDeviceDef *device, break; } + case VIR_DOMAIN_DEVICE_SOUND: { + *baseName = "virtio-sound"; + *virtioOptions = device->data.sound->virtio; + } + case VIR_DOMAIN_DEVICE_LEASE: - case VIR_DOMAIN_DEVICE_SOUND: case VIR_DOMAIN_DEVICE_WATCHDOG: case VIR_DOMAIN_DEVICE_GRAPHICS: case VIR_DOMAIN_DEVICE_HUB: @@ -4458,6 +4462,8 @@ qemuBuildSoundDevCmd(virCommand *cmd, const char *model = NULL; g_autofree char *audioid = NULL; virTristateBool multichannel = VIR_TRISTATE_BOOL_ABSENT; + unsigned int streams = 0; + bool virtio = false; switch (sound->model) { case VIR_DOMAIN_SOUND_MODEL_ES1370: @@ -4480,6 +4486,9 @@ qemuBuildSoundDevCmd(virCommand *cmd, model = "sb16"; break; case VIR_DOMAIN_SOUND_MODEL_VIRTIO: + virtio = true; + streams = sound->streams; + break; case VIR_DOMAIN_SOUND_MODEL_PCSPK: /* pc-speaker is handled separately */ case VIR_DOMAIN_SOUND_MODEL_ICH7: case VIR_DOMAIN_SOUND_MODEL_LAST: @@ -4491,11 +4500,21 @@ qemuBuildSoundDevCmd(virCommand *cmd, return -1; } + if (!virtio) { + if (virJSONValueObjectAdd(&props, + "s:driver", model, + NULL) < 0) + return -1; + } else { + if (!(props = qemuBuildVirtioDevProps(VIR_DOMAIN_DEVICE_SOUND, sound, qemuCaps))) + return -1; + } + if (virJSONValueObjectAdd(&props, - "s:driver", model, "s:id", sound->info.alias, "S:audiodev", audioid, "T:multi", multichannel, + "p:streams", streams, NULL) < 0) return -1; diff --git a/tests/qemuxmlconfdata/arm-vexpressa9-virtio.aarch64-latest.args b/tests/qemuxmlconfdata/arm-vexpressa9-virtio.aarch64-latest.args index b4c295be6b..4ed442364c 100644 --- a/tests/qemuxmlconfdata/arm-vexpressa9-virtio.aarch64-latest.args +++ b/tests/qemuxmlconfdata/arm-vexpressa9-virtio.aarch64-latest.args @@ -41,6 +41,7 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-armtest/.config \ -chardev pty,id=charconsole1 \ -device '{"driver":"virtconsole","chardev":"charconsole1","id":"console1"}' \ -audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-sound-device","id":"sound0","audiodev":"audio1","streams":2}' \ -device '{"driver":"virtio-balloon-device","id":"balloon0"}' \ -object '{"qom-type":"rng-random","id":"objrng0","filename":"/dev/random"}' \ -device '{"driver":"virtio-rng-device","rng":"objrng0","id":"rng0"}' \ diff --git a/tests/qemuxmlconfdata/arm-vexpressa9-virtio.aarch64-latest.xml b/tests/qemuxmlconfdata/arm-vexpressa9-virtio.aarch64-latest.xml index 097525c6c8..fd8cf9aa76 100644 --- a/tests/qemuxmlconfdata/arm-vexpressa9-virtio.aarch64-latest.xml +++ b/tests/qemuxmlconfdata/arm-vexpressa9-virtio.aarch64-latest.xml @@ -44,6 +44,9 @@ <console type='pty'> <target type='virtio' port='1'/> </console> + <sound model='virtio' streams='2'> + <address type='virtio-mmio'/> + </sound> <audio id='1' type='none'/> <memballoon model='virtio'> <address type='virtio-mmio'/> diff --git a/tests/qemuxmlconfdata/arm-vexpressa9-virtio.xml b/tests/qemuxmlconfdata/arm-vexpressa9-virtio.xml index 0c4b2b6954..f9deadf2e8 100644 --- a/tests/qemuxmlconfdata/arm-vexpressa9-virtio.xml +++ b/tests/qemuxmlconfdata/arm-vexpressa9-virtio.xml @@ -32,9 +32,10 @@ <memballoon model='virtio'/> <!-- This actually doesn't work in practice because vexpress only has - 4 virtio slots available, rng makes 5 --> + 4 virtio slots available, rng and sound makes 6 --> <rng model='virtio'> <backend model='random'>/dev/random</backend> </rng> + <sound model='virtio'/> </devices> </domain> diff --git a/tests/qemuxmlconfdata/sound-device-virtio.x86_64-latest.args b/tests/qemuxmlconfdata/sound-device-virtio.x86_64-latest.args new file mode 100644 index 0000000000..cca0069c64 --- /dev/null +++ b/tests/qemuxmlconfdata/sound-device-virtio.x86_64-latest.args @@ -0,0 +1,36 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-x86_64 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ +-accel tcg \ +-cpu qemu64 \ +-m size=219136k \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-sound-pci","id":"sound0","audiodev":"audio1","streams":2,"bus":"pci.0","addr":"0x2"}' \ +-device '{"driver":"virtio-sound-pci","id":"sound1","audiodev":"audio1","streams":4,"bus":"pci.0","addr":"0x3"}' \ +-device '{"driver":"virtio-sound-pci","iommu_platform":true,"packed":true,"id":"sound2","audiodev":"audio1","streams":2,"bus":"pci.0","addr":"0x4"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x5"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxmlconfdata/sound-device-virtio.x86_64-latest.xml b/tests/qemuxmlconfdata/sound-device-virtio.x86_64-latest.xml new file mode 100644 index 0000000000..a125cb8df8 --- /dev/null +++ b/tests/qemuxmlconfdata/sound-device-virtio.x86_64-latest.xml @@ -0,0 +1,44 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <controller type='usb' index='0' model='piix3-uhci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='ide' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <sound model='virtio' streams='2'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </sound> + <sound model='virtio' streams='4'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </sound> + <sound model='virtio' streams='2'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + <driver iommu='on' packed='on'/> + </sound> + <audio id='1' type='none'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxmlconfdata/sound-device-virtio.xml b/tests/qemuxmlconfdata/sound-device-virtio.xml new file mode 100644 index 0000000000..c8322d7e5b --- /dev/null +++ b/tests/qemuxmlconfdata/sound-device-virtio.xml @@ -0,0 +1,28 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <controller type='usb' index='0'/> + <controller type='ide' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <sound model='virtio'/> + <sound model='virtio' streams='4'/> + <sound model='virtio'> + <driver iommu='on' packed='on'/> + </sound> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index 1f9e8edef9..c41bd7f792 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -2980,6 +2980,7 @@ mymain(void) DO_TEST_CAPS_LATEST("mtp-usb-device") DO_TEST_CAPS_LATEST("net-usb") + DO_TEST_CAPS_LATEST("sound-device-virtio") /* check that all input files were actually used here */ if (testConfXMLCheck(existingTestCases) < 0) -- 2.34.1
participants (1)
-
Rayhan Faizel