Please ignore this patch. Sorry to bother. Luo Xionghu Best Regards
-----Original Message----- From: Luo, Xionghu Sent: Tuesday, August 29, 2017 9:34 AM To: [email protected] Cc: Luo, Xionghu <[email protected]> Subject: [PATCH] virtio-audio: add virtio audio device emulation From: Luo Xionghu <[email protected]> this patch only add audio device pci registration. need add audio part to call audio Backend driver later. Signed-off-by: Luo Xionghu <[email protected]> --- hw/virtio/Makefile.objs | 1 + hw/virtio/virtio-audio.c | 150 ++++++++++++++++++++++++++ hw/virtio/virtio-pci.c | 49 +++++++++ hw/virtio/virtio-pci.h | 13 +++ include/hw/pci/pci.h | 1 + include/hw/virtio/virtio-audio.h | 61 +++++++++++ include/standard-headers/linux/virtio_audio.h | 9 ++ include/standard-headers/linux/virtio_ids.h | 1 + 8 files changed, 285 insertions(+) create mode 100644 hw/virtio/virtio-audio.c create mode 100644 include/hw/virtio/virtio-audio.h create mode 100644 include/standard-headers/linux/virtio_audio.h diff --git a/hw/virtio/Makefile.objs b/hw/virtio/Makefile.objs index 765d363c1f..a1f3136fd4 100644 --- a/hw/virtio/Makefile.objs +++ b/hw/virtio/Makefile.objs @@ -9,6 +9,7 @@ obj-$(CONFIG_LINUX) += vhost.o vhost-backend.o vhost-user.o obj-$(CONFIG_VHOST_VSOCK) += vhost-vsock.o obj-y += virtio-crypto.o obj-$(CONFIG_VIRTIO_PCI) += virtio-crypto-pci.o +obj-y += virtio-audio.o endif common-obj-$(call lnot,$(CONFIG_LINUX)) += vhost-stub.o diff --git a/hw/virtio/virtio-audio.c b/hw/virtio/virtio-audio.c new file mode 100644 index 0000000000..784fed1e12 --- /dev/null +++ b/hw/virtio/virtio-audio.c @@ -0,0 +1,150 @@ +/* + * Virtio audio Support + * + * Copyright (c) 2017 Intel Corperation. + * + * Authors: + * Luo Xionghu<[email protected]> + * Liam Girdwood <[email protected]> + * + * 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 "qemu/iov.h" +#include "qemu/timer.h" +#include "qemu-common.h" +#include "hw/virtio/virtio.h" +#include "hw/i386/pc.h" +#include "hw/virtio/virtio-audio.h" +#include "sysemu/kvm.h" +#include "exec/address-spaces.h" +#include "qapi/visitor.h" +#include "qapi-event.h" +#include "trace.h" + +#include "hw/virtio/virtio-bus.h" +#include "hw/virtio/virtio-access.h" + +static void virtio_audio_reset(VirtIODevice *vdev) { + +} + +static void virtio_audio_set_status(VirtIODevice *vdev, uint8_t status) +{ + +} + +static uint64_t virtio_audio_get_features(VirtIODevice *vdev, uint64_t f, + Error **errp) { + + return 0; +} + +static void virtio_audio_set_config(VirtIODevice *vdev, + const uint8_t *config_data) { + +} + +static void virtio_audio_get_config(VirtIODevice *vdev, uint8_t +*config_data) { + +} + +static const VMStateDescription vmstate_virtio_audio = { + .name = "virtio-audio", + .minimum_version_id = 1, + .version_id = 1, + .fields = (VMStateField[]) { + VMSTATE_VIRTIO_DEVICE, + VMSTATE_END_OF_LIST() + }, +}; + +static Property virtio_audio_properties[] = { + DEFINE_PROP_END_OF_LIST(), +}; + +static void virtio_audio_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq) +{ + +} + +static void virtio_audio_handle_rx(VirtIODevice *vdev, VirtQueue *vq) { + +} + +static void virtio_audio_handle_tx_bh(VirtIODevice *vdev, VirtQueue +*vq) { + +} + +static void virtio_audio_device_realize(DeviceState *dev, Error **errp) +{ + VirtIODevice *vdev = VIRTIO_DEVICE(dev); + VirtIOAudio *vaudio = VIRTIO_AUDIO(dev); + + virtio_init(vdev, "virtio-audio", VIRTIO_ID_AUDIO, + sizeof(struct virtio_audio_config)); + + vaudio->rx_vq = virtio_add_queue(vdev, 128, virtio_audio_handle_rx); + vaudio->tx_vq = virtio_add_queue(vdev, 128, virtio_audio_handle_tx_bh); + vaudio->ctrl_vq = virtio_add_queue(vdev, 64, +virtio_audio_handle_ctrl); } + +static void virtio_audio_device_unrealize(DeviceState *dev, Error +**errp) { + VirtIODevice *vdev = VIRTIO_DEVICE(dev); + //VirtIOAudio *vaudio = VIRTIO_AUDIO(dev); + + virtio_del_queue(vdev, 3); + virtio_cleanup(vdev); +} + +static void virtio_audio_class_init(ObjectClass *klass, void *data) { + DeviceClass *dc = DEVICE_CLASS(klass); + VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass); + + dc->props = virtio_audio_properties; + dc->vmsd = &vmstate_virtio_audio; + set_bit(DEVICE_CATEGORY_SOUND, dc->categories); + vdc->realize = virtio_audio_device_realize; + vdc->unrealize = virtio_audio_device_unrealize; + vdc->get_config = virtio_audio_get_config; + vdc->set_config = virtio_audio_set_config; + vdc->get_features = virtio_audio_get_features; + vdc->set_status = virtio_audio_set_status; + vdc->reset = virtio_audio_reset; +} + +static void virtio_audio_instance_init(Object *obj) { + VirtIOAudio *vaudio = VIRTIO_AUDIO(obj); + + /* + * The default config_size is sizeof(struct virtio_audio_config). + * Can be overriden with virtio_audio_set_config_size. + */ + vaudio->config_size = sizeof(struct virtio_audio_config); } + +static const TypeInfo virtio_audio_info = { + .name = TYPE_VIRTIO_AUDIO, + .parent = TYPE_VIRTIO_DEVICE, + .instance_size = sizeof(VirtIOAudio), + .instance_init = virtio_audio_instance_init, + .class_init = virtio_audio_class_init, }; + +static void virtio_register_types(void) { + type_register_static(&virtio_audio_info); +} + +type_init(virtio_register_types) diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index 8b0d6b69cd..adf7a2ed08 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -25,6 +25,7 @@ #include "hw/virtio/virtio-scsi.h" #include "hw/virtio/virtio-balloon.h" #include "hw/virtio/virtio-input.h" +#include "hw/virtio/virtio-audio.h" #include "hw/pci/pci.h" #include "qapi/error.h" #include "qemu/error-report.h" @@ -2473,6 +2474,53 @@ static const TypeInfo virtio_rng_pci_info = { .class_init = virtio_rng_pci_class_init, }; +/* virtio-audio-pci */ + +static void virtio_audio_pci_realize(VirtIOPCIProxy *vpci_dev, Error +**errp) { + VirtIOAudioPCI *vaudio = VIRTIO_AUDIO_PCI(vpci_dev); + DeviceState *vdev = DEVICE(&vaudio->vdev); + Error *err = NULL; + + qdev_set_parent_bus(vdev, BUS(&vpci_dev->bus)); + object_property_set_bool(OBJECT(vdev), true, "realized", &err); + if (err) { + error_propagate(errp, err); + return; + } +} + +static void virtio_audio_pci_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass); + PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass); + + k->realize = virtio_audio_pci_realize; + set_bit(DEVICE_CATEGORY_SOUND, dc->categories); + + pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET; + pcidev_k->device_id = PCI_DEVICE_ID_VIRTIO_AUDIO; + pcidev_k->revision = VIRTIO_PCI_ABI_VERSION; + pcidev_k->class_id = PCI_CLASS_OTHERS; } + +static void virtio_audio_initfn(Object *obj) { + VirtIOAudioPCI *dev = VIRTIO_AUDIO_PCI(obj); + + virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), + TYPE_VIRTIO_AUDIO); } + +static const TypeInfo virtio_audio_pci_info = { + .name = TYPE_VIRTIO_AUDIO_PCI, + .parent = TYPE_VIRTIO_PCI, + .instance_size = sizeof(VirtIOAudioPCI), + .instance_init = virtio_audio_initfn, + .class_init = virtio_audio_pci_class_init, +}; + /* virtio-input-pci */ static Property virtio_input_pci_properties[] = { @@ -2662,6 +2710,7 @@ static void virtio_pci_register_types(void) type_register_static(&virtio_balloon_pci_info); type_register_static(&virtio_serial_pci_info); type_register_static(&virtio_net_pci_info); + type_register_static(&virtio_audio_pci_info); #ifdef CONFIG_VHOST_SCSI type_register_static(&vhost_scsi_pci_info); #endif diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h index 69f5959623..9a6a51f118 100644 --- a/hw/virtio/virtio-pci.h +++ b/hw/virtio/virtio-pci.h @@ -27,6 +27,7 @@ #include "hw/virtio/virtio-gpu.h" #include "hw/virtio/virtio-crypto.h" #include "hw/virtio/vhost-user-scsi.h" +#include "hw/virtio/virtio-audio.h" #ifdef CONFIG_VIRTFS #include "hw/9pfs/virtio-9p.h" @@ -53,6 +54,7 @@ typedef struct VirtIOInputHostPCI VirtIOInputHostPCI; typedef struct VirtIOGPUPCI VirtIOGPUPCI; typedef struct VHostVSockPCI VHostVSockPCI; typedef struct VirtIOCryptoPCI VirtIOCryptoPCI; +typedef struct VirtIOAudioPCI VirtIOAudioPCI; /* virtio-pci-bus */ @@ -392,6 +394,17 @@ struct VirtIOCryptoPCI { VirtIOPCIProxy parent_obj; VirtIOCrypto vdev; }; +/* + * virtio-audio-pci: This extends VirtioPCIProxy. + */ +#define TYPE_VIRTIO_AUDIO_PCI "virtio-audio-pci" +#define VIRTIO_AUDIO_PCI(obj) \ + OBJECT_CHECK(VirtIOAudioPCI, (obj), TYPE_VIRTIO_AUDIO_PCI) + +struct VirtIOAudioPCI { + VirtIOPCIProxy parent_obj; + VirtIOAudio vdev; +}; /* Virtio ABI version, if we increment this, we break the guest driver. */ #define VIRTIO_PCI_ABI_VERSION 0 diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h index e598b095eb..8b701a3e73 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -81,6 +81,7 @@ #define PCI_DEVICE_ID_VIRTIO_CONSOLE 0x1003 #define PCI_DEVICE_ID_VIRTIO_SCSI 0x1004 #define PCI_DEVICE_ID_VIRTIO_RNG 0x1005 +#define PCI_DEVICE_ID_VIRTIO_AUDIO 0x1006 #define PCI_DEVICE_ID_VIRTIO_9P 0x1009 #define PCI_DEVICE_ID_VIRTIO_VSOCK 0x1012 diff --git a/include/hw/virtio/virtio-audio.h b/include/hw/virtio/virtio-audio.h new file mode 100644 index 0000000000..420238741f --- /dev/null +++ b/include/hw/virtio/virtio-audio.h @@ -0,0 +1,61 @@ +/* + * Virtio audio Support + * + * Copyright (c) 2017 Intel Corperation. + * + * Authors: + * Luo Xionghu<[email protected]> + * Liam Girdwood <[email protected]> + * + * 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. + */ + +#ifndef _QEMU_VIRTIO_AUDIO_H +#define _QEMU_VIRTIO_AUDIO_H + +#include "standard-headers/linux/virtio_audio.h" +#include "hw/virtio/virtio.h" +#include "sysemu/iothread.h" + + +#define DEBUG_VIRTIO_AUDIO 1 + +#define APRINTF(fmt, ...) \ +do { \ + if (DEBUG_VIRTIO_AUDIO) { \ + fprintf(stderr, "virtio_audio: " fmt, ##__VA_ARGS__); \ + } \ +} while (0) + + +#define TYPE_VIRTIO_AUDIO "virtio-audio-device" +#define VIRTIO_AUDIO(obj) \ + OBJECT_CHECK(VirtIOAudio, (obj), TYPE_VIRTIO_AUDIO) #define +VIRTIO_AUDIO_GET_PARENT_CLASS(obj) \ + OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_AUDIO) + +struct virtio_audio_config { + uint32_t status; + +}; + +typedef struct VirtIOAudio { + VirtIODevice parent_obj; + + VirtQueue *vqs; + VirtQueue *rx_vq; + VirtQueue *tx_vq; + VirtQueue *ctrl_vq; + + uint32_t max_queues; + uint32_t status; + + int multiqueue; + uint32_t curr_queues; + size_t config_size; +} VirtIOAudio; + +#endif /* _QEMU_VIRTIO_AUDIO_H */ + diff --git a/include/standard-headers/linux/virtio_audio.h b/include/standard-headers/linux/virtio_audio.h new file mode 100644 index 0000000000..2605e98684 --- /dev/null +++ b/include/standard-headers/linux/virtio_audio.h @@ -0,0 +1,9 @@ +#ifndef _LINUX_VIRTIO_AUDIO_H +#define _LINUX_VIRTIO_AUDIO_H +/* This header is BSD licensed so anyone can use the definitions to +implement + * compatible drivers/servers. */ +#include "standard-headers/linux/virtio_ids.h" +#include "standard-headers/linux/virtio_config.h" + +#endif /* _LINUX_VIRTIO_AUDIO_H */ + diff --git a/include/standard-headers/linux/virtio_ids.h b/include/standard-headers/linux/virtio_ids.h index 6d5c3b2d4f..197a7bb7e6 100644 --- a/include/standard-headers/linux/virtio_ids.h +++ b/include/standard-headers/linux/virtio_ids.h @@ -43,5 +43,6 @@ #define VIRTIO_ID_INPUT 18 /* virtio input */ #define VIRTIO_ID_VSOCK 19 /* virtio vsock transport */ #define VIRTIO_ID_CRYPTO 20 /* virtio crypto */ +#define VIRTIO_ID_AUDIO 21 /* virtio audio */ #endif /* _LINUX_VIRTIO_IDS_H */ -- 2.11.0 _______________________________________________ Beignet mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/beignet
