| /* SPDX-License-Identifier: GPL-2.0 OR MIT */ |
| |
| /* |
| * Xen para-virtual sound device |
| * |
| * Copyright (C) 2016-2018 EPAM Systems Inc. |
| * |
| * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> |
| */ |
| |
| #ifndef __XEN_SND_FRONT_EVTCHNL_H |
| #define __XEN_SND_FRONT_EVTCHNL_H |
| |
| #include <xen/interface/io/sndif.h> |
| |
| struct xen_snd_front_info; |
| |
| #ifndef GRANT_INVALID_REF |
| /* |
| * FIXME: usage of grant reference 0 as invalid grant reference: |
| * grant reference 0 is valid, but never exposed to a PV driver, |
| * because of the fact it is already in use/reserved by the PV console. |
| */ |
| #define GRANT_INVALID_REF 0 |
| #endif |
| |
| /* Timeout in ms to wait for backend to respond. */ |
| #define VSND_WAIT_BACK_MS 3000 |
| |
| enum xen_snd_front_evtchnl_state { |
| EVTCHNL_STATE_DISCONNECTED, |
| EVTCHNL_STATE_CONNECTED, |
| }; |
| |
| enum xen_snd_front_evtchnl_type { |
| EVTCHNL_TYPE_REQ, |
| EVTCHNL_TYPE_EVT, |
| }; |
| |
| struct xen_snd_front_evtchnl { |
| struct xen_snd_front_info *front_info; |
| int gref; |
| int port; |
| int irq; |
| int index; |
| /* State of the event channel. */ |
| enum xen_snd_front_evtchnl_state state; |
| enum xen_snd_front_evtchnl_type type; |
| /* Either response id or incoming event id. */ |
| u16 evt_id; |
| /* Next request id or next expected event id. */ |
| u16 evt_next_id; |
| /* Shared ring access lock. */ |
| struct mutex ring_io_lock; |
| union { |
| struct { |
| struct xen_sndif_front_ring ring; |
| struct completion completion; |
| /* Serializer for backend IO: request/response. */ |
| struct mutex req_io_lock; |
| |
| /* Latest response status. */ |
| int resp_status; |
| union { |
| struct xensnd_query_hw_param hw_param; |
| } resp; |
| } req; |
| struct { |
| struct xensnd_event_page *page; |
| /* This is needed to handle XENSND_EVT_CUR_POS event. */ |
| struct snd_pcm_substream *substream; |
| } evt; |
| } u; |
| }; |
| |
| struct xen_snd_front_evtchnl_pair { |
| struct xen_snd_front_evtchnl req; |
| struct xen_snd_front_evtchnl evt; |
| }; |
| |
| int xen_snd_front_evtchnl_create_all(struct xen_snd_front_info *front_info, |
| int num_streams); |
| |
| void xen_snd_front_evtchnl_free_all(struct xen_snd_front_info *front_info); |
| |
| int xen_snd_front_evtchnl_publish_all(struct xen_snd_front_info *front_info); |
| |
| void xen_snd_front_evtchnl_flush(struct xen_snd_front_evtchnl *evtchnl); |
| |
| void xen_snd_front_evtchnl_pair_set_connected(struct xen_snd_front_evtchnl_pair *evt_pair, |
| bool is_connected); |
| |
| void xen_snd_front_evtchnl_pair_clear(struct xen_snd_front_evtchnl_pair *evt_pair); |
| |
| #endif /* __XEN_SND_FRONT_EVTCHNL_H */ |