1 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
4 * Xen para-virtual sound device
6 * Copyright (C) 2016-2018 EPAM Systems Inc.
8 * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
11 #ifndef __XEN_SND_FRONT_EVTCHNL_H
12 #define __XEN_SND_FRONT_EVTCHNL_H
14 #include <xen/interface/io/sndif.h>
16 struct xen_snd_front_info
;
18 #ifndef GRANT_INVALID_REF
20 * FIXME: usage of grant reference 0 as invalid grant reference:
21 * grant reference 0 is valid, but never exposed to a PV driver,
22 * because of the fact it is already in use/reserved by the PV console.
24 #define GRANT_INVALID_REF 0
27 /* Timeout in ms to wait for backend to respond. */
28 #define VSND_WAIT_BACK_MS 3000
30 enum xen_snd_front_evtchnl_state
{
31 EVTCHNL_STATE_DISCONNECTED
,
32 EVTCHNL_STATE_CONNECTED
,
35 enum xen_snd_front_evtchnl_type
{
40 struct xen_snd_front_evtchnl
{
41 struct xen_snd_front_info
*front_info
;
46 /* State of the event channel. */
47 enum xen_snd_front_evtchnl_state state
;
48 enum xen_snd_front_evtchnl_type type
;
49 /* Either response id or incoming event id. */
51 /* Next request id or next expected event id. */
53 /* Shared ring access lock. */
54 struct mutex ring_io_lock
;
57 struct xen_sndif_front_ring ring
;
58 struct completion completion
;
59 /* Serializer for backend IO: request/response. */
60 struct mutex req_io_lock
;
62 /* Latest response status. */
65 struct xensnd_query_hw_param hw_param
;
69 struct xensnd_event_page
*page
;
70 /* This is needed to handle XENSND_EVT_CUR_POS event. */
71 struct snd_pcm_substream
*substream
;
76 struct xen_snd_front_evtchnl_pair
{
77 struct xen_snd_front_evtchnl req
;
78 struct xen_snd_front_evtchnl evt
;
81 int xen_snd_front_evtchnl_create_all(struct xen_snd_front_info
*front_info
,
84 void xen_snd_front_evtchnl_free_all(struct xen_snd_front_info
*front_info
);
86 int xen_snd_front_evtchnl_publish_all(struct xen_snd_front_info
*front_info
);
88 void xen_snd_front_evtchnl_flush(struct xen_snd_front_evtchnl
*evtchnl
);
90 void xen_snd_front_evtchnl_pair_set_connected(struct xen_snd_front_evtchnl_pair
*evt_pair
,
93 void xen_snd_front_evtchnl_pair_clear(struct xen_snd_front_evtchnl_pair
*evt_pair
);
95 #endif /* __XEN_SND_FRONT_EVTCHNL_H */