1 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
2 
3 /*
4  * Xen para-virtual sound device
5  *
6  * Copyright (C) 2016-2018 EPAM Systems Inc.
7  *
8  * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
9  */
10 
11 #ifndef __XEN_SND_FRONT_EVTCHNL_H
12 #define __XEN_SND_FRONT_EVTCHNL_H
13 
14 #include <xen/interface/io/sndif.h>
15 
16 struct xen_snd_front_info;
17 
18 /* Timeout in ms to wait for backend to respond. */
19 #define VSND_WAIT_BACK_MS	3000
20 
21 enum xen_snd_front_evtchnl_state {
22 	EVTCHNL_STATE_DISCONNECTED,
23 	EVTCHNL_STATE_CONNECTED,
24 };
25 
26 enum xen_snd_front_evtchnl_type {
27 	EVTCHNL_TYPE_REQ,
28 	EVTCHNL_TYPE_EVT,
29 };
30 
31 struct xen_snd_front_evtchnl {
32 	struct xen_snd_front_info *front_info;
33 	int gref;
34 	int port;
35 	int irq;
36 	int index;
37 	/* State of the event channel. */
38 	enum xen_snd_front_evtchnl_state state;
39 	enum xen_snd_front_evtchnl_type type;
40 	/* Either response id or incoming event id. */
41 	u16 evt_id;
42 	/* Next request id or next expected event id. */
43 	u16 evt_next_id;
44 	/* Shared ring access lock. */
45 	struct mutex ring_io_lock;
46 	union {
47 		struct {
48 			struct xen_sndif_front_ring ring;
49 			struct completion completion;
50 			/* Serializer for backend IO: request/response. */
51 			struct mutex req_io_lock;
52 
53 			/* Latest response status. */
54 			int resp_status;
55 			union {
56 				struct xensnd_query_hw_param hw_param;
57 			} resp;
58 		} req;
59 		struct {
60 			struct xensnd_event_page *page;
61 			/* This is needed to handle XENSND_EVT_CUR_POS event. */
62 			struct snd_pcm_substream *substream;
63 		} evt;
64 	} u;
65 };
66 
67 struct xen_snd_front_evtchnl_pair {
68 	struct xen_snd_front_evtchnl req;
69 	struct xen_snd_front_evtchnl evt;
70 };
71 
72 int xen_snd_front_evtchnl_create_all(struct xen_snd_front_info *front_info,
73 				     int num_streams);
74 
75 void xen_snd_front_evtchnl_free_all(struct xen_snd_front_info *front_info);
76 
77 int xen_snd_front_evtchnl_publish_all(struct xen_snd_front_info *front_info);
78 
79 void xen_snd_front_evtchnl_flush(struct xen_snd_front_evtchnl *evtchnl);
80 
81 void xen_snd_front_evtchnl_pair_set_connected(struct xen_snd_front_evtchnl_pair *evt_pair,
82 					      bool is_connected);
83 
84 void xen_snd_front_evtchnl_pair_clear(struct xen_snd_front_evtchnl_pair *evt_pair);
85 
86 #endif /* __XEN_SND_FRONT_EVTCHNL_H */
87