xref: /openbmc/linux/sound/virtio/virtio_ctl_msg.h (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
1*9d45e514SAnton Yakovlev /* SPDX-License-Identifier: GPL-2.0+ */
2*9d45e514SAnton Yakovlev /*
3*9d45e514SAnton Yakovlev  * virtio-snd: Virtio sound device
4*9d45e514SAnton Yakovlev  * Copyright (C) 2021 OpenSynergy GmbH
5*9d45e514SAnton Yakovlev  */
6*9d45e514SAnton Yakovlev #ifndef VIRTIO_SND_MSG_H
7*9d45e514SAnton Yakovlev #define VIRTIO_SND_MSG_H
8*9d45e514SAnton Yakovlev 
9*9d45e514SAnton Yakovlev #include <linux/atomic.h>
10*9d45e514SAnton Yakovlev #include <linux/virtio.h>
11*9d45e514SAnton Yakovlev 
12*9d45e514SAnton Yakovlev struct virtio_snd;
13*9d45e514SAnton Yakovlev struct virtio_snd_msg;
14*9d45e514SAnton Yakovlev 
15*9d45e514SAnton Yakovlev void virtsnd_ctl_msg_ref(struct virtio_snd_msg *msg);
16*9d45e514SAnton Yakovlev 
17*9d45e514SAnton Yakovlev void virtsnd_ctl_msg_unref(struct virtio_snd_msg *msg);
18*9d45e514SAnton Yakovlev 
19*9d45e514SAnton Yakovlev void *virtsnd_ctl_msg_request(struct virtio_snd_msg *msg);
20*9d45e514SAnton Yakovlev 
21*9d45e514SAnton Yakovlev void *virtsnd_ctl_msg_response(struct virtio_snd_msg *msg);
22*9d45e514SAnton Yakovlev 
23*9d45e514SAnton Yakovlev struct virtio_snd_msg *virtsnd_ctl_msg_alloc(size_t request_size,
24*9d45e514SAnton Yakovlev 					     size_t response_size, gfp_t gfp);
25*9d45e514SAnton Yakovlev 
26*9d45e514SAnton Yakovlev int virtsnd_ctl_msg_send(struct virtio_snd *snd, struct virtio_snd_msg *msg,
27*9d45e514SAnton Yakovlev 			 struct scatterlist *out_sgs,
28*9d45e514SAnton Yakovlev 			 struct scatterlist *in_sgs, bool nowait);
29*9d45e514SAnton Yakovlev 
30*9d45e514SAnton Yakovlev /**
31*9d45e514SAnton Yakovlev  * virtsnd_ctl_msg_send_sync() - Simplified sending of synchronous message.
32*9d45e514SAnton Yakovlev  * @snd: VirtIO sound device.
33*9d45e514SAnton Yakovlev  * @msg: Control message.
34*9d45e514SAnton Yakovlev  *
35*9d45e514SAnton Yakovlev  * After returning from this function, the message will be deleted. If message
36*9d45e514SAnton Yakovlev  * content is still needed, the caller must additionally to
37*9d45e514SAnton Yakovlev  * virtsnd_ctl_msg_ref/unref() it.
38*9d45e514SAnton Yakovlev  *
39*9d45e514SAnton Yakovlev  * The msg_timeout_ms module parameter defines the message completion timeout.
40*9d45e514SAnton Yakovlev  * If the message is not completed within this time, the function will return an
41*9d45e514SAnton Yakovlev  * error.
42*9d45e514SAnton Yakovlev  *
43*9d45e514SAnton Yakovlev  * Context: Any context that permits to sleep.
44*9d45e514SAnton Yakovlev  * Return: 0 on success, -errno on failure.
45*9d45e514SAnton Yakovlev  *
46*9d45e514SAnton Yakovlev  * The return value is a message status code (VIRTIO_SND_S_XXX) converted to an
47*9d45e514SAnton Yakovlev  * appropriate -errno value.
48*9d45e514SAnton Yakovlev  */
virtsnd_ctl_msg_send_sync(struct virtio_snd * snd,struct virtio_snd_msg * msg)49*9d45e514SAnton Yakovlev static inline int virtsnd_ctl_msg_send_sync(struct virtio_snd *snd,
50*9d45e514SAnton Yakovlev 					    struct virtio_snd_msg *msg)
51*9d45e514SAnton Yakovlev {
52*9d45e514SAnton Yakovlev 	return virtsnd_ctl_msg_send(snd, msg, NULL, NULL, false);
53*9d45e514SAnton Yakovlev }
54*9d45e514SAnton Yakovlev 
55*9d45e514SAnton Yakovlev /**
56*9d45e514SAnton Yakovlev  * virtsnd_ctl_msg_send_async() - Simplified sending of asynchronous message.
57*9d45e514SAnton Yakovlev  * @snd: VirtIO sound device.
58*9d45e514SAnton Yakovlev  * @msg: Control message.
59*9d45e514SAnton Yakovlev  *
60*9d45e514SAnton Yakovlev  * Context: Any context.
61*9d45e514SAnton Yakovlev  * Return: 0 on success, -errno on failure.
62*9d45e514SAnton Yakovlev  */
virtsnd_ctl_msg_send_async(struct virtio_snd * snd,struct virtio_snd_msg * msg)63*9d45e514SAnton Yakovlev static inline int virtsnd_ctl_msg_send_async(struct virtio_snd *snd,
64*9d45e514SAnton Yakovlev 					     struct virtio_snd_msg *msg)
65*9d45e514SAnton Yakovlev {
66*9d45e514SAnton Yakovlev 	return virtsnd_ctl_msg_send(snd, msg, NULL, NULL, true);
67*9d45e514SAnton Yakovlev }
68*9d45e514SAnton Yakovlev 
69*9d45e514SAnton Yakovlev void virtsnd_ctl_msg_cancel_all(struct virtio_snd *snd);
70*9d45e514SAnton Yakovlev 
71*9d45e514SAnton Yakovlev void virtsnd_ctl_msg_complete(struct virtio_snd_msg *msg);
72*9d45e514SAnton Yakovlev 
73*9d45e514SAnton Yakovlev int virtsnd_ctl_query_info(struct virtio_snd *snd, int command, int start_id,
74*9d45e514SAnton Yakovlev 			   int count, size_t size, void *info);
75*9d45e514SAnton Yakovlev 
76*9d45e514SAnton Yakovlev void virtsnd_ctl_notify_cb(struct virtqueue *vqueue);
77*9d45e514SAnton Yakovlev 
78*9d45e514SAnton Yakovlev #endif /* VIRTIO_SND_MSG_H */
79