Message ID | 8de966a86bc21358528eeee66ffe74f8a82bb687.1693252037.git.manos.pitsidianakis@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add VIRTIO sound card | expand |
> This patch adds a PCI wrapper device for the virtio-sound device. > It is necessary to instantiate a virtio-snd device in a guest. > All sound logic will be added to the virtio-snd device in the following > commits. > > To add this device with a guest, you'll need a >=5.13 kernel compiled > with CONFIG_SND_VIRTIO=y, which at the time of writing most distros have > off by default. > > Use with following flags in the invocation: > > Pulseaudio: > -audio driver=pa,model=virtio > or > -audio driver=pa,model=virtio,server=/run/user/1000/pulse/native > sdl: > -audio driver=sdl,model=virtio > coreaudio (macos/darwin): > -audio driver=coreaudio,model=virtio > etc. > > Based-on: https://github.com/OpenSynergy/qemu/commit/5a2f350eec5d157b90d9c7b40a8e603f4da92471 > Reviewed-by: Alex Bennée <alex.bennee@linaro.org> > Signed-off-by: Igor Skalkin <Igor.Skalkin@opensynergy.com> > Signed-off-by: Anton Yakovlev <Anton.Yakovlev@opensynergy.com> > Signed-off-by: Emmanouil Pitsidianakis <manos.pitsidianakis@linaro.org> > --- > hw/virtio/meson.build | 1 + > hw/virtio/virtio-snd-pci.c | 97 ++++++++++++++++++++++++++++++++++++++ > softmmu/qdev-monitor.c | 1 + > 3 files changed, 99 insertions(+) > create mode 100644 hw/virtio/virtio-snd-pci.c > diff --git a/hw/virtio/virtio-snd-pci.c b/hw/virtio/virtio-snd-pci.c > new file mode 100644 > index 0000000000..a6a530d161 > --- /dev/null > +++ b/hw/virtio/virtio-snd-pci.c > @@ -0,0 +1,97 @@ > +/* > + * VIRTIO Sound Device PCI Bindings > + * > + * Copyright (c) 2023 Emmanouil Pitsidianakis <manos.pitsidianakis@linaro.org> > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or > + * (at your option) any later version. See the COPYING file in the > + * top-level directory. > + */ > + > +#include "qemu/osdep.h" > +#include "qapi/error.h" Hi Manos, the macro definition of DECLARE_INSTANCE_CHECKER is in the qom/object.h header file. It's better to include it directly than to rely on another header file to include it. > +#include "hw/audio/soundhw.h" > +#include "hw/virtio/virtio-pci.h" > +#include "hw/virtio/virtio-snd.h" > + > +typedef struct VirtIOSoundPCI VirtIOSoundPCI; > + > +/* > + * virtio-snd-pci: This extends VirtioPCIProxy. > + */ > +#define TYPE_VIRTIO_SND_PCI "virtio-sound-pci" > +DECLARE_INSTANCE_CHECKER(VirtIOSoundPCI, VIRTIO_SND_PCI, > + TYPE_VIRTIO_SND_PCI) > + > +struct VirtIOSoundPCI { > + VirtIOPCIProxy parent; > + VirtIOSound vdev; > +}; > + > +static Property virtio_snd_pci_properties[] = { > + DEFINE_AUDIO_PROPERTIES(VirtIOSoundPCI, vdev.card), I think DEFINE_AUDIO_PROPERTIES should be moved back to virtio-snd.c. The audiodev property is a virtio-sound property and not a virtio-sound-pci property. > + DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, > + VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true), > + DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, > + DEV_NVECTORS_UNSPECIFIED), > + DEFINE_PROP_END_OF_LIST(), > +}; > + > +static void virtio_snd_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp) > +{ > + VirtIOSoundPCI *dev = VIRTIO_SND_PCI(vpci_dev); > + DeviceState *vdev = DEVICE(&dev->vdev); > + > + if (vpci_dev->nvectors == DEV_NVECTORS_UNSPECIFIED) { > + vpci_dev->nvectors = 2; > + } Why do you need that intermediate step with DEV_NVECTORS_UNSPECIFIED? Unlike e.g. virtio-scsi-pci and virtio-net-pci devices, the default value of nvectors is already known at compile time and can be specified in the property definition. With best regards, Volker > + > + virtio_pci_force_virtio_1(vpci_dev); > + qdev_realize(vdev, BUS(&vpci_dev->bus), errp); > +} > + > +static void virtio_snd_pci_class_init(ObjectClass *klass, void *data) > +{ > + DeviceClass *dc = DEVICE_CLASS(klass); > + VirtioPCIClass *vpciklass = VIRTIO_PCI_CLASS(klass); > + > + device_class_set_props(dc, virtio_snd_pci_properties); > + dc->desc = "Virtio Sound"; > + set_bit(DEVICE_CATEGORY_SOUND, dc->categories); > + > + vpciklass->realize = virtio_snd_pci_realize; > +} > + > +static void virtio_snd_pci_instance_init(Object *obj) > +{ > + VirtIOSoundPCI *dev = VIRTIO_SND_PCI(obj); > + > + virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), > + TYPE_VIRTIO_SND); > +} > + > +static const VirtioPCIDeviceTypeInfo virtio_snd_pci_info = { > + .generic_name = TYPE_VIRTIO_SND_PCI, > + .instance_size = sizeof(VirtIOSoundPCI), > + .instance_init = virtio_snd_pci_instance_init, > + .class_init = virtio_snd_pci_class_init, > +}; > + > +/* Create a Virtio Sound PCI device, so '-audio driver,model=virtio' works. */ > +static int virtio_snd_pci_init(PCIBus *bus, const char *audiodev) > +{ > + DeviceState *dev; > + > + dev = qdev_new(TYPE_VIRTIO_SND_PCI); > + qdev_prop_set_string(dev, "audiodev", audiodev); > + qdev_realize_and_unref(dev, BUS(bus), &error_fatal); > + return 0; > +} > + > +static void virtio_snd_pci_register(void) > +{ > + virtio_pci_types_register(&virtio_snd_pci_info); > + pci_register_soundhw("virtio", "Virtio Sound", virtio_snd_pci_init); > +} > + > +type_init(virtio_snd_pci_register); > diff --git a/softmmu/qdev-monitor.c b/softmmu/qdev-monitor.c > index 74f4e41338..2e9835ad88 100644 > --- a/softmmu/qdev-monitor.c > +++ b/softmmu/qdev-monitor.c > @@ -108,6 +108,7 @@ static const QDevAlias qdev_alias_table[] = { > { "virtio-serial-device", "virtio-serial", QEMU_ARCH_VIRTIO_MMIO }, > { "virtio-serial-ccw", "virtio-serial", QEMU_ARCH_VIRTIO_CCW }, > { "virtio-serial-pci", "virtio-serial", QEMU_ARCH_VIRTIO_PCI}, > + { "virtio-sound-pci", "virtio-sound", QEMU_ARCH_VIRTIO_PCI}, > { "virtio-tablet-device", "virtio-tablet", QEMU_ARCH_VIRTIO_MMIO }, > { "virtio-tablet-ccw", "virtio-tablet", QEMU_ARCH_VIRTIO_CCW }, > { "virtio-tablet-pci", "virtio-tablet", QEMU_ARCH_VIRTIO_PCI },
On Mon, 04 Sep 2023 09:32, Volker Rümelin <vr_qemu@t-online.de> wrote: >> +static Property virtio_snd_pci_properties[] = { >> + DEFINE_AUDIO_PROPERTIES(VirtIOSoundPCI, vdev.card), > >I think DEFINE_AUDIO_PROPERTIES should be moved back to virtio-snd.c. >The audiodev property is a virtio-sound property and not a >virtio-sound-pci property. Hm, is it? Can you instantiate a virtio-sound device without the PCI wrapper? Under hw/audio, DEFINE_AUDIO_PROPERTIES is set in PCI devices as well (e.g. ac97) > >> + DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, >> + VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true), >> + DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, >> + DEV_NVECTORS_UNSPECIFIED), >> + DEFINE_PROP_END_OF_LIST(), >> +}; >> + >> +static void virtio_snd_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp) >> +{ >> + VirtIOSoundPCI *dev = VIRTIO_SND_PCI(vpci_dev); >> + DeviceState *vdev = DEVICE(&dev->vdev); >> + >> + if (vpci_dev->nvectors == DEV_NVECTORS_UNSPECIFIED) { >> + vpci_dev->nvectors = 2; >> + } > >Why do you need that intermediate step with DEV_NVECTORS_UNSPECIFIED? >Unlike e.g. virtio-scsi-pci and virtio-net-pci devices, the default >value of nvectors is already known at compile time and can be specified >in the property definition. I did not think this through properly, you are correct. Thank you! Manos
Am 04.09.23 um 12:26 schrieb Manos Pitsidianakis: > On Mon, 04 Sep 2023 09:32, Volker Rümelin <vr_qemu@t-online.de> wrote: >>> +static Property virtio_snd_pci_properties[] = { >>> + DEFINE_AUDIO_PROPERTIES(VirtIOSoundPCI, vdev.card), >> >> I think DEFINE_AUDIO_PROPERTIES should be moved back to virtio-snd.c. >> The audiodev property is a virtio-sound property and not a >> virtio-sound-pci property. > > Hm, is it? Can you instantiate a virtio-sound device without the PCI > wrapper? Under hw/audio, DEFINE_AUDIO_PROPERTIES is set in PCI devices > as well (e.g. ac97) > Creating a virtio-sound device without the PCI wrapper is possible. ./qemu-system-x86_64 -M microvm -accel kvm -cpu host -m 512m -smp 2 -serial stdio -device virtio-sound,audiodev=audio0 -audiodev pipewire,id=audio0 -display gtk qemu-system-x86_64: -device virtio-sound,audiodev=audio0: Property 'virtio-sound.audiodev' not found If you move DEFINE_AUDIO_PROPERTIES to virtio-snd.c you don't see this error message and you can see a virtio-mmio sound device if you type info qtree in the QEMU compat monitor. Now that you asked this question I wonder if this should be #define TYPE_VIRTIO_SND "virtio-sound-device". Other virtio devices have the -device suffix. With best regards, Volker >> >>> + DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, >>> + VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true), >>> + DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, >>> + DEV_NVECTORS_UNSPECIFIED), >>> + DEFINE_PROP_END_OF_LIST(), >>> +}; >>> + >>> +static void virtio_snd_pci_realize(VirtIOPCIProxy *vpci_dev, Error >>> **errp) >>> +{ >>> + VirtIOSoundPCI *dev = VIRTIO_SND_PCI(vpci_dev); >>> + DeviceState *vdev = DEVICE(&dev->vdev); >>> + >>> + if (vpci_dev->nvectors == DEV_NVECTORS_UNSPECIFIED) { >>> + vpci_dev->nvectors = 2; >>> + } >> >> Why do you need that intermediate step with DEV_NVECTORS_UNSPECIFIED? >> Unlike e.g. virtio-scsi-pci and virtio-net-pci devices, the default >> value of nvectors is already known at compile time and can be >> specified in the property definition. > > I did not think this through properly, you are correct. Thank you! > > Manos
On 28/08/2023 20:54, Emmanouil Pitsidianakis wrote: Hi Emmanouil, > This patch adds a PCI wrapper device for the virtio-sound device. > It is necessary to instantiate a virtio-snd device in a guest. > All sound logic will be added to the virtio-snd device in the following > commits. > > To add this device with a guest, you'll need a >=5.13 kernel compiled > with CONFIG_SND_VIRTIO=y, which at the time of writing most distros have > off by default. > > Use with following flags in the invocation: > > Pulseaudio: > -audio driver=pa,model=virtio > or > -audio driver=pa,model=virtio,server=/run/user/1000/pulse/native > sdl: > -audio driver=sdl,model=virtio > coreaudio (macos/darwin): > -audio driver=coreaudio,model=virtio > etc. > > Based-on: https://github.com/OpenSynergy/qemu/commit/5a2f350eec5d157b90d9c7b40a8e603f4da92471 > Reviewed-by: Alex Bennée <alex.bennee@linaro.org> > Signed-off-by: Igor Skalkin <Igor.Skalkin@opensynergy.com> > Signed-off-by: Anton Yakovlev <Anton.Yakovlev@opensynergy.com> > Signed-off-by: Emmanouil Pitsidianakis <manos.pitsidianakis@linaro.org> > --- > hw/virtio/meson.build | 1 + > hw/virtio/virtio-snd-pci.c | 97 ++++++++++++++++++++++++++++++++++++++ > softmmu/qdev-monitor.c | 1 + > 3 files changed, 99 insertions(+) > create mode 100644 hw/virtio/virtio-snd-pci.c > > diff --git a/hw/virtio/meson.build b/hw/virtio/meson.build > index 120d4bfa0a..5e5a83a4ee 100644 > --- a/hw/virtio/meson.build > +++ b/hw/virtio/meson.build > @@ -63,6 +63,7 @@ virtio_pci_ss.add(when: 'CONFIG_VIRTIO_SERIAL', if_true: files('virtio-serial-pc > virtio_pci_ss.add(when: 'CONFIG_VIRTIO_PMEM', if_true: files('virtio-pmem-pci.c')) > virtio_pci_ss.add(when: 'CONFIG_VIRTIO_IOMMU', if_true: files('virtio-iommu-pci.c')) > virtio_pci_ss.add(when: 'CONFIG_VIRTIO_MEM', if_true: files('virtio-mem-pci.c')) > +virtio_pci_ss.add(when: 'CONFIG_VIRTIO_SND', if_true: files('virtio-snd-pci.c')) > virtio_pci_ss.add(when: 'CONFIG_VHOST_VDPA_DEV', if_true: files('vdpa-dev-pci.c')) > virtio_pci_ss.add(when: 'CONFIG_VIRTIO_MD', if_true: files('virtio-md-pci.c')) > > diff --git a/hw/virtio/virtio-snd-pci.c b/hw/virtio/virtio-snd-pci.c > new file mode 100644 > index 0000000000..a6a530d161 > --- /dev/null > +++ b/hw/virtio/virtio-snd-pci.c > @@ -0,0 +1,97 @@ > +/* > + * VIRTIO Sound Device PCI Bindings > + * > + * Copyright (c) 2023 Emmanouil Pitsidianakis <manos.pitsidianakis@linaro.org> > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or > + * (at your option) any later version. See the COPYING file in the > + * top-level directory. > + */ > + > +#include "qemu/osdep.h" > +#include "qapi/error.h" > +#include "hw/audio/soundhw.h" > +#include "hw/virtio/virtio-pci.h" > +#include "hw/virtio/virtio-snd.h" > + > +typedef struct VirtIOSoundPCI VirtIOSoundPCI; You can drop the typedef here. > +/* > + * virtio-snd-pci: This extends VirtioPCIProxy. > + */ > +#define TYPE_VIRTIO_SND_PCI "virtio-sound-pci" > +DECLARE_INSTANCE_CHECKER(VirtIOSoundPCI, VIRTIO_SND_PCI, > + TYPE_VIRTIO_SND_PCI) and you should be able to use OBJECT_DECLARE_SIMPLE_TYPE() here instead. > +struct VirtIOSoundPCI { > + VirtIOPCIProxy parent; This should be parent_obj, followed by an empty line (see https://qemu.readthedocs.io/en/master/devel/style.html#qemu-object-model-declarations). > + VirtIOSound vdev; > +}; > + > +static Property virtio_snd_pci_properties[] = { > + DEFINE_AUDIO_PROPERTIES(VirtIOSoundPCI, vdev.card), > + DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, > + VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true), > + DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, > + DEV_NVECTORS_UNSPECIFIED), > + DEFINE_PROP_END_OF_LIST(), > +}; > + > +static void virtio_snd_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp) > +{ > + VirtIOSoundPCI *dev = VIRTIO_SND_PCI(vpci_dev); > + DeviceState *vdev = DEVICE(&dev->vdev); > + > + if (vpci_dev->nvectors == DEV_NVECTORS_UNSPECIFIED) { > + vpci_dev->nvectors = 2; > + } > + > + virtio_pci_force_virtio_1(vpci_dev); > + qdev_realize(vdev, BUS(&vpci_dev->bus), errp); > +} > + > +static void virtio_snd_pci_class_init(ObjectClass *klass, void *data) > +{ > + DeviceClass *dc = DEVICE_CLASS(klass); > + VirtioPCIClass *vpciklass = VIRTIO_PCI_CLASS(klass); > + > + device_class_set_props(dc, virtio_snd_pci_properties); > + dc->desc = "Virtio Sound"; > + set_bit(DEVICE_CATEGORY_SOUND, dc->categories); > + > + vpciklass->realize = virtio_snd_pci_realize; > +} > + > +static void virtio_snd_pci_instance_init(Object *obj) > +{ > + VirtIOSoundPCI *dev = VIRTIO_SND_PCI(obj); > + > + virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), > + TYPE_VIRTIO_SND); > +} > + > +static const VirtioPCIDeviceTypeInfo virtio_snd_pci_info = { > + .generic_name = TYPE_VIRTIO_SND_PCI, > + .instance_size = sizeof(VirtIOSoundPCI), > + .instance_init = virtio_snd_pci_instance_init, > + .class_init = virtio_snd_pci_class_init, > +}; > + > +/* Create a Virtio Sound PCI device, so '-audio driver,model=virtio' works. */ > +static int virtio_snd_pci_init(PCIBus *bus, const char *audiodev) > +{ > + DeviceState *dev; > + > + dev = qdev_new(TYPE_VIRTIO_SND_PCI); > + qdev_prop_set_string(dev, "audiodev", audiodev); > + qdev_realize_and_unref(dev, BUS(bus), &error_fatal); > + return 0; > +} > + > +static void virtio_snd_pci_register(void) > +{ > + virtio_pci_types_register(&virtio_snd_pci_info); > + pci_register_soundhw("virtio", "Virtio Sound", virtio_snd_pci_init); > +} > + > +type_init(virtio_snd_pci_register); > diff --git a/softmmu/qdev-monitor.c b/softmmu/qdev-monitor.c > index 74f4e41338..2e9835ad88 100644 > --- a/softmmu/qdev-monitor.c > +++ b/softmmu/qdev-monitor.c > @@ -108,6 +108,7 @@ static const QDevAlias qdev_alias_table[] = { > { "virtio-serial-device", "virtio-serial", QEMU_ARCH_VIRTIO_MMIO }, > { "virtio-serial-ccw", "virtio-serial", QEMU_ARCH_VIRTIO_CCW }, > { "virtio-serial-pci", "virtio-serial", QEMU_ARCH_VIRTIO_PCI}, > + { "virtio-sound-pci", "virtio-sound", QEMU_ARCH_VIRTIO_PCI}, > { "virtio-tablet-device", "virtio-tablet", QEMU_ARCH_VIRTIO_MMIO }, > { "virtio-tablet-ccw", "virtio-tablet", QEMU_ARCH_VIRTIO_CCW }, > { "virtio-tablet-pci", "virtio-tablet", QEMU_ARCH_VIRTIO_PCI }, ATB, Mark.
diff --git a/hw/virtio/meson.build b/hw/virtio/meson.build index 120d4bfa0a..5e5a83a4ee 100644 --- a/hw/virtio/meson.build +++ b/hw/virtio/meson.build @@ -63,6 +63,7 @@ virtio_pci_ss.add(when: 'CONFIG_VIRTIO_SERIAL', if_true: files('virtio-serial-pc virtio_pci_ss.add(when: 'CONFIG_VIRTIO_PMEM', if_true: files('virtio-pmem-pci.c')) virtio_pci_ss.add(when: 'CONFIG_VIRTIO_IOMMU', if_true: files('virtio-iommu-pci.c')) virtio_pci_ss.add(when: 'CONFIG_VIRTIO_MEM', if_true: files('virtio-mem-pci.c')) +virtio_pci_ss.add(when: 'CONFIG_VIRTIO_SND', if_true: files('virtio-snd-pci.c')) virtio_pci_ss.add(when: 'CONFIG_VHOST_VDPA_DEV', if_true: files('vdpa-dev-pci.c')) virtio_pci_ss.add(when: 'CONFIG_VIRTIO_MD', if_true: files('virtio-md-pci.c')) diff --git a/hw/virtio/virtio-snd-pci.c b/hw/virtio/virtio-snd-pci.c new file mode 100644 index 0000000000..a6a530d161 --- /dev/null +++ b/hw/virtio/virtio-snd-pci.c @@ -0,0 +1,97 @@ +/* + * VIRTIO Sound Device PCI Bindings + * + * Copyright (c) 2023 Emmanouil Pitsidianakis <manos.pitsidianakis@linaro.org> + * + * This work is licensed under the terms of the GNU GPL, version 2 or + * (at your option) any later version. See the COPYING file in the + * top-level directory. + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "hw/audio/soundhw.h" +#include "hw/virtio/virtio-pci.h" +#include "hw/virtio/virtio-snd.h" + +typedef struct VirtIOSoundPCI VirtIOSoundPCI; + +/* + * virtio-snd-pci: This extends VirtioPCIProxy. + */ +#define TYPE_VIRTIO_SND_PCI "virtio-sound-pci" +DECLARE_INSTANCE_CHECKER(VirtIOSoundPCI, VIRTIO_SND_PCI, + TYPE_VIRTIO_SND_PCI) + +struct VirtIOSoundPCI { + VirtIOPCIProxy parent; + VirtIOSound vdev; +}; + +static Property virtio_snd_pci_properties[] = { + DEFINE_AUDIO_PROPERTIES(VirtIOSoundPCI, vdev.card), + DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, + VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true), + DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, + DEV_NVECTORS_UNSPECIFIED), + DEFINE_PROP_END_OF_LIST(), +}; + +static void virtio_snd_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp) +{ + VirtIOSoundPCI *dev = VIRTIO_SND_PCI(vpci_dev); + DeviceState *vdev = DEVICE(&dev->vdev); + + if (vpci_dev->nvectors == DEV_NVECTORS_UNSPECIFIED) { + vpci_dev->nvectors = 2; + } + + virtio_pci_force_virtio_1(vpci_dev); + qdev_realize(vdev, BUS(&vpci_dev->bus), errp); +} + +static void virtio_snd_pci_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + VirtioPCIClass *vpciklass = VIRTIO_PCI_CLASS(klass); + + device_class_set_props(dc, virtio_snd_pci_properties); + dc->desc = "Virtio Sound"; + set_bit(DEVICE_CATEGORY_SOUND, dc->categories); + + vpciklass->realize = virtio_snd_pci_realize; +} + +static void virtio_snd_pci_instance_init(Object *obj) +{ + VirtIOSoundPCI *dev = VIRTIO_SND_PCI(obj); + + virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), + TYPE_VIRTIO_SND); +} + +static const VirtioPCIDeviceTypeInfo virtio_snd_pci_info = { + .generic_name = TYPE_VIRTIO_SND_PCI, + .instance_size = sizeof(VirtIOSoundPCI), + .instance_init = virtio_snd_pci_instance_init, + .class_init = virtio_snd_pci_class_init, +}; + +/* Create a Virtio Sound PCI device, so '-audio driver,model=virtio' works. */ +static int virtio_snd_pci_init(PCIBus *bus, const char *audiodev) +{ + DeviceState *dev; + + dev = qdev_new(TYPE_VIRTIO_SND_PCI); + qdev_prop_set_string(dev, "audiodev", audiodev); + qdev_realize_and_unref(dev, BUS(bus), &error_fatal); + return 0; +} + +static void virtio_snd_pci_register(void) +{ + virtio_pci_types_register(&virtio_snd_pci_info); + pci_register_soundhw("virtio", "Virtio Sound", virtio_snd_pci_init); +} + +type_init(virtio_snd_pci_register); diff --git a/softmmu/qdev-monitor.c b/softmmu/qdev-monitor.c index 74f4e41338..2e9835ad88 100644 --- a/softmmu/qdev-monitor.c +++ b/softmmu/qdev-monitor.c @@ -108,6 +108,7 @@ static const QDevAlias qdev_alias_table[] = { { "virtio-serial-device", "virtio-serial", QEMU_ARCH_VIRTIO_MMIO }, { "virtio-serial-ccw", "virtio-serial", QEMU_ARCH_VIRTIO_CCW }, { "virtio-serial-pci", "virtio-serial", QEMU_ARCH_VIRTIO_PCI}, + { "virtio-sound-pci", "virtio-sound", QEMU_ARCH_VIRTIO_PCI}, { "virtio-tablet-device", "virtio-tablet", QEMU_ARCH_VIRTIO_MMIO }, { "virtio-tablet-ccw", "virtio-tablet", QEMU_ARCH_VIRTIO_CCW }, { "virtio-tablet-pci", "virtio-tablet", QEMU_ARCH_VIRTIO_PCI },