mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-29 14:05:19 +08:00
788ef64a2c
Handle Xen event channels: - create for all configured streams and publish corresponding ring references and event channels in Xen store, so backend can connect - implement event channels interrupt handlers - create and destroy event channels with respect to Xen bus state Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
96 lines
2.4 KiB
C
96 lines
2.4 KiB
C
/* 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 */
|