root/sound/xen/xen_snd_front_evtchnl.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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 
  16 struct xen_snd_front_info;
  17 
  18 #ifndef GRANT_INVALID_REF
  19 /*
  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.
  23  */
  24 #define GRANT_INVALID_REF       0
  25 #endif
  26 
  27 /* Timeout in ms to wait for backend to respond. */
  28 #define VSND_WAIT_BACK_MS       3000
  29 
  30 enum xen_snd_front_evtchnl_state {
  31         EVTCHNL_STATE_DISCONNECTED,
  32         EVTCHNL_STATE_CONNECTED,
  33 };
  34 
  35 enum xen_snd_front_evtchnl_type {
  36         EVTCHNL_TYPE_REQ,
  37         EVTCHNL_TYPE_EVT,
  38 };
  39 
  40 struct xen_snd_front_evtchnl {
  41         struct xen_snd_front_info *front_info;
  42         int gref;
  43         int port;
  44         int irq;
  45         int index;
  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. */
  50         u16 evt_id;
  51         /* Next request id or next expected event id. */
  52         u16 evt_next_id;
  53         /* Shared ring access lock. */
  54         struct mutex ring_io_lock;
  55         union {
  56                 struct {
  57                         struct xen_sndif_front_ring ring;
  58                         struct completion completion;
  59                         /* Serializer for backend IO: request/response. */
  60                         struct mutex req_io_lock;
  61 
  62                         /* Latest response status. */
  63                         int resp_status;
  64                         union {
  65                                 struct xensnd_query_hw_param hw_param;
  66                         } resp;
  67                 } req;
  68                 struct {
  69                         struct xensnd_event_page *page;
  70                         /* This is needed to handle XENSND_EVT_CUR_POS event. */
  71                         struct snd_pcm_substream *substream;
  72                 } evt;
  73         } u;
  74 };
  75 
  76 struct xen_snd_front_evtchnl_pair {
  77         struct xen_snd_front_evtchnl req;
  78         struct xen_snd_front_evtchnl evt;
  79 };
  80 
  81 int xen_snd_front_evtchnl_create_all(struct xen_snd_front_info *front_info,
  82                                      int num_streams);
  83 
  84 void xen_snd_front_evtchnl_free_all(struct xen_snd_front_info *front_info);
  85 
  86 int xen_snd_front_evtchnl_publish_all(struct xen_snd_front_info *front_info);
  87 
  88 void xen_snd_front_evtchnl_flush(struct xen_snd_front_evtchnl *evtchnl);
  89 
  90 void xen_snd_front_evtchnl_pair_set_connected(struct xen_snd_front_evtchnl_pair *evt_pair,
  91                                               bool is_connected);
  92 
  93 void xen_snd_front_evtchnl_pair_clear(struct xen_snd_front_evtchnl_pair *evt_pair);
  94 
  95 #endif /* __XEN_SND_FRONT_EVTCHNL_H */

/* [<][>][^][v][top][bottom][index][help] */