From nobody Sat Feb 7 04:47:31 2026 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1712849334486110.15456175769077; Thu, 11 Apr 2024 08:28:54 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 6E5D617A8; Thu, 11 Apr 2024 11:28:53 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 90F53180E; Thu, 11 Apr 2024 11:25:53 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 159C9607; Thu, 11 Apr 2024 11:25:44 -0400 (EDT) Received: from mail-ed1-f54.google.com (mail-ed1-f54.google.com [209.85.208.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 69CD4175B for ; Thu, 11 Apr 2024 11:25:42 -0400 (EDT) Received: by mail-ed1-f54.google.com with SMTP id 4fb4d7f45d1cf-56e23bbe06bso2183186a12.0 for ; Thu, 11 Apr 2024 08:25:42 -0700 (PDT) Received: from localhost.localdomain ([195.29.209.28]) by smtp.gmail.com with ESMTPSA id c7-20020a056402120700b0056c051e59bfsm781648edw.9.2024.04.11.08.25.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Apr 2024 08:25:40 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=DKIM_ADSP_CUSTOM_MED, FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712849141; x=1713453941; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=T1MzIJkCukeE9xeJs2YfgU6GDOyzzOT4Ifts1o26rVY=; b=hAeIjdJA39OHoQtJKWpjd2zxRV9WlFwBdYl8Yv/KVnJJMiQcntvTMzplbsTN9tdTnM OGZMIdRfodrFoCkR8saAaFtyKCdrVsXmxDgEZP1p58yBLfqUY5AH+poe53NNuMrA31dn quMSwh4xm3uwItkVIQjhJnBdyqPQD+JFeX6AgLZVxT7i0DvehY0NMHIQK+WFU2Au0aW+ Dwb3I6MiYC7Rk2OvkIbiyAMvpH8uW3ayW3JlYbNJBgstcucK0K53GmFiAsVlAJdZ/SeZ +0XbmNVoEOFs0FuqA7tguZravzepXCOl4hf02D8oUYrP/UfvlrWIanRQtdQW9/0q56M8 lUdQ== X-Gm-Message-State: AOJu0Yz/xg9/58zdGzWspVkZVgJiUFluggZrmKkYY6q+rIBO9qxjmLUh y9X93Gt6g+Y3atyuTsD6/+2ZmXlnuaDc5qW0UjwXAMCfXMig4b80aDOYzpzz91A= X-Google-Smtp-Source: AGHT+IFw5Z1lqxsaGHN+dCcZCbNYt4Nmb+nZmJpgCn4WgQFp+NdJBsn+W0SZ23EoFMwXjKSkbglgcw== X-Received: by 2002:a50:99cf:0:b0:56b:829a:38e3 with SMTP id n15-20020a5099cf000000b0056b829a38e3mr108069edb.16.1712849140557; Thu, 11 Apr 2024 08:25:40 -0700 (PDT) From: Rayhan Faizel To: devel@lists.libvirt.org Subject: [PATCH 2/3] conf: Introduce support for virtio-sound devices Date: Thu, 11 Apr 2024 20:54:51 +0530 Message-Id: <20240411152452.75541-3-rayhan.faizel@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240411152452.75541-1-rayhan.faizel@gmail.com> References: <20240411152452.75541-1-rayhan.faizel@gmail.com> MIME-Version: 1.0 Message-ID-Hash: EEYSSVWGYOYRUL5TYFVINPGBMSEI7ZFS X-Message-ID-Hash: EEYSSVWGYOYRUL5TYFVINPGBMSEI7ZFS X-MailFrom: rayhan.faizel@gmail.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Rayhan Faizel X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1712849335102100001 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 chm= aps parameters but these are currently stubbed, hence they are excluded in this patch series. Signed-off-by: Rayhan Faizel --- 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 ``i= ch7`` - (: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`). =20 :since:`Since 0.9.13`, a sound element with ``ich6`` or ``ich9`` models ca= n have optional sub-elements ```` to attach various audio codecs to the au= dio @@ -7419,6 +7420,12 @@ multi-channel mode by using the ``multichannel`` att= ribute:: =20 =20 +:since:`Since 10.3.0 and QEMU 8.2.0` the number of PCM streams in a ``virt= io`` +sound device can be configured by using the ``streams`` attribute, which +defaults to ``2`` if left unspecified:: + + + Each ``sound`` element has an optional sub-element ``
`` which can= tie the device to a particular PCI slot. See `Device Addresses`_. =20 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", ); =20 VIR_ENUM_IMPL(virDomainAudioType, @@ -3211,6 +3212,7 @@ void virDomainSoundDefFree(virDomainSoundDef *def) virDomainSoundCodecDefFree(def->codecs[i]); g_free(def->codecs); =20 + g_free(def->virtio); g_free(def); } =20 @@ -11881,6 +11883,13 @@ virDomainSoundDefParseXML(virDomainXMLOption *xmlo= pt, return NULL; } =20 + if (def->model =3D=3D VIR_DOMAIN_SOUND_MODEL_VIRTIO) { + if (virXMLPropUInt(node, "streams", 10, + VIR_XML_PROP_NONZERO, + &def->streams) < 0) + return NULL; + } + audioNode =3D virXPathNode("./audio", ctxt); if (audioNode) { if (virXMLPropUInt(audioNode, "id", 10, @@ -11892,6 +11901,10 @@ virDomainSoundDefParseXML(virDomainXMLOption *xmlo= pt, if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, &def->info, flags)= < 0) return NULL; =20 + if (virDomainVirtioOptionsParseXML(virXPathNode("./driver", ctxt), + &def->virtio) < 0) + return NULL; + return g_steal_pointer(&def); } =20 @@ -11916,6 +11929,9 @@ virDomainSoundDefEquals(const virDomainSoundDef *a, if (a->multichannel !=3D b->multichannel) return false; =20 + if (a->streams !=3D b->streams) + return false; + if (a->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && !virDomainDeviceInfoAddressIsEqual(&a->info, &b->info)) return false; @@ -24836,6 +24852,7 @@ virDomainSoundDefFormat(virBuffer *buf, const char *model =3D virDomainSoundModelTypeToString(def->model); g_auto(virBuffer) childBuf =3D VIR_BUFFER_INIT_CHILD(buf); g_auto(virBuffer) attrBuf =3D VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) driverAttrBuf =3D VIR_BUFFER_INITIALIZER; size_t i; =20 if (!model) { @@ -24860,6 +24877,14 @@ virDomainSoundDefFormat(virBuffer *buf, virTristateBoolTypeToString(def->multichannel)); } =20 + if (def->model =3D=3D VIR_DOMAIN_SOUND_MODEL_VIRTIO) { + virBufferAsprintf(&attrBuf, " streams=3D'%d'", def->streams); + + virDomainVirtioOptionsFormat(&driverAttrBuf, def->virtio); + + virXMLFormatElement(&childBuf, "driver", &driverAttrBuf, NULL); + } + virXMLFormatElement(buf, "sound", &attrBuf, &childBuf); =20 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, =20 VIR_DOMAIN_SOUND_MODEL_LAST } virDomainSoundModel; @@ -1586,6 +1587,9 @@ struct _virDomainSoundDef { virTristateBool multichannel; =20 unsigned int audioId; + + unsigned int streams; + virDomainVirtioOptions *virtio; }; =20 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, } } =20 +static void +virDomainSoundDefPostParse(virDomainSoundDef *sound) +{ + if (sound->model =3D=3D VIR_DOMAIN_SOUND_MODEL_VIRTIO && sound->stream= s =3D=3D 0) + sound->streams =3D 2; +} + static int virDomainDeviceDefPostParseCommon(virDomainDeviceDef *dev, const virDomainDef *def, @@ -730,9 +737,13 @@ virDomainDeviceDefPostParseCommon(virDomainDeviceDef *= dev, ret =3D 0; break; =20 + case VIR_DOMAIN_DEVICE_SOUND: + virDomainSoundDefPostParse(dev->data.sound); + ret =3D 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/domaincom= mon.rng index f386e46fae..5cdd8328b6 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -5057,6 +5057,7 @@ ich7 ich9 usb + virtio @@ -5064,6 +5065,11 @@ + + + + + @@ -5084,6 +5090,11 @@ + + + + + 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 =3D "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 =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TY= PE_NONE) def->cryptos[i]->info.type =3D type; } + + for (i =3D 0; i < def->nsounds; i++) { + if (def->sounds[i]->info.type =3D=3D VIR_DOMAIN_DEVICE_ADDRESS_TYP= E_NONE && + def->sounds[i]->model =3D=3D VIR_DOMAIN_SOUND_MODEL_VIRTIO) + def->sounds[i]->info.type =3D type; + } } =20 =20 @@ -694,6 +700,9 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDevic= eDef *dev, case VIR_DOMAIN_SOUND_MODEL_ICH9: return pciFlags; =20 + 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; =20 + 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: --=20 2.34.1 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org