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 | |