xref: /qemu/hw/virtio/vhost-user-snd.c (revision 4ae0fc18a1dc91bfe3a494292faf3c4c1b2cc16c)
1*4ae0fc18SManos Pitsidianakis /*
2*4ae0fc18SManos Pitsidianakis  * Vhost-user snd virtio device
3*4ae0fc18SManos Pitsidianakis  *
4*4ae0fc18SManos Pitsidianakis  * Copyright (c) 2023 Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
5*4ae0fc18SManos Pitsidianakis  *
6*4ae0fc18SManos Pitsidianakis  * Simple wrapper of the generic vhost-user-device.
7*4ae0fc18SManos Pitsidianakis  *
8*4ae0fc18SManos Pitsidianakis  * SPDX-License-Identifier: GPL-2.0-or-later
9*4ae0fc18SManos Pitsidianakis  */
10*4ae0fc18SManos Pitsidianakis 
11*4ae0fc18SManos Pitsidianakis #include "qemu/osdep.h"
12*4ae0fc18SManos Pitsidianakis #include "qapi/error.h"
13*4ae0fc18SManos Pitsidianakis #include "hw/qdev-properties.h"
14*4ae0fc18SManos Pitsidianakis #include "hw/virtio/virtio-bus.h"
15*4ae0fc18SManos Pitsidianakis #include "hw/virtio/vhost-user-snd.h"
16*4ae0fc18SManos Pitsidianakis #include "standard-headers/linux/virtio_ids.h"
17*4ae0fc18SManos Pitsidianakis #include "standard-headers/linux/virtio_snd.h"
18*4ae0fc18SManos Pitsidianakis 
19*4ae0fc18SManos Pitsidianakis static const VMStateDescription vu_snd_vmstate = {
20*4ae0fc18SManos Pitsidianakis     .name = "vhost-user-snd",
21*4ae0fc18SManos Pitsidianakis     .unmigratable = 1,
22*4ae0fc18SManos Pitsidianakis };
23*4ae0fc18SManos Pitsidianakis 
24*4ae0fc18SManos Pitsidianakis static Property vsnd_properties[] = {
25*4ae0fc18SManos Pitsidianakis     DEFINE_PROP_CHR("chardev", VHostUserBase, chardev),
26*4ae0fc18SManos Pitsidianakis     DEFINE_PROP_END_OF_LIST(),
27*4ae0fc18SManos Pitsidianakis };
28*4ae0fc18SManos Pitsidianakis 
29*4ae0fc18SManos Pitsidianakis static void vu_snd_base_realize(DeviceState *dev, Error **errp)
30*4ae0fc18SManos Pitsidianakis {
31*4ae0fc18SManos Pitsidianakis     VHostUserBase *vub = VHOST_USER_BASE(dev);
32*4ae0fc18SManos Pitsidianakis     VHostUserBaseClass *vubs = VHOST_USER_BASE_GET_CLASS(dev);
33*4ae0fc18SManos Pitsidianakis 
34*4ae0fc18SManos Pitsidianakis     vub->virtio_id = VIRTIO_ID_SOUND;
35*4ae0fc18SManos Pitsidianakis     vub->num_vqs = 4;
36*4ae0fc18SManos Pitsidianakis     vub->config_size = sizeof(struct virtio_snd_config);
37*4ae0fc18SManos Pitsidianakis     vub->vq_size = 64;
38*4ae0fc18SManos Pitsidianakis 
39*4ae0fc18SManos Pitsidianakis     vubs->parent_realize(dev, errp);
40*4ae0fc18SManos Pitsidianakis }
41*4ae0fc18SManos Pitsidianakis 
42*4ae0fc18SManos Pitsidianakis static void vu_snd_class_init(ObjectClass *klass, void *data)
43*4ae0fc18SManos Pitsidianakis {
44*4ae0fc18SManos Pitsidianakis     DeviceClass *dc = DEVICE_CLASS(klass);
45*4ae0fc18SManos Pitsidianakis     VHostUserBaseClass *vubc = VHOST_USER_BASE_CLASS(klass);
46*4ae0fc18SManos Pitsidianakis 
47*4ae0fc18SManos Pitsidianakis     dc->vmsd = &vu_snd_vmstate;
48*4ae0fc18SManos Pitsidianakis     device_class_set_props(dc, vsnd_properties);
49*4ae0fc18SManos Pitsidianakis     device_class_set_parent_realize(dc, vu_snd_base_realize,
50*4ae0fc18SManos Pitsidianakis                                     &vubc->parent_realize);
51*4ae0fc18SManos Pitsidianakis 
52*4ae0fc18SManos Pitsidianakis     set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
53*4ae0fc18SManos Pitsidianakis }
54*4ae0fc18SManos Pitsidianakis 
55*4ae0fc18SManos Pitsidianakis static const TypeInfo vu_snd_info = {
56*4ae0fc18SManos Pitsidianakis     .name = TYPE_VHOST_USER_SND,
57*4ae0fc18SManos Pitsidianakis     .parent = TYPE_VHOST_USER_BASE,
58*4ae0fc18SManos Pitsidianakis     .instance_size = sizeof(VHostUserSound),
59*4ae0fc18SManos Pitsidianakis     .class_init = vu_snd_class_init,
60*4ae0fc18SManos Pitsidianakis };
61*4ae0fc18SManos Pitsidianakis 
62*4ae0fc18SManos Pitsidianakis static void vu_snd_register_types(void)
63*4ae0fc18SManos Pitsidianakis {
64*4ae0fc18SManos Pitsidianakis     type_register_static(&vu_snd_info);
65*4ae0fc18SManos Pitsidianakis }
66*4ae0fc18SManos Pitsidianakis 
67*4ae0fc18SManos Pitsidianakis type_init(vu_snd_register_types)
68