linux/sound/xen/xen_snd_front_evtchnl.h
<<
>>
Prefs
   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
  16struct xen_snd_front_info;
  17
  18/* Timeout in ms to wait for backend to respond. */
  19#define VSND_WAIT_BACK_MS       3000
  20
  21enum xen_snd_front_evtchnl_state {
  22        EVTCHNL_STATE_DISCONNECTED,
  23        EVTCHNL_STATE_CONNECTED,
  24};
  25
  26enum xen_snd_front_evtchnl_type {
  27        EVTCHNL_TYPE_REQ,
  28        EVTCHNL_TYPE_EVT,
  29};
  30
  31struct 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
  67struct xen_snd_front_evtchnl_pair {
  68        struct xen_snd_front_evtchnl req;
  69        struct xen_snd_front_evtchnl evt;
  70};
  71
  72int xen_snd_front_evtchnl_create_all(struct xen_snd_front_info *front_info,
  73                                     int num_streams);
  74
  75void xen_snd_front_evtchnl_free_all(struct xen_snd_front_info *front_info);
  76
  77int xen_snd_front_evtchnl_publish_all(struct xen_snd_front_info *front_info);
  78
  79void xen_snd_front_evtchnl_flush(struct xen_snd_front_evtchnl *evtchnl);
  80
  81void xen_snd_front_evtchnl_pair_set_connected(struct xen_snd_front_evtchnl_pair *evt_pair,
  82                                              bool is_connected);
  83
  84void xen_snd_front_evtchnl_pair_clear(struct xen_snd_front_evtchnl_pair *evt_pair);
  85
  86#endif /* __XEN_SND_FRONT_EVTCHNL_H */
  87