forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.4 KiB
95 lines
2.4 KiB
/* SPDX-License-Identifier: GPL-2.0 OR MIT */ |
|
|
|
/* |
|
* Xen para-virtual sound device |
|
* |
|
* Copyright (C) 2016-2018 EPAM Systems Inc. |
|
* |
|
* Author: Oleksandr Andrushchenko <[email protected]> |
|
*/ |
|
|
|
#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 */
|
|
|