root/sound/firewire/amdtp-stream.h

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

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. amdtp_stream_running
  2. amdtp_streaming_error
  3. amdtp_stream_pcm_running
  4. amdtp_stream_pcm_trigger
  5. cip_sfc_is_base_44100
  6. amdtp_stream_wait_callback

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef SOUND_FIREWIRE_AMDTP_H_INCLUDED
   3 #define SOUND_FIREWIRE_AMDTP_H_INCLUDED
   4 
   5 #include <linux/err.h>
   6 #include <linux/interrupt.h>
   7 #include <linux/mutex.h>
   8 #include <linux/sched.h>
   9 #include <sound/asound.h>
  10 #include "packets-buffer.h"
  11 
  12 /**
  13  * enum cip_flags - describes details of the streaming protocol
  14  * @CIP_NONBLOCKING: In non-blocking mode, each packet contains
  15  *      sample_rate/8000 samples, with rounding up or down to adjust
  16  *      for clock skew and left-over fractional samples.  This should
  17  *      be used if supported by the device.
  18  * @CIP_BLOCKING: In blocking mode, each packet contains either zero or
  19  *      SYT_INTERVAL samples, with these two types alternating so that
  20  *      the overall sample rate comes out right.
  21  * @CIP_EMPTY_WITH_TAG0: Only for in-stream. Empty in-packets have TAG0.
  22  * @CIP_DBC_IS_END_EVENT: The value of dbc in an packet corresponds to the end
  23  * of event in the packet. Out of IEC 61883.
  24  * @CIP_WRONG_DBS: Only for in-stream. The value of dbs is wrong in in-packets.
  25  *      The value of data_block_quadlets is used instead of reported value.
  26  * @CIP_SKIP_DBC_ZERO_CHECK: Only for in-stream.  Packets with zero in dbc is
  27  *      skipped for detecting discontinuity.
  28  * @CIP_EMPTY_HAS_WRONG_DBC: Only for in-stream. The value of dbc in empty
  29  *      packet is wrong but the others are correct.
  30  * @CIP_JUMBO_PAYLOAD: Only for in-stream. The number of data blocks in an
  31  *      packet is larger than IEC 61883-6 defines. Current implementation
  32  *      allows 5 times as large as IEC 61883-6 defines.
  33  * @CIP_HEADER_WITHOUT_EOH: Only for in-stream. CIP Header doesn't include
  34  *      valid EOH.
  35  * @CIP_NO_HEADERS: a lack of headers in packets
  36  * @CIP_UNALIGHED_DBC: Only for in-stream. The value of dbc is not alighed to
  37  *      the value of current SYT_INTERVAL; e.g. initial value is not zero.
  38  */
  39 enum cip_flags {
  40         CIP_NONBLOCKING         = 0x00,
  41         CIP_BLOCKING            = 0x01,
  42         CIP_EMPTY_WITH_TAG0     = 0x02,
  43         CIP_DBC_IS_END_EVENT    = 0x04,
  44         CIP_WRONG_DBS           = 0x08,
  45         CIP_SKIP_DBC_ZERO_CHECK = 0x10,
  46         CIP_EMPTY_HAS_WRONG_DBC = 0x20,
  47         CIP_JUMBO_PAYLOAD       = 0x40,
  48         CIP_HEADER_WITHOUT_EOH  = 0x80,
  49         CIP_NO_HEADER           = 0x100,
  50         CIP_UNALIGHED_DBC       = 0x200,
  51 };
  52 
  53 /**
  54  * enum cip_sfc - supported Sampling Frequency Codes (SFCs)
  55  * @CIP_SFC_32000:   32,000 data blocks
  56  * @CIP_SFC_44100:   44,100 data blocks
  57  * @CIP_SFC_48000:   48,000 data blocks
  58  * @CIP_SFC_88200:   88,200 data blocks
  59  * @CIP_SFC_96000:   96,000 data blocks
  60  * @CIP_SFC_176400: 176,400 data blocks
  61  * @CIP_SFC_192000: 192,000 data blocks
  62  * @CIP_SFC_COUNT: the number of supported SFCs
  63  *
  64  * These values are used to show nominal Sampling Frequency Code in
  65  * Format Dependent Field (FDF) of AMDTP packet header. In IEC 61883-6:2002,
  66  * this code means the number of events per second. Actually the code
  67  * represents the number of data blocks transferred per second in an AMDTP
  68  * stream.
  69  *
  70  * In IEC 61883-6:2005, some extensions were added to support more types of
  71  * data such as 'One Bit LInear Audio', therefore the meaning of SFC became
  72  * different depending on the types.
  73  *
  74  * Currently our implementation is compatible with IEC 61883-6:2002.
  75  */
  76 enum cip_sfc {
  77         CIP_SFC_32000  = 0,
  78         CIP_SFC_44100  = 1,
  79         CIP_SFC_48000  = 2,
  80         CIP_SFC_88200  = 3,
  81         CIP_SFC_96000  = 4,
  82         CIP_SFC_176400 = 5,
  83         CIP_SFC_192000 = 6,
  84         CIP_SFC_COUNT
  85 };
  86 
  87 struct fw_unit;
  88 struct fw_iso_context;
  89 struct snd_pcm_substream;
  90 struct snd_pcm_runtime;
  91 
  92 enum amdtp_stream_direction {
  93         AMDTP_OUT_STREAM = 0,
  94         AMDTP_IN_STREAM
  95 };
  96 
  97 struct pkt_desc {
  98         u32 cycle;
  99         u32 syt;
 100         unsigned int data_blocks;
 101         unsigned int data_block_counter;
 102         __be32 *ctx_payload;
 103 };
 104 
 105 struct amdtp_stream;
 106 typedef unsigned int (*amdtp_stream_process_ctx_payloads_t)(
 107                                                 struct amdtp_stream *s,
 108                                                 const struct pkt_desc *desc,
 109                                                 unsigned int packets,
 110                                                 struct snd_pcm_substream *pcm);
 111 struct amdtp_stream {
 112         struct fw_unit *unit;
 113         enum cip_flags flags;
 114         enum amdtp_stream_direction direction;
 115         struct mutex mutex;
 116 
 117         /* For packet processing. */
 118         struct fw_iso_context *context;
 119         struct iso_packets_buffer buffer;
 120         int packet_index;
 121         struct pkt_desc *pkt_descs;
 122         int tag;
 123         union {
 124                 struct {
 125                         unsigned int ctx_header_size;
 126 
 127                         // limit for payload of iso packet.
 128                         unsigned int max_ctx_payload_length;
 129 
 130                         // For quirks of CIP headers.
 131                         // Fixed interval of dbc between previos/current
 132                         // packets.
 133                         unsigned int dbc_interval;
 134                 } tx;
 135                 struct {
 136                         // To calculate CIP data blocks and tstamp.
 137                         unsigned int transfer_delay;
 138                         unsigned int data_block_state;
 139                         unsigned int last_syt_offset;
 140                         unsigned int syt_offset_state;
 141 
 142                         // To generate CIP header.
 143                         unsigned int fdf;
 144                         int syt_override;
 145                 } rx;
 146         } ctx_data;
 147 
 148         /* For CIP headers. */
 149         unsigned int source_node_id_field;
 150         unsigned int data_block_quadlets;
 151         unsigned int data_block_counter;
 152         unsigned int sph;
 153         unsigned int fmt;
 154 
 155         /* Internal flags. */
 156         enum cip_sfc sfc;
 157         unsigned int syt_interval;
 158 
 159         /* For a PCM substream processing. */
 160         struct snd_pcm_substream *pcm;
 161         struct tasklet_struct period_tasklet;
 162         snd_pcm_uframes_t pcm_buffer_pointer;
 163         unsigned int pcm_period_pointer;
 164 
 165         /* To wait for first packet. */
 166         bool callbacked;
 167         wait_queue_head_t callback_wait;
 168         u32 start_cycle;
 169 
 170         /* For backends to process data blocks. */
 171         void *protocol;
 172         amdtp_stream_process_ctx_payloads_t process_ctx_payloads;
 173 
 174         // For domain.
 175         int channel;
 176         int speed;
 177         struct list_head list;
 178 };
 179 
 180 int amdtp_stream_init(struct amdtp_stream *s, struct fw_unit *unit,
 181                       enum amdtp_stream_direction dir, enum cip_flags flags,
 182                       unsigned int fmt,
 183                       amdtp_stream_process_ctx_payloads_t process_ctx_payloads,
 184                       unsigned int protocol_size);
 185 void amdtp_stream_destroy(struct amdtp_stream *s);
 186 
 187 int amdtp_stream_set_parameters(struct amdtp_stream *s, unsigned int rate,
 188                                 unsigned int data_block_quadlets);
 189 unsigned int amdtp_stream_get_max_payload(struct amdtp_stream *s);
 190 
 191 void amdtp_stream_update(struct amdtp_stream *s);
 192 
 193 int amdtp_stream_add_pcm_hw_constraints(struct amdtp_stream *s,
 194                                         struct snd_pcm_runtime *runtime);
 195 
 196 void amdtp_stream_pcm_prepare(struct amdtp_stream *s);
 197 unsigned long amdtp_stream_pcm_pointer(struct amdtp_stream *s);
 198 int amdtp_stream_pcm_ack(struct amdtp_stream *s);
 199 void amdtp_stream_pcm_abort(struct amdtp_stream *s);
 200 
 201 extern const unsigned int amdtp_syt_intervals[CIP_SFC_COUNT];
 202 extern const unsigned int amdtp_rate_table[CIP_SFC_COUNT];
 203 
 204 /**
 205  * amdtp_stream_running - check stream is running or not
 206  * @s: the AMDTP stream
 207  *
 208  * If this function returns true, the stream is running.
 209  */
 210 static inline bool amdtp_stream_running(struct amdtp_stream *s)
 211 {
 212         return !IS_ERR(s->context);
 213 }
 214 
 215 /**
 216  * amdtp_streaming_error - check for streaming error
 217  * @s: the AMDTP stream
 218  *
 219  * If this function returns true, the stream's packet queue has stopped due to
 220  * an asynchronous error.
 221  */
 222 static inline bool amdtp_streaming_error(struct amdtp_stream *s)
 223 {
 224         return s->packet_index < 0;
 225 }
 226 
 227 /**
 228  * amdtp_stream_pcm_running - check PCM substream is running or not
 229  * @s: the AMDTP stream
 230  *
 231  * If this function returns true, PCM substream in the AMDTP stream is running.
 232  */
 233 static inline bool amdtp_stream_pcm_running(struct amdtp_stream *s)
 234 {
 235         return !!s->pcm;
 236 }
 237 
 238 /**
 239  * amdtp_stream_pcm_trigger - start/stop playback from a PCM device
 240  * @s: the AMDTP stream
 241  * @pcm: the PCM device to be started, or %NULL to stop the current device
 242  *
 243  * Call this function on a running isochronous stream to enable the actual
 244  * transmission of PCM data.  This function should be called from the PCM
 245  * device's .trigger callback.
 246  */
 247 static inline void amdtp_stream_pcm_trigger(struct amdtp_stream *s,
 248                                             struct snd_pcm_substream *pcm)
 249 {
 250         WRITE_ONCE(s->pcm, pcm);
 251 }
 252 
 253 static inline bool cip_sfc_is_base_44100(enum cip_sfc sfc)
 254 {
 255         return sfc & 1;
 256 }
 257 
 258 /**
 259  * amdtp_stream_wait_callback - sleep till callbacked or timeout
 260  * @s: the AMDTP stream
 261  * @timeout: msec till timeout
 262  *
 263  * If this function return false, the AMDTP stream should be stopped.
 264  */
 265 static inline bool amdtp_stream_wait_callback(struct amdtp_stream *s,
 266                                               unsigned int timeout)
 267 {
 268         return wait_event_timeout(s->callback_wait,
 269                                   s->callbacked == true,
 270                                   msecs_to_jiffies(timeout)) > 0;
 271 }
 272 
 273 struct amdtp_domain {
 274         struct list_head streams;
 275 };
 276 
 277 int amdtp_domain_init(struct amdtp_domain *d);
 278 void amdtp_domain_destroy(struct amdtp_domain *d);
 279 
 280 int amdtp_domain_add_stream(struct amdtp_domain *d, struct amdtp_stream *s,
 281                             int channel, int speed);
 282 
 283 int amdtp_domain_start(struct amdtp_domain *d);
 284 void amdtp_domain_stop(struct amdtp_domain *d);
 285 
 286 #endif

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