-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a new VIRTIO device for the virtio sound device id. Functionality will be added in the following commits. Based-on: OpenSynergy@5a2f350 Signed-off-by: Igor Skalkin <Igor.Skalkin@opensynergy.com> Signed-off-by: Anton Yakovlev <Anton.Yakovlev@opensynergy.com> Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Tested-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <f9678a41fe97b5886c1b04795f1be046509de866.1698062525.git.manos.pitsidianakis@linaro.org> Acked-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
- Loading branch information
Showing
7 changed files
with
335 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -50,3 +50,8 @@ config CS4231 | |
|
||
config ASC | ||
bool | ||
|
||
config VIRTIO_SND | ||
bool | ||
default y | ||
depends on VIRTIO |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,233 @@ | ||
/* | ||
* VIRTIO Sound Device conforming to | ||
* | ||
* "Virtual I/O Device (VIRTIO) Version 1.2 | ||
* Committee Specification Draft 01 | ||
* 09 May 2022" | ||
* | ||
* <https://docs.oasis-open.org/virtio/virtio/v1.2/csd01/virtio-v1.2-csd01.html#x1-52900014> | ||
* | ||
* Copyright (c) 2023 Emmanouil Pitsidianakis <manos.pitsidianakis@linaro.org> | ||
* Copyright (C) 2019 OpenSynergy GmbH | ||
* | ||
* 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/log.h" | ||
#include "qemu/error-report.h" | ||
#include "include/qemu/lockable.h" | ||
#include "sysemu/runstate.h" | ||
#include "trace.h" | ||
#include "qapi/error.h" | ||
#include "hw/audio/virtio-snd.h" | ||
#include "hw/core/cpu.h" | ||
|
||
#define VIRTIO_SOUND_VM_VERSION 1 | ||
#define VIRTIO_SOUND_JACK_DEFAULT 0 | ||
#define VIRTIO_SOUND_STREAM_DEFAULT 1 | ||
#define VIRTIO_SOUND_CHMAP_DEFAULT 0 | ||
#define VIRTIO_SOUND_HDA_FN_NID 0 | ||
|
||
static const VMStateDescription vmstate_virtio_snd_device = { | ||
.name = TYPE_VIRTIO_SND, | ||
.version_id = VIRTIO_SOUND_VM_VERSION, | ||
.minimum_version_id = VIRTIO_SOUND_VM_VERSION, | ||
}; | ||
|
||
static const VMStateDescription vmstate_virtio_snd = { | ||
.name = TYPE_VIRTIO_SND, | ||
.minimum_version_id = VIRTIO_SOUND_VM_VERSION, | ||
.version_id = VIRTIO_SOUND_VM_VERSION, | ||
.fields = (VMStateField[]) { | ||
VMSTATE_VIRTIO_DEVICE, | ||
VMSTATE_END_OF_LIST() | ||
}, | ||
}; | ||
|
||
static Property virtio_snd_properties[] = { | ||
DEFINE_AUDIO_PROPERTIES(VirtIOSound, card), | ||
DEFINE_PROP_UINT32("jacks", VirtIOSound, snd_conf.jacks, | ||
VIRTIO_SOUND_JACK_DEFAULT), | ||
DEFINE_PROP_UINT32("streams", VirtIOSound, snd_conf.streams, | ||
VIRTIO_SOUND_STREAM_DEFAULT), | ||
DEFINE_PROP_UINT32("chmaps", VirtIOSound, snd_conf.chmaps, | ||
VIRTIO_SOUND_CHMAP_DEFAULT), | ||
DEFINE_PROP_END_OF_LIST(), | ||
}; | ||
|
||
static void | ||
virtio_snd_get_config(VirtIODevice *vdev, uint8_t *config) | ||
{ | ||
VirtIOSound *s = VIRTIO_SND(vdev); | ||
virtio_snd_config *sndconfig = | ||
(virtio_snd_config *)config; | ||
trace_virtio_snd_get_config(vdev, | ||
s->snd_conf.jacks, | ||
s->snd_conf.streams, | ||
s->snd_conf.chmaps); | ||
|
||
memcpy(sndconfig, &s->snd_conf, sizeof(s->snd_conf)); | ||
cpu_to_le32s(&sndconfig->jacks); | ||
cpu_to_le32s(&sndconfig->streams); | ||
cpu_to_le32s(&sndconfig->chmaps); | ||
|
||
} | ||
|
||
static void | ||
virtio_snd_set_config(VirtIODevice *vdev, const uint8_t *config) | ||
{ | ||
VirtIOSound *s = VIRTIO_SND(vdev); | ||
const virtio_snd_config *sndconfig = | ||
(const virtio_snd_config *)config; | ||
|
||
|
||
trace_virtio_snd_set_config(vdev, | ||
s->snd_conf.jacks, | ||
sndconfig->jacks, | ||
s->snd_conf.streams, | ||
sndconfig->streams, | ||
s->snd_conf.chmaps, | ||
sndconfig->chmaps); | ||
|
||
memcpy(&s->snd_conf, sndconfig, sizeof(virtio_snd_config)); | ||
le32_to_cpus(&s->snd_conf.jacks); | ||
le32_to_cpus(&s->snd_conf.streams); | ||
le32_to_cpus(&s->snd_conf.chmaps); | ||
|
||
} | ||
|
||
/* | ||
* Queue handler stub. | ||
* | ||
* @vdev: VirtIOSound device | ||
* @vq: virtqueue | ||
*/ | ||
static void virtio_snd_handle_queue(VirtIODevice *vdev, VirtQueue *vq) {} | ||
|
||
static uint64_t get_features(VirtIODevice *vdev, uint64_t features, | ||
Error **errp) | ||
{ | ||
/* | ||
* virtio-v1.2-csd01, 5.14.3, | ||
* Feature Bits | ||
* None currently defined. | ||
*/ | ||
VirtIOSound *s = VIRTIO_SND(vdev); | ||
features |= s->features; | ||
|
||
trace_virtio_snd_get_features(vdev, features); | ||
|
||
return features; | ||
} | ||
|
||
static void | ||
virtio_snd_vm_state_change(void *opaque, bool running, | ||
RunState state) | ||
{ | ||
if (running) { | ||
trace_virtio_snd_vm_state_running(); | ||
} else { | ||
trace_virtio_snd_vm_state_stopped(); | ||
} | ||
} | ||
|
||
static void virtio_snd_realize(DeviceState *dev, Error **errp) | ||
{ | ||
ERRP_GUARD(); | ||
VirtIOSound *vsnd = VIRTIO_SND(dev); | ||
VirtIODevice *vdev = VIRTIO_DEVICE(dev); | ||
|
||
vsnd->vmstate = | ||
qemu_add_vm_change_state_handler(virtio_snd_vm_state_change, vsnd); | ||
|
||
trace_virtio_snd_realize(vsnd); | ||
|
||
virtio_init(vdev, VIRTIO_ID_SOUND, sizeof(virtio_snd_config)); | ||
virtio_add_feature(&vsnd->features, VIRTIO_F_VERSION_1); | ||
|
||
/* set number of jacks and streams */ | ||
if (vsnd->snd_conf.jacks > 8) { | ||
error_setg(errp, | ||
"Invalid number of jacks: %"PRIu32, | ||
vsnd->snd_conf.jacks); | ||
return; | ||
} | ||
if (vsnd->snd_conf.streams < 1 || vsnd->snd_conf.streams > 10) { | ||
error_setg(errp, | ||
"Invalid number of streams: %"PRIu32, | ||
vsnd->snd_conf.streams); | ||
return; | ||
} | ||
|
||
if (vsnd->snd_conf.chmaps > VIRTIO_SND_CHMAP_MAX_SIZE) { | ||
error_setg(errp, | ||
"Invalid number of channel maps: %"PRIu32, | ||
vsnd->snd_conf.chmaps); | ||
return; | ||
} | ||
|
||
AUD_register_card("virtio-sound", &vsnd->card, errp); | ||
|
||
vsnd->queues[VIRTIO_SND_VQ_CONTROL] = | ||
virtio_add_queue(vdev, 64, virtio_snd_handle_queue); | ||
vsnd->queues[VIRTIO_SND_VQ_EVENT] = | ||
virtio_add_queue(vdev, 64, virtio_snd_handle_queue); | ||
vsnd->queues[VIRTIO_SND_VQ_TX] = | ||
virtio_add_queue(vdev, 64, virtio_snd_handle_queue); | ||
vsnd->queues[VIRTIO_SND_VQ_RX] = | ||
virtio_add_queue(vdev, 64, virtio_snd_handle_queue); | ||
} | ||
|
||
static void virtio_snd_unrealize(DeviceState *dev) | ||
{ | ||
VirtIODevice *vdev = VIRTIO_DEVICE(dev); | ||
VirtIOSound *vsnd = VIRTIO_SND(dev); | ||
|
||
qemu_del_vm_change_state_handler(vsnd->vmstate); | ||
trace_virtio_snd_unrealize(vsnd); | ||
|
||
AUD_remove_card(&vsnd->card); | ||
virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_CONTROL]); | ||
virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_EVENT]); | ||
virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_TX]); | ||
virtio_delete_queue(vsnd->queues[VIRTIO_SND_VQ_RX]); | ||
virtio_cleanup(vdev); | ||
} | ||
|
||
|
||
static void virtio_snd_reset(VirtIODevice *vdev) {} | ||
|
||
static void virtio_snd_class_init(ObjectClass *klass, void *data) | ||
{ | ||
DeviceClass *dc = DEVICE_CLASS(klass); | ||
VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass); | ||
|
||
|
||
set_bit(DEVICE_CATEGORY_SOUND, dc->categories); | ||
device_class_set_props(dc, virtio_snd_properties); | ||
|
||
dc->vmsd = &vmstate_virtio_snd; | ||
vdc->vmsd = &vmstate_virtio_snd_device; | ||
vdc->realize = virtio_snd_realize; | ||
vdc->unrealize = virtio_snd_unrealize; | ||
vdc->get_config = virtio_snd_get_config; | ||
vdc->set_config = virtio_snd_set_config; | ||
vdc->get_features = get_features; | ||
vdc->reset = virtio_snd_reset; | ||
vdc->legacy_features = 0; | ||
} | ||
|
||
static const TypeInfo virtio_snd_types[] = { | ||
{ | ||
.name = TYPE_VIRTIO_SND, | ||
.parent = TYPE_VIRTIO_DEVICE, | ||
.instance_size = sizeof(VirtIOSound), | ||
.class_init = virtio_snd_class_init, | ||
} | ||
}; | ||
|
||
DEFINE_TYPES(virtio_snd_types) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
/* | ||
* VIRTIO Sound Device conforming to | ||
* | ||
* "Virtual I/O Device (VIRTIO) Version 1.2 | ||
* Committee Specification Draft 01 | ||
* 09 May 2022" | ||
* | ||
* Copyright (c) 2023 Emmanouil Pitsidianakis <manos.pitsidianakis@linaro.org> | ||
* Copyright (C) 2019 OpenSynergy GmbH | ||
* | ||
* 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_SOUND_H | ||
#define QEMU_VIRTIO_SOUND_H | ||
|
||
#include "hw/virtio/virtio.h" | ||
#include "audio/audio.h" | ||
#include "standard-headers/linux/virtio_ids.h" | ||
#include "standard-headers/linux/virtio_snd.h" | ||
|
||
#define TYPE_VIRTIO_SND "virtio-sound-device" | ||
#define VIRTIO_SND(obj) \ | ||
OBJECT_CHECK(VirtIOSound, (obj), TYPE_VIRTIO_SND) | ||
|
||
/* CONFIGURATION SPACE */ | ||
|
||
typedef struct virtio_snd_config virtio_snd_config; | ||
|
||
/* COMMON DEFINITIONS */ | ||
|
||
/* common header for request/response*/ | ||
typedef struct virtio_snd_hdr virtio_snd_hdr; | ||
|
||
/* event notification */ | ||
typedef struct virtio_snd_event virtio_snd_event; | ||
|
||
/* common control request to query an item information */ | ||
typedef struct virtio_snd_query_info virtio_snd_query_info; | ||
|
||
/* JACK CONTROL MESSAGES */ | ||
|
||
typedef struct virtio_snd_jack_hdr virtio_snd_jack_hdr; | ||
|
||
/* jack information structure */ | ||
typedef struct virtio_snd_jack_info virtio_snd_jack_info; | ||
|
||
/* jack remapping control request */ | ||
typedef struct virtio_snd_jack_remap virtio_snd_jack_remap; | ||
|
||
/* | ||
* PCM CONTROL MESSAGES | ||
*/ | ||
typedef struct virtio_snd_pcm_hdr virtio_snd_pcm_hdr; | ||
|
||
/* PCM stream info structure */ | ||
typedef struct virtio_snd_pcm_info virtio_snd_pcm_info; | ||
|
||
/* set PCM stream params */ | ||
typedef struct virtio_snd_pcm_set_params virtio_snd_pcm_set_params; | ||
|
||
/* I/O request header */ | ||
typedef struct virtio_snd_pcm_xfer virtio_snd_pcm_xfer; | ||
|
||
/* I/O request status */ | ||
typedef struct virtio_snd_pcm_status virtio_snd_pcm_status; | ||
|
||
typedef struct VirtIOSound { | ||
VirtIODevice parent_obj; | ||
|
||
VirtQueue *queues[VIRTIO_SND_VQ_MAX]; | ||
uint64_t features; | ||
QEMUSoundCard card; | ||
VMChangeStateEntry *vmstate; | ||
virtio_snd_config snd_conf; | ||
} VirtIOSound; | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters