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