1*d67c46b9STakashi Sakamoto /* 2*d67c46b9STakashi Sakamoto * Audio and Music Data Transmission Protocol (IEC 61883-6) streams 3*d67c46b9STakashi Sakamoto * with Common Isochronous Packet (IEC 61883-1) headers 4*d67c46b9STakashi Sakamoto * 5*d67c46b9STakashi Sakamoto * Copyright (c) Clemens Ladisch <clemens@ladisch.de> 6*d67c46b9STakashi Sakamoto * Licensed under the terms of the GNU General Public License, version 2. 7*d67c46b9STakashi Sakamoto */ 8*d67c46b9STakashi Sakamoto 9*d67c46b9STakashi Sakamoto #include <linux/device.h> 10*d67c46b9STakashi Sakamoto #include <linux/err.h> 11*d67c46b9STakashi Sakamoto #include <linux/firewire.h> 12*d67c46b9STakashi Sakamoto #include <linux/module.h> 13*d67c46b9STakashi Sakamoto #include <linux/slab.h> 14*d67c46b9STakashi Sakamoto #include <linux/sched.h> 15*d67c46b9STakashi Sakamoto #include <sound/pcm.h> 16*d67c46b9STakashi Sakamoto #include <sound/pcm_params.h> 17*d67c46b9STakashi Sakamoto #include <sound/rawmidi.h> 18*d67c46b9STakashi Sakamoto #include "amdtp-stream.h" 19*d67c46b9STakashi Sakamoto 20*d67c46b9STakashi Sakamoto #define TICKS_PER_CYCLE 3072 21*d67c46b9STakashi Sakamoto #define CYCLES_PER_SECOND 8000 22*d67c46b9STakashi Sakamoto #define TICKS_PER_SECOND (TICKS_PER_CYCLE * CYCLES_PER_SECOND) 23*d67c46b9STakashi Sakamoto 24*d67c46b9STakashi Sakamoto /* 25*d67c46b9STakashi Sakamoto * Nominally 3125 bytes/second, but the MIDI port's clock might be 26*d67c46b9STakashi Sakamoto * 1% too slow, and the bus clock 100 ppm too fast. 27*d67c46b9STakashi Sakamoto */ 28*d67c46b9STakashi Sakamoto #define MIDI_BYTES_PER_SECOND 3093 29*d67c46b9STakashi Sakamoto 30*d67c46b9STakashi Sakamoto /* 31*d67c46b9STakashi Sakamoto * Several devices look only at the first eight data blocks. 32*d67c46b9STakashi Sakamoto * In any case, this is more than enough for the MIDI data rate. 33*d67c46b9STakashi Sakamoto */ 34*d67c46b9STakashi Sakamoto #define MAX_MIDI_RX_BLOCKS 8 35*d67c46b9STakashi Sakamoto 36*d67c46b9STakashi Sakamoto #define TRANSFER_DELAY_TICKS 0x2e00 /* 479.17 microseconds */ 37*d67c46b9STakashi Sakamoto 38*d67c46b9STakashi Sakamoto /* isochronous header parameters */ 39*d67c46b9STakashi Sakamoto #define ISO_DATA_LENGTH_SHIFT 16 40*d67c46b9STakashi Sakamoto #define TAG_CIP 1 41*d67c46b9STakashi Sakamoto 42*d67c46b9STakashi Sakamoto /* common isochronous packet header parameters */ 43*d67c46b9STakashi Sakamoto #define CIP_EOH_SHIFT 31 44*d67c46b9STakashi Sakamoto #define CIP_EOH (1u << CIP_EOH_SHIFT) 45*d67c46b9STakashi Sakamoto #define CIP_EOH_MASK 0x80000000 46*d67c46b9STakashi Sakamoto #define CIP_SID_SHIFT 24 47*d67c46b9STakashi Sakamoto #define CIP_SID_MASK 0x3f000000 48*d67c46b9STakashi Sakamoto #define CIP_DBS_MASK 0x00ff0000 49*d67c46b9STakashi Sakamoto #define CIP_DBS_SHIFT 16 50*d67c46b9STakashi Sakamoto #define CIP_DBC_MASK 0x000000ff 51*d67c46b9STakashi Sakamoto #define CIP_FMT_SHIFT 24 52*d67c46b9STakashi Sakamoto #define CIP_FMT_MASK 0x3f000000 53*d67c46b9STakashi Sakamoto #define CIP_FDF_MASK 0x00ff0000 54*d67c46b9STakashi Sakamoto #define CIP_FDF_SHIFT 16 55*d67c46b9STakashi Sakamoto #define CIP_SYT_MASK 0x0000ffff 56*d67c46b9STakashi Sakamoto #define CIP_SYT_NO_INFO 0xffff 57*d67c46b9STakashi Sakamoto 58*d67c46b9STakashi Sakamoto /* 59*d67c46b9STakashi Sakamoto * Audio and Music transfer protocol specific parameters 60*d67c46b9STakashi Sakamoto * only "Clock-based rate control mode" is supported 61*d67c46b9STakashi Sakamoto */ 62*d67c46b9STakashi Sakamoto #define CIP_FMT_AM 0x10 63*d67c46b9STakashi Sakamoto #define AMDTP_FDF_AM824 0x00 64*d67c46b9STakashi Sakamoto #define AMDTP_FDF_NO_DATA 0xff 65*d67c46b9STakashi Sakamoto 66*d67c46b9STakashi Sakamoto /* TODO: make these configurable */ 67*d67c46b9STakashi Sakamoto #define INTERRUPT_INTERVAL 16 68*d67c46b9STakashi Sakamoto #define QUEUE_LENGTH 48 69*d67c46b9STakashi Sakamoto 70*d67c46b9STakashi Sakamoto #define IN_PACKET_HEADER_SIZE 4 71*d67c46b9STakashi Sakamoto #define OUT_PACKET_HEADER_SIZE 0 72*d67c46b9STakashi Sakamoto 73*d67c46b9STakashi Sakamoto static void pcm_period_tasklet(unsigned long data); 74*d67c46b9STakashi Sakamoto 75*d67c46b9STakashi Sakamoto /** 76*d67c46b9STakashi Sakamoto * amdtp_stream_init - initialize an AMDTP stream structure 77*d67c46b9STakashi Sakamoto * @s: the AMDTP stream to initialize 78*d67c46b9STakashi Sakamoto * @unit: the target of the stream 79*d67c46b9STakashi Sakamoto * @dir: the direction of stream 80*d67c46b9STakashi Sakamoto * @flags: the packet transmission method to use 81*d67c46b9STakashi Sakamoto */ 82*d67c46b9STakashi Sakamoto int amdtp_stream_init(struct amdtp_stream *s, struct fw_unit *unit, 83*d67c46b9STakashi Sakamoto enum amdtp_stream_direction dir, enum cip_flags flags) 84*d67c46b9STakashi Sakamoto { 85*d67c46b9STakashi Sakamoto s->unit = unit; 86*d67c46b9STakashi Sakamoto s->direction = dir; 87*d67c46b9STakashi Sakamoto s->flags = flags; 88*d67c46b9STakashi Sakamoto s->context = ERR_PTR(-1); 89*d67c46b9STakashi Sakamoto mutex_init(&s->mutex); 90*d67c46b9STakashi Sakamoto tasklet_init(&s->period_tasklet, pcm_period_tasklet, (unsigned long)s); 91*d67c46b9STakashi Sakamoto s->packet_index = 0; 92*d67c46b9STakashi Sakamoto 93*d67c46b9STakashi Sakamoto init_waitqueue_head(&s->callback_wait); 94*d67c46b9STakashi Sakamoto s->callbacked = false; 95*d67c46b9STakashi Sakamoto s->sync_slave = NULL; 96*d67c46b9STakashi Sakamoto 97*d67c46b9STakashi Sakamoto s->fmt = CIP_FMT_AM; 98*d67c46b9STakashi Sakamoto 99*d67c46b9STakashi Sakamoto return 0; 100*d67c46b9STakashi Sakamoto } 101*d67c46b9STakashi Sakamoto EXPORT_SYMBOL(amdtp_stream_init); 102*d67c46b9STakashi Sakamoto 103*d67c46b9STakashi Sakamoto /** 104*d67c46b9STakashi Sakamoto * amdtp_stream_destroy - free stream resources 105*d67c46b9STakashi Sakamoto * @s: the AMDTP stream to destroy 106*d67c46b9STakashi Sakamoto */ 107*d67c46b9STakashi Sakamoto void amdtp_stream_destroy(struct amdtp_stream *s) 108*d67c46b9STakashi Sakamoto { 109*d67c46b9STakashi Sakamoto WARN_ON(amdtp_stream_running(s)); 110*d67c46b9STakashi Sakamoto mutex_destroy(&s->mutex); 111*d67c46b9STakashi Sakamoto } 112*d67c46b9STakashi Sakamoto EXPORT_SYMBOL(amdtp_stream_destroy); 113*d67c46b9STakashi Sakamoto 114*d67c46b9STakashi Sakamoto const unsigned int amdtp_syt_intervals[CIP_SFC_COUNT] = { 115*d67c46b9STakashi Sakamoto [CIP_SFC_32000] = 8, 116*d67c46b9STakashi Sakamoto [CIP_SFC_44100] = 8, 117*d67c46b9STakashi Sakamoto [CIP_SFC_48000] = 8, 118*d67c46b9STakashi Sakamoto [CIP_SFC_88200] = 16, 119*d67c46b9STakashi Sakamoto [CIP_SFC_96000] = 16, 120*d67c46b9STakashi Sakamoto [CIP_SFC_176400] = 32, 121*d67c46b9STakashi Sakamoto [CIP_SFC_192000] = 32, 122*d67c46b9STakashi Sakamoto }; 123*d67c46b9STakashi Sakamoto EXPORT_SYMBOL(amdtp_syt_intervals); 124*d67c46b9STakashi Sakamoto 125*d67c46b9STakashi Sakamoto const unsigned int amdtp_rate_table[CIP_SFC_COUNT] = { 126*d67c46b9STakashi Sakamoto [CIP_SFC_32000] = 32000, 127*d67c46b9STakashi Sakamoto [CIP_SFC_44100] = 44100, 128*d67c46b9STakashi Sakamoto [CIP_SFC_48000] = 48000, 129*d67c46b9STakashi Sakamoto [CIP_SFC_88200] = 88200, 130*d67c46b9STakashi Sakamoto [CIP_SFC_96000] = 96000, 131*d67c46b9STakashi Sakamoto [CIP_SFC_176400] = 176400, 132*d67c46b9STakashi Sakamoto [CIP_SFC_192000] = 192000, 133*d67c46b9STakashi Sakamoto }; 134*d67c46b9STakashi Sakamoto EXPORT_SYMBOL(amdtp_rate_table); 135*d67c46b9STakashi Sakamoto 136*d67c46b9STakashi Sakamoto /** 137*d67c46b9STakashi Sakamoto * amdtp_stream_add_pcm_hw_constraints - add hw constraints for PCM substream 138*d67c46b9STakashi Sakamoto * @s: the AMDTP stream, which must be initialized. 139*d67c46b9STakashi Sakamoto * @runtime: the PCM substream runtime 140*d67c46b9STakashi Sakamoto */ 141*d67c46b9STakashi Sakamoto int amdtp_stream_add_pcm_hw_constraints(struct amdtp_stream *s, 142*d67c46b9STakashi Sakamoto struct snd_pcm_runtime *runtime) 143*d67c46b9STakashi Sakamoto { 144*d67c46b9STakashi Sakamoto int err; 145*d67c46b9STakashi Sakamoto 146*d67c46b9STakashi Sakamoto /* AM824 in IEC 61883-6 can deliver 24bit data */ 147*d67c46b9STakashi Sakamoto err = snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24); 148*d67c46b9STakashi Sakamoto if (err < 0) 149*d67c46b9STakashi Sakamoto goto end; 150*d67c46b9STakashi Sakamoto 151*d67c46b9STakashi Sakamoto /* 152*d67c46b9STakashi Sakamoto * Currently firewire-lib processes 16 packets in one software 153*d67c46b9STakashi Sakamoto * interrupt callback. This equals to 2msec but actually the 154*d67c46b9STakashi Sakamoto * interval of the interrupts has a jitter. 155*d67c46b9STakashi Sakamoto * Additionally, even if adding a constraint to fit period size to 156*d67c46b9STakashi Sakamoto * 2msec, actual calculated frames per period doesn't equal to 2msec, 157*d67c46b9STakashi Sakamoto * depending on sampling rate. 158*d67c46b9STakashi Sakamoto * Anyway, the interval to call snd_pcm_period_elapsed() cannot 2msec. 159*d67c46b9STakashi Sakamoto * Here let us use 5msec for safe period interrupt. 160*d67c46b9STakashi Sakamoto */ 161*d67c46b9STakashi Sakamoto err = snd_pcm_hw_constraint_minmax(runtime, 162*d67c46b9STakashi Sakamoto SNDRV_PCM_HW_PARAM_PERIOD_TIME, 163*d67c46b9STakashi Sakamoto 5000, UINT_MAX); 164*d67c46b9STakashi Sakamoto if (err < 0) 165*d67c46b9STakashi Sakamoto goto end; 166*d67c46b9STakashi Sakamoto 167*d67c46b9STakashi Sakamoto /* Non-Blocking stream has no more constraints */ 168*d67c46b9STakashi Sakamoto if (!(s->flags & CIP_BLOCKING)) 169*d67c46b9STakashi Sakamoto goto end; 170*d67c46b9STakashi Sakamoto 171*d67c46b9STakashi Sakamoto /* 172*d67c46b9STakashi Sakamoto * One AMDTP packet can include some frames. In blocking mode, the 173*d67c46b9STakashi Sakamoto * number equals to SYT_INTERVAL. So the number is 8, 16 or 32, 174*d67c46b9STakashi Sakamoto * depending on its sampling rate. For accurate period interrupt, it's 175*d67c46b9STakashi Sakamoto * preferrable to align period/buffer sizes to current SYT_INTERVAL. 176*d67c46b9STakashi Sakamoto * 177*d67c46b9STakashi Sakamoto * TODO: These constraints can be improved with proper rules. 178*d67c46b9STakashi Sakamoto * Currently apply LCM of SYT_INTERVALs. 179*d67c46b9STakashi Sakamoto */ 180*d67c46b9STakashi Sakamoto err = snd_pcm_hw_constraint_step(runtime, 0, 181*d67c46b9STakashi Sakamoto SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 32); 182*d67c46b9STakashi Sakamoto if (err < 0) 183*d67c46b9STakashi Sakamoto goto end; 184*d67c46b9STakashi Sakamoto err = snd_pcm_hw_constraint_step(runtime, 0, 185*d67c46b9STakashi Sakamoto SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 32); 186*d67c46b9STakashi Sakamoto end: 187*d67c46b9STakashi Sakamoto return err; 188*d67c46b9STakashi Sakamoto } 189*d67c46b9STakashi Sakamoto EXPORT_SYMBOL(amdtp_stream_add_pcm_hw_constraints); 190*d67c46b9STakashi Sakamoto 191*d67c46b9STakashi Sakamoto /** 192*d67c46b9STakashi Sakamoto * amdtp_stream_set_parameters - set stream parameters 193*d67c46b9STakashi Sakamoto * @s: the AMDTP stream to configure 194*d67c46b9STakashi Sakamoto * @rate: the sample rate 195*d67c46b9STakashi Sakamoto * @pcm_channels: the number of PCM samples in each data block, to be encoded 196*d67c46b9STakashi Sakamoto * as AM824 multi-bit linear audio 197*d67c46b9STakashi Sakamoto * @midi_ports: the number of MIDI ports (i.e., MPX-MIDI Data Channels) 198*d67c46b9STakashi Sakamoto * @double_pcm_frames: one data block transfers two PCM frames 199*d67c46b9STakashi Sakamoto * 200*d67c46b9STakashi Sakamoto * The parameters must be set before the stream is started, and must not be 201*d67c46b9STakashi Sakamoto * changed while the stream is running. 202*d67c46b9STakashi Sakamoto */ 203*d67c46b9STakashi Sakamoto int amdtp_stream_set_parameters(struct amdtp_stream *s, 204*d67c46b9STakashi Sakamoto unsigned int rate, 205*d67c46b9STakashi Sakamoto unsigned int pcm_channels, 206*d67c46b9STakashi Sakamoto unsigned int midi_ports, 207*d67c46b9STakashi Sakamoto bool double_pcm_frames) 208*d67c46b9STakashi Sakamoto { 209*d67c46b9STakashi Sakamoto unsigned int i, sfc, midi_channels; 210*d67c46b9STakashi Sakamoto 211*d67c46b9STakashi Sakamoto midi_channels = DIV_ROUND_UP(midi_ports, 8); 212*d67c46b9STakashi Sakamoto 213*d67c46b9STakashi Sakamoto if (WARN_ON(amdtp_stream_running(s)) || 214*d67c46b9STakashi Sakamoto WARN_ON(pcm_channels > AMDTP_MAX_CHANNELS_FOR_PCM) || 215*d67c46b9STakashi Sakamoto WARN_ON(midi_channels > AMDTP_MAX_CHANNELS_FOR_MIDI)) 216*d67c46b9STakashi Sakamoto return -EINVAL; 217*d67c46b9STakashi Sakamoto 218*d67c46b9STakashi Sakamoto for (sfc = 0; sfc < ARRAY_SIZE(amdtp_rate_table); ++sfc) { 219*d67c46b9STakashi Sakamoto if (amdtp_rate_table[sfc] == rate) 220*d67c46b9STakashi Sakamoto break; 221*d67c46b9STakashi Sakamoto } 222*d67c46b9STakashi Sakamoto if (sfc == ARRAY_SIZE(amdtp_rate_table)) 223*d67c46b9STakashi Sakamoto return -EINVAL; 224*d67c46b9STakashi Sakamoto 225*d67c46b9STakashi Sakamoto s->pcm_channels = pcm_channels; 226*d67c46b9STakashi Sakamoto s->sfc = sfc; 227*d67c46b9STakashi Sakamoto s->data_block_quadlets = s->pcm_channels + midi_channels; 228*d67c46b9STakashi Sakamoto s->midi_ports = midi_ports; 229*d67c46b9STakashi Sakamoto 230*d67c46b9STakashi Sakamoto s->fdf = AMDTP_FDF_AM824 | s->sfc; 231*d67c46b9STakashi Sakamoto 232*d67c46b9STakashi Sakamoto /* 233*d67c46b9STakashi Sakamoto * In IEC 61883-6, one data block represents one event. In ALSA, one 234*d67c46b9STakashi Sakamoto * event equals to one PCM frame. But Dice has a quirk at higher 235*d67c46b9STakashi Sakamoto * sampling rate to transfer two PCM frames in one data block. 236*d67c46b9STakashi Sakamoto */ 237*d67c46b9STakashi Sakamoto if (double_pcm_frames) 238*d67c46b9STakashi Sakamoto s->frame_multiplier = 2; 239*d67c46b9STakashi Sakamoto else 240*d67c46b9STakashi Sakamoto s->frame_multiplier = 1; 241*d67c46b9STakashi Sakamoto 242*d67c46b9STakashi Sakamoto s->syt_interval = amdtp_syt_intervals[sfc]; 243*d67c46b9STakashi Sakamoto 244*d67c46b9STakashi Sakamoto /* default buffering in the device */ 245*d67c46b9STakashi Sakamoto s->transfer_delay = TRANSFER_DELAY_TICKS - TICKS_PER_CYCLE; 246*d67c46b9STakashi Sakamoto if (s->flags & CIP_BLOCKING) 247*d67c46b9STakashi Sakamoto /* additional buffering needed to adjust for no-data packets */ 248*d67c46b9STakashi Sakamoto s->transfer_delay += TICKS_PER_SECOND * s->syt_interval / rate; 249*d67c46b9STakashi Sakamoto 250*d67c46b9STakashi Sakamoto /* init the position map for PCM and MIDI channels */ 251*d67c46b9STakashi Sakamoto for (i = 0; i < pcm_channels; i++) 252*d67c46b9STakashi Sakamoto s->pcm_positions[i] = i; 253*d67c46b9STakashi Sakamoto s->midi_position = s->pcm_channels; 254*d67c46b9STakashi Sakamoto 255*d67c46b9STakashi Sakamoto /* 256*d67c46b9STakashi Sakamoto * We do not know the actual MIDI FIFO size of most devices. Just 257*d67c46b9STakashi Sakamoto * assume two bytes, i.e., one byte can be received over the bus while 258*d67c46b9STakashi Sakamoto * the previous one is transmitted over MIDI. 259*d67c46b9STakashi Sakamoto * (The value here is adjusted for midi_ratelimit_per_packet().) 260*d67c46b9STakashi Sakamoto */ 261*d67c46b9STakashi Sakamoto s->midi_fifo_limit = rate - MIDI_BYTES_PER_SECOND * s->syt_interval + 1; 262*d67c46b9STakashi Sakamoto 263*d67c46b9STakashi Sakamoto return 0; 264*d67c46b9STakashi Sakamoto } 265*d67c46b9STakashi Sakamoto EXPORT_SYMBOL(amdtp_stream_set_parameters); 266*d67c46b9STakashi Sakamoto 267*d67c46b9STakashi Sakamoto /** 268*d67c46b9STakashi Sakamoto * amdtp_stream_get_max_payload - get the stream's packet size 269*d67c46b9STakashi Sakamoto * @s: the AMDTP stream 270*d67c46b9STakashi Sakamoto * 271*d67c46b9STakashi Sakamoto * This function must not be called before the stream has been configured 272*d67c46b9STakashi Sakamoto * with amdtp_stream_set_parameters(). 273*d67c46b9STakashi Sakamoto */ 274*d67c46b9STakashi Sakamoto unsigned int amdtp_stream_get_max_payload(struct amdtp_stream *s) 275*d67c46b9STakashi Sakamoto { 276*d67c46b9STakashi Sakamoto unsigned int multiplier = 1; 277*d67c46b9STakashi Sakamoto 278*d67c46b9STakashi Sakamoto if (s->flags & CIP_JUMBO_PAYLOAD) 279*d67c46b9STakashi Sakamoto multiplier = 5; 280*d67c46b9STakashi Sakamoto 281*d67c46b9STakashi Sakamoto return 8 + s->syt_interval * s->data_block_quadlets * 4 * multiplier; 282*d67c46b9STakashi Sakamoto } 283*d67c46b9STakashi Sakamoto EXPORT_SYMBOL(amdtp_stream_get_max_payload); 284*d67c46b9STakashi Sakamoto 285*d67c46b9STakashi Sakamoto static void write_pcm_s16(struct amdtp_stream *s, 286*d67c46b9STakashi Sakamoto struct snd_pcm_substream *pcm, 287*d67c46b9STakashi Sakamoto __be32 *buffer, unsigned int frames); 288*d67c46b9STakashi Sakamoto static void write_pcm_s32(struct amdtp_stream *s, 289*d67c46b9STakashi Sakamoto struct snd_pcm_substream *pcm, 290*d67c46b9STakashi Sakamoto __be32 *buffer, unsigned int frames); 291*d67c46b9STakashi Sakamoto static void read_pcm_s32(struct amdtp_stream *s, 292*d67c46b9STakashi Sakamoto struct snd_pcm_substream *pcm, 293*d67c46b9STakashi Sakamoto __be32 *buffer, unsigned int frames); 294*d67c46b9STakashi Sakamoto 295*d67c46b9STakashi Sakamoto /** 296*d67c46b9STakashi Sakamoto * amdtp_stream_set_pcm_format - set the PCM format 297*d67c46b9STakashi Sakamoto * @s: the AMDTP stream to configure 298*d67c46b9STakashi Sakamoto * @format: the format of the ALSA PCM device 299*d67c46b9STakashi Sakamoto * 300*d67c46b9STakashi Sakamoto * The sample format must be set after the other parameters (rate/PCM channels/ 301*d67c46b9STakashi Sakamoto * MIDI) and before the stream is started, and must not be changed while the 302*d67c46b9STakashi Sakamoto * stream is running. 303*d67c46b9STakashi Sakamoto */ 304*d67c46b9STakashi Sakamoto void amdtp_stream_set_pcm_format(struct amdtp_stream *s, 305*d67c46b9STakashi Sakamoto snd_pcm_format_t format) 306*d67c46b9STakashi Sakamoto { 307*d67c46b9STakashi Sakamoto if (WARN_ON(amdtp_stream_pcm_running(s))) 308*d67c46b9STakashi Sakamoto return; 309*d67c46b9STakashi Sakamoto 310*d67c46b9STakashi Sakamoto switch (format) { 311*d67c46b9STakashi Sakamoto default: 312*d67c46b9STakashi Sakamoto WARN_ON(1); 313*d67c46b9STakashi Sakamoto /* fall through */ 314*d67c46b9STakashi Sakamoto case SNDRV_PCM_FORMAT_S16: 315*d67c46b9STakashi Sakamoto if (s->direction == AMDTP_OUT_STREAM) { 316*d67c46b9STakashi Sakamoto s->transfer_samples = write_pcm_s16; 317*d67c46b9STakashi Sakamoto break; 318*d67c46b9STakashi Sakamoto } 319*d67c46b9STakashi Sakamoto WARN_ON(1); 320*d67c46b9STakashi Sakamoto /* fall through */ 321*d67c46b9STakashi Sakamoto case SNDRV_PCM_FORMAT_S32: 322*d67c46b9STakashi Sakamoto if (s->direction == AMDTP_OUT_STREAM) 323*d67c46b9STakashi Sakamoto s->transfer_samples = write_pcm_s32; 324*d67c46b9STakashi Sakamoto else 325*d67c46b9STakashi Sakamoto s->transfer_samples = read_pcm_s32; 326*d67c46b9STakashi Sakamoto break; 327*d67c46b9STakashi Sakamoto } 328*d67c46b9STakashi Sakamoto } 329*d67c46b9STakashi Sakamoto EXPORT_SYMBOL(amdtp_stream_set_pcm_format); 330*d67c46b9STakashi Sakamoto 331*d67c46b9STakashi Sakamoto /** 332*d67c46b9STakashi Sakamoto * amdtp_stream_pcm_prepare - prepare PCM device for running 333*d67c46b9STakashi Sakamoto * @s: the AMDTP stream 334*d67c46b9STakashi Sakamoto * 335*d67c46b9STakashi Sakamoto * This function should be called from the PCM device's .prepare callback. 336*d67c46b9STakashi Sakamoto */ 337*d67c46b9STakashi Sakamoto void amdtp_stream_pcm_prepare(struct amdtp_stream *s) 338*d67c46b9STakashi Sakamoto { 339*d67c46b9STakashi Sakamoto tasklet_kill(&s->period_tasklet); 340*d67c46b9STakashi Sakamoto s->pcm_buffer_pointer = 0; 341*d67c46b9STakashi Sakamoto s->pcm_period_pointer = 0; 342*d67c46b9STakashi Sakamoto s->pointer_flush = true; 343*d67c46b9STakashi Sakamoto } 344*d67c46b9STakashi Sakamoto EXPORT_SYMBOL(amdtp_stream_pcm_prepare); 345*d67c46b9STakashi Sakamoto 346*d67c46b9STakashi Sakamoto static unsigned int calculate_data_blocks(struct amdtp_stream *s, 347*d67c46b9STakashi Sakamoto unsigned int syt) 348*d67c46b9STakashi Sakamoto { 349*d67c46b9STakashi Sakamoto unsigned int phase, data_blocks; 350*d67c46b9STakashi Sakamoto 351*d67c46b9STakashi Sakamoto /* Blocking mode. */ 352*d67c46b9STakashi Sakamoto if (s->flags & CIP_BLOCKING) { 353*d67c46b9STakashi Sakamoto /* This module generate empty packet for 'no data'. */ 354*d67c46b9STakashi Sakamoto if (syt == CIP_SYT_NO_INFO) 355*d67c46b9STakashi Sakamoto data_blocks = 0; 356*d67c46b9STakashi Sakamoto else 357*d67c46b9STakashi Sakamoto data_blocks = s->syt_interval; 358*d67c46b9STakashi Sakamoto /* Non-blocking mode. */ 359*d67c46b9STakashi Sakamoto } else { 360*d67c46b9STakashi Sakamoto if (!cip_sfc_is_base_44100(s->sfc)) { 361*d67c46b9STakashi Sakamoto /* Sample_rate / 8000 is an integer, and precomputed. */ 362*d67c46b9STakashi Sakamoto data_blocks = s->data_block_state; 363*d67c46b9STakashi Sakamoto } else { 364*d67c46b9STakashi Sakamoto phase = s->data_block_state; 365*d67c46b9STakashi Sakamoto 366*d67c46b9STakashi Sakamoto /* 367*d67c46b9STakashi Sakamoto * This calculates the number of data blocks per packet so that 368*d67c46b9STakashi Sakamoto * 1) the overall rate is correct and exactly synchronized to 369*d67c46b9STakashi Sakamoto * the bus clock, and 370*d67c46b9STakashi Sakamoto * 2) packets with a rounded-up number of blocks occur as early 371*d67c46b9STakashi Sakamoto * as possible in the sequence (to prevent underruns of the 372*d67c46b9STakashi Sakamoto * device's buffer). 373*d67c46b9STakashi Sakamoto */ 374*d67c46b9STakashi Sakamoto if (s->sfc == CIP_SFC_44100) 375*d67c46b9STakashi Sakamoto /* 6 6 5 6 5 6 5 ... */ 376*d67c46b9STakashi Sakamoto data_blocks = 5 + ((phase & 1) ^ 377*d67c46b9STakashi Sakamoto (phase == 0 || phase >= 40)); 378*d67c46b9STakashi Sakamoto else 379*d67c46b9STakashi Sakamoto /* 12 11 11 11 11 ... or 23 22 22 22 22 ... */ 380*d67c46b9STakashi Sakamoto data_blocks = 11 * (s->sfc >> 1) + (phase == 0); 381*d67c46b9STakashi Sakamoto if (++phase >= (80 >> (s->sfc >> 1))) 382*d67c46b9STakashi Sakamoto phase = 0; 383*d67c46b9STakashi Sakamoto s->data_block_state = phase; 384*d67c46b9STakashi Sakamoto } 385*d67c46b9STakashi Sakamoto } 386*d67c46b9STakashi Sakamoto 387*d67c46b9STakashi Sakamoto return data_blocks; 388*d67c46b9STakashi Sakamoto } 389*d67c46b9STakashi Sakamoto 390*d67c46b9STakashi Sakamoto static unsigned int calculate_syt(struct amdtp_stream *s, 391*d67c46b9STakashi Sakamoto unsigned int cycle) 392*d67c46b9STakashi Sakamoto { 393*d67c46b9STakashi Sakamoto unsigned int syt_offset, phase, index, syt; 394*d67c46b9STakashi Sakamoto 395*d67c46b9STakashi Sakamoto if (s->last_syt_offset < TICKS_PER_CYCLE) { 396*d67c46b9STakashi Sakamoto if (!cip_sfc_is_base_44100(s->sfc)) 397*d67c46b9STakashi Sakamoto syt_offset = s->last_syt_offset + s->syt_offset_state; 398*d67c46b9STakashi Sakamoto else { 399*d67c46b9STakashi Sakamoto /* 400*d67c46b9STakashi Sakamoto * The time, in ticks, of the n'th SYT_INTERVAL sample is: 401*d67c46b9STakashi Sakamoto * n * SYT_INTERVAL * 24576000 / sample_rate 402*d67c46b9STakashi Sakamoto * Modulo TICKS_PER_CYCLE, the difference between successive 403*d67c46b9STakashi Sakamoto * elements is about 1386.23. Rounding the results of this 404*d67c46b9STakashi Sakamoto * formula to the SYT precision results in a sequence of 405*d67c46b9STakashi Sakamoto * differences that begins with: 406*d67c46b9STakashi Sakamoto * 1386 1386 1387 1386 1386 1386 1387 1386 1386 1386 1387 ... 407*d67c46b9STakashi Sakamoto * This code generates _exactly_ the same sequence. 408*d67c46b9STakashi Sakamoto */ 409*d67c46b9STakashi Sakamoto phase = s->syt_offset_state; 410*d67c46b9STakashi Sakamoto index = phase % 13; 411*d67c46b9STakashi Sakamoto syt_offset = s->last_syt_offset; 412*d67c46b9STakashi Sakamoto syt_offset += 1386 + ((index && !(index & 3)) || 413*d67c46b9STakashi Sakamoto phase == 146); 414*d67c46b9STakashi Sakamoto if (++phase >= 147) 415*d67c46b9STakashi Sakamoto phase = 0; 416*d67c46b9STakashi Sakamoto s->syt_offset_state = phase; 417*d67c46b9STakashi Sakamoto } 418*d67c46b9STakashi Sakamoto } else 419*d67c46b9STakashi Sakamoto syt_offset = s->last_syt_offset - TICKS_PER_CYCLE; 420*d67c46b9STakashi Sakamoto s->last_syt_offset = syt_offset; 421*d67c46b9STakashi Sakamoto 422*d67c46b9STakashi Sakamoto if (syt_offset < TICKS_PER_CYCLE) { 423*d67c46b9STakashi Sakamoto syt_offset += s->transfer_delay; 424*d67c46b9STakashi Sakamoto syt = (cycle + syt_offset / TICKS_PER_CYCLE) << 12; 425*d67c46b9STakashi Sakamoto syt += syt_offset % TICKS_PER_CYCLE; 426*d67c46b9STakashi Sakamoto 427*d67c46b9STakashi Sakamoto return syt & CIP_SYT_MASK; 428*d67c46b9STakashi Sakamoto } else { 429*d67c46b9STakashi Sakamoto return CIP_SYT_NO_INFO; 430*d67c46b9STakashi Sakamoto } 431*d67c46b9STakashi Sakamoto } 432*d67c46b9STakashi Sakamoto 433*d67c46b9STakashi Sakamoto static void write_pcm_s32(struct amdtp_stream *s, 434*d67c46b9STakashi Sakamoto struct snd_pcm_substream *pcm, 435*d67c46b9STakashi Sakamoto __be32 *buffer, unsigned int frames) 436*d67c46b9STakashi Sakamoto { 437*d67c46b9STakashi Sakamoto struct snd_pcm_runtime *runtime = pcm->runtime; 438*d67c46b9STakashi Sakamoto unsigned int channels, remaining_frames, i, c; 439*d67c46b9STakashi Sakamoto const u32 *src; 440*d67c46b9STakashi Sakamoto 441*d67c46b9STakashi Sakamoto channels = s->pcm_channels; 442*d67c46b9STakashi Sakamoto src = (void *)runtime->dma_area + 443*d67c46b9STakashi Sakamoto frames_to_bytes(runtime, s->pcm_buffer_pointer); 444*d67c46b9STakashi Sakamoto remaining_frames = runtime->buffer_size - s->pcm_buffer_pointer; 445*d67c46b9STakashi Sakamoto 446*d67c46b9STakashi Sakamoto for (i = 0; i < frames; ++i) { 447*d67c46b9STakashi Sakamoto for (c = 0; c < channels; ++c) { 448*d67c46b9STakashi Sakamoto buffer[s->pcm_positions[c]] = 449*d67c46b9STakashi Sakamoto cpu_to_be32((*src >> 8) | 0x40000000); 450*d67c46b9STakashi Sakamoto src++; 451*d67c46b9STakashi Sakamoto } 452*d67c46b9STakashi Sakamoto buffer += s->data_block_quadlets; 453*d67c46b9STakashi Sakamoto if (--remaining_frames == 0) 454*d67c46b9STakashi Sakamoto src = (void *)runtime->dma_area; 455*d67c46b9STakashi Sakamoto } 456*d67c46b9STakashi Sakamoto } 457*d67c46b9STakashi Sakamoto 458*d67c46b9STakashi Sakamoto static void write_pcm_s16(struct amdtp_stream *s, 459*d67c46b9STakashi Sakamoto struct snd_pcm_substream *pcm, 460*d67c46b9STakashi Sakamoto __be32 *buffer, unsigned int frames) 461*d67c46b9STakashi Sakamoto { 462*d67c46b9STakashi Sakamoto struct snd_pcm_runtime *runtime = pcm->runtime; 463*d67c46b9STakashi Sakamoto unsigned int channels, remaining_frames, i, c; 464*d67c46b9STakashi Sakamoto const u16 *src; 465*d67c46b9STakashi Sakamoto 466*d67c46b9STakashi Sakamoto channels = s->pcm_channels; 467*d67c46b9STakashi Sakamoto src = (void *)runtime->dma_area + 468*d67c46b9STakashi Sakamoto frames_to_bytes(runtime, s->pcm_buffer_pointer); 469*d67c46b9STakashi Sakamoto remaining_frames = runtime->buffer_size - s->pcm_buffer_pointer; 470*d67c46b9STakashi Sakamoto 471*d67c46b9STakashi Sakamoto for (i = 0; i < frames; ++i) { 472*d67c46b9STakashi Sakamoto for (c = 0; c < channels; ++c) { 473*d67c46b9STakashi Sakamoto buffer[s->pcm_positions[c]] = 474*d67c46b9STakashi Sakamoto cpu_to_be32((*src << 8) | 0x42000000); 475*d67c46b9STakashi Sakamoto src++; 476*d67c46b9STakashi Sakamoto } 477*d67c46b9STakashi Sakamoto buffer += s->data_block_quadlets; 478*d67c46b9STakashi Sakamoto if (--remaining_frames == 0) 479*d67c46b9STakashi Sakamoto src = (void *)runtime->dma_area; 480*d67c46b9STakashi Sakamoto } 481*d67c46b9STakashi Sakamoto } 482*d67c46b9STakashi Sakamoto 483*d67c46b9STakashi Sakamoto static void read_pcm_s32(struct amdtp_stream *s, 484*d67c46b9STakashi Sakamoto struct snd_pcm_substream *pcm, 485*d67c46b9STakashi Sakamoto __be32 *buffer, unsigned int frames) 486*d67c46b9STakashi Sakamoto { 487*d67c46b9STakashi Sakamoto struct snd_pcm_runtime *runtime = pcm->runtime; 488*d67c46b9STakashi Sakamoto unsigned int channels, remaining_frames, i, c; 489*d67c46b9STakashi Sakamoto u32 *dst; 490*d67c46b9STakashi Sakamoto 491*d67c46b9STakashi Sakamoto channels = s->pcm_channels; 492*d67c46b9STakashi Sakamoto dst = (void *)runtime->dma_area + 493*d67c46b9STakashi Sakamoto frames_to_bytes(runtime, s->pcm_buffer_pointer); 494*d67c46b9STakashi Sakamoto remaining_frames = runtime->buffer_size - s->pcm_buffer_pointer; 495*d67c46b9STakashi Sakamoto 496*d67c46b9STakashi Sakamoto for (i = 0; i < frames; ++i) { 497*d67c46b9STakashi Sakamoto for (c = 0; c < channels; ++c) { 498*d67c46b9STakashi Sakamoto *dst = be32_to_cpu(buffer[s->pcm_positions[c]]) << 8; 499*d67c46b9STakashi Sakamoto dst++; 500*d67c46b9STakashi Sakamoto } 501*d67c46b9STakashi Sakamoto buffer += s->data_block_quadlets; 502*d67c46b9STakashi Sakamoto if (--remaining_frames == 0) 503*d67c46b9STakashi Sakamoto dst = (void *)runtime->dma_area; 504*d67c46b9STakashi Sakamoto } 505*d67c46b9STakashi Sakamoto } 506*d67c46b9STakashi Sakamoto 507*d67c46b9STakashi Sakamoto static void write_pcm_silence(struct amdtp_stream *s, 508*d67c46b9STakashi Sakamoto __be32 *buffer, unsigned int frames) 509*d67c46b9STakashi Sakamoto { 510*d67c46b9STakashi Sakamoto unsigned int i, c; 511*d67c46b9STakashi Sakamoto 512*d67c46b9STakashi Sakamoto for (i = 0; i < frames; ++i) { 513*d67c46b9STakashi Sakamoto for (c = 0; c < s->pcm_channels; ++c) 514*d67c46b9STakashi Sakamoto buffer[s->pcm_positions[c]] = cpu_to_be32(0x40000000); 515*d67c46b9STakashi Sakamoto buffer += s->data_block_quadlets; 516*d67c46b9STakashi Sakamoto } 517*d67c46b9STakashi Sakamoto } 518*d67c46b9STakashi Sakamoto 519*d67c46b9STakashi Sakamoto /* 520*d67c46b9STakashi Sakamoto * To avoid sending MIDI bytes at too high a rate, assume that the receiving 521*d67c46b9STakashi Sakamoto * device has a FIFO, and track how much it is filled. This values increases 522*d67c46b9STakashi Sakamoto * by one whenever we send one byte in a packet, but the FIFO empties at 523*d67c46b9STakashi Sakamoto * a constant rate independent of our packet rate. One packet has syt_interval 524*d67c46b9STakashi Sakamoto * samples, so the number of bytes that empty out of the FIFO, per packet(!), 525*d67c46b9STakashi Sakamoto * is MIDI_BYTES_PER_SECOND * syt_interval / sample_rate. To avoid storing 526*d67c46b9STakashi Sakamoto * fractional values, the values in midi_fifo_used[] are measured in bytes 527*d67c46b9STakashi Sakamoto * multiplied by the sample rate. 528*d67c46b9STakashi Sakamoto */ 529*d67c46b9STakashi Sakamoto static bool midi_ratelimit_per_packet(struct amdtp_stream *s, unsigned int port) 530*d67c46b9STakashi Sakamoto { 531*d67c46b9STakashi Sakamoto int used; 532*d67c46b9STakashi Sakamoto 533*d67c46b9STakashi Sakamoto used = s->midi_fifo_used[port]; 534*d67c46b9STakashi Sakamoto if (used == 0) /* common shortcut */ 535*d67c46b9STakashi Sakamoto return true; 536*d67c46b9STakashi Sakamoto 537*d67c46b9STakashi Sakamoto used -= MIDI_BYTES_PER_SECOND * s->syt_interval; 538*d67c46b9STakashi Sakamoto used = max(used, 0); 539*d67c46b9STakashi Sakamoto s->midi_fifo_used[port] = used; 540*d67c46b9STakashi Sakamoto 541*d67c46b9STakashi Sakamoto return used < s->midi_fifo_limit; 542*d67c46b9STakashi Sakamoto } 543*d67c46b9STakashi Sakamoto 544*d67c46b9STakashi Sakamoto static void midi_rate_use_one_byte(struct amdtp_stream *s, unsigned int port) 545*d67c46b9STakashi Sakamoto { 546*d67c46b9STakashi Sakamoto s->midi_fifo_used[port] += amdtp_rate_table[s->sfc]; 547*d67c46b9STakashi Sakamoto } 548*d67c46b9STakashi Sakamoto 549*d67c46b9STakashi Sakamoto static void write_midi_messages(struct amdtp_stream *s, 550*d67c46b9STakashi Sakamoto __be32 *buffer, unsigned int frames) 551*d67c46b9STakashi Sakamoto { 552*d67c46b9STakashi Sakamoto unsigned int f, port; 553*d67c46b9STakashi Sakamoto u8 *b; 554*d67c46b9STakashi Sakamoto 555*d67c46b9STakashi Sakamoto for (f = 0; f < frames; f++) { 556*d67c46b9STakashi Sakamoto b = (u8 *)&buffer[s->midi_position]; 557*d67c46b9STakashi Sakamoto 558*d67c46b9STakashi Sakamoto port = (s->data_block_counter + f) % 8; 559*d67c46b9STakashi Sakamoto if (f < MAX_MIDI_RX_BLOCKS && 560*d67c46b9STakashi Sakamoto midi_ratelimit_per_packet(s, port) && 561*d67c46b9STakashi Sakamoto s->midi[port] != NULL && 562*d67c46b9STakashi Sakamoto snd_rawmidi_transmit(s->midi[port], &b[1], 1) == 1) { 563*d67c46b9STakashi Sakamoto midi_rate_use_one_byte(s, port); 564*d67c46b9STakashi Sakamoto b[0] = 0x81; 565*d67c46b9STakashi Sakamoto } else { 566*d67c46b9STakashi Sakamoto b[0] = 0x80; 567*d67c46b9STakashi Sakamoto b[1] = 0; 568*d67c46b9STakashi Sakamoto } 569*d67c46b9STakashi Sakamoto b[2] = 0; 570*d67c46b9STakashi Sakamoto b[3] = 0; 571*d67c46b9STakashi Sakamoto 572*d67c46b9STakashi Sakamoto buffer += s->data_block_quadlets; 573*d67c46b9STakashi Sakamoto } 574*d67c46b9STakashi Sakamoto } 575*d67c46b9STakashi Sakamoto 576*d67c46b9STakashi Sakamoto static void read_midi_messages(struct amdtp_stream *s, 577*d67c46b9STakashi Sakamoto __be32 *buffer, unsigned int frames) 578*d67c46b9STakashi Sakamoto { 579*d67c46b9STakashi Sakamoto unsigned int f, port; 580*d67c46b9STakashi Sakamoto int len; 581*d67c46b9STakashi Sakamoto u8 *b; 582*d67c46b9STakashi Sakamoto 583*d67c46b9STakashi Sakamoto for (f = 0; f < frames; f++) { 584*d67c46b9STakashi Sakamoto port = (s->data_block_counter + f) % 8; 585*d67c46b9STakashi Sakamoto b = (u8 *)&buffer[s->midi_position]; 586*d67c46b9STakashi Sakamoto 587*d67c46b9STakashi Sakamoto len = b[0] - 0x80; 588*d67c46b9STakashi Sakamoto if ((1 <= len) && (len <= 3) && (s->midi[port])) 589*d67c46b9STakashi Sakamoto snd_rawmidi_receive(s->midi[port], b + 1, len); 590*d67c46b9STakashi Sakamoto 591*d67c46b9STakashi Sakamoto buffer += s->data_block_quadlets; 592*d67c46b9STakashi Sakamoto } 593*d67c46b9STakashi Sakamoto } 594*d67c46b9STakashi Sakamoto 595*d67c46b9STakashi Sakamoto static void update_pcm_pointers(struct amdtp_stream *s, 596*d67c46b9STakashi Sakamoto struct snd_pcm_substream *pcm, 597*d67c46b9STakashi Sakamoto unsigned int frames) 598*d67c46b9STakashi Sakamoto { 599*d67c46b9STakashi Sakamoto unsigned int ptr; 600*d67c46b9STakashi Sakamoto 601*d67c46b9STakashi Sakamoto ptr = s->pcm_buffer_pointer + frames; 602*d67c46b9STakashi Sakamoto if (ptr >= pcm->runtime->buffer_size) 603*d67c46b9STakashi Sakamoto ptr -= pcm->runtime->buffer_size; 604*d67c46b9STakashi Sakamoto ACCESS_ONCE(s->pcm_buffer_pointer) = ptr; 605*d67c46b9STakashi Sakamoto 606*d67c46b9STakashi Sakamoto s->pcm_period_pointer += frames; 607*d67c46b9STakashi Sakamoto if (s->pcm_period_pointer >= pcm->runtime->period_size) { 608*d67c46b9STakashi Sakamoto s->pcm_period_pointer -= pcm->runtime->period_size; 609*d67c46b9STakashi Sakamoto s->pointer_flush = false; 610*d67c46b9STakashi Sakamoto tasklet_hi_schedule(&s->period_tasklet); 611*d67c46b9STakashi Sakamoto } 612*d67c46b9STakashi Sakamoto } 613*d67c46b9STakashi Sakamoto 614*d67c46b9STakashi Sakamoto static void pcm_period_tasklet(unsigned long data) 615*d67c46b9STakashi Sakamoto { 616*d67c46b9STakashi Sakamoto struct amdtp_stream *s = (void *)data; 617*d67c46b9STakashi Sakamoto struct snd_pcm_substream *pcm = ACCESS_ONCE(s->pcm); 618*d67c46b9STakashi Sakamoto 619*d67c46b9STakashi Sakamoto if (pcm) 620*d67c46b9STakashi Sakamoto snd_pcm_period_elapsed(pcm); 621*d67c46b9STakashi Sakamoto } 622*d67c46b9STakashi Sakamoto 623*d67c46b9STakashi Sakamoto static int queue_packet(struct amdtp_stream *s, 624*d67c46b9STakashi Sakamoto unsigned int header_length, 625*d67c46b9STakashi Sakamoto unsigned int payload_length, bool skip) 626*d67c46b9STakashi Sakamoto { 627*d67c46b9STakashi Sakamoto struct fw_iso_packet p = {0}; 628*d67c46b9STakashi Sakamoto int err = 0; 629*d67c46b9STakashi Sakamoto 630*d67c46b9STakashi Sakamoto if (IS_ERR(s->context)) 631*d67c46b9STakashi Sakamoto goto end; 632*d67c46b9STakashi Sakamoto 633*d67c46b9STakashi Sakamoto p.interrupt = IS_ALIGNED(s->packet_index + 1, INTERRUPT_INTERVAL); 634*d67c46b9STakashi Sakamoto p.tag = TAG_CIP; 635*d67c46b9STakashi Sakamoto p.header_length = header_length; 636*d67c46b9STakashi Sakamoto p.payload_length = (!skip) ? payload_length : 0; 637*d67c46b9STakashi Sakamoto p.skip = skip; 638*d67c46b9STakashi Sakamoto err = fw_iso_context_queue(s->context, &p, &s->buffer.iso_buffer, 639*d67c46b9STakashi Sakamoto s->buffer.packets[s->packet_index].offset); 640*d67c46b9STakashi Sakamoto if (err < 0) { 641*d67c46b9STakashi Sakamoto dev_err(&s->unit->device, "queueing error: %d\n", err); 642*d67c46b9STakashi Sakamoto goto end; 643*d67c46b9STakashi Sakamoto } 644*d67c46b9STakashi Sakamoto 645*d67c46b9STakashi Sakamoto if (++s->packet_index >= QUEUE_LENGTH) 646*d67c46b9STakashi Sakamoto s->packet_index = 0; 647*d67c46b9STakashi Sakamoto end: 648*d67c46b9STakashi Sakamoto return err; 649*d67c46b9STakashi Sakamoto } 650*d67c46b9STakashi Sakamoto 651*d67c46b9STakashi Sakamoto static inline int queue_out_packet(struct amdtp_stream *s, 652*d67c46b9STakashi Sakamoto unsigned int payload_length, bool skip) 653*d67c46b9STakashi Sakamoto { 654*d67c46b9STakashi Sakamoto return queue_packet(s, OUT_PACKET_HEADER_SIZE, 655*d67c46b9STakashi Sakamoto payload_length, skip); 656*d67c46b9STakashi Sakamoto } 657*d67c46b9STakashi Sakamoto 658*d67c46b9STakashi Sakamoto static inline int queue_in_packet(struct amdtp_stream *s) 659*d67c46b9STakashi Sakamoto { 660*d67c46b9STakashi Sakamoto return queue_packet(s, IN_PACKET_HEADER_SIZE, 661*d67c46b9STakashi Sakamoto amdtp_stream_get_max_payload(s), false); 662*d67c46b9STakashi Sakamoto } 663*d67c46b9STakashi Sakamoto 664*d67c46b9STakashi Sakamoto unsigned int process_rx_data_blocks(struct amdtp_stream *s, __be32 *buffer, 665*d67c46b9STakashi Sakamoto unsigned int data_blocks, unsigned int *syt) 666*d67c46b9STakashi Sakamoto { 667*d67c46b9STakashi Sakamoto struct snd_pcm_substream *pcm = ACCESS_ONCE(s->pcm); 668*d67c46b9STakashi Sakamoto unsigned int pcm_frames; 669*d67c46b9STakashi Sakamoto 670*d67c46b9STakashi Sakamoto if (pcm) { 671*d67c46b9STakashi Sakamoto s->transfer_samples(s, pcm, buffer, data_blocks); 672*d67c46b9STakashi Sakamoto pcm_frames = data_blocks * s->frame_multiplier; 673*d67c46b9STakashi Sakamoto } else { 674*d67c46b9STakashi Sakamoto write_pcm_silence(s, buffer, data_blocks); 675*d67c46b9STakashi Sakamoto pcm_frames = 0; 676*d67c46b9STakashi Sakamoto } 677*d67c46b9STakashi Sakamoto 678*d67c46b9STakashi Sakamoto if (s->midi_ports) 679*d67c46b9STakashi Sakamoto write_midi_messages(s, buffer, data_blocks); 680*d67c46b9STakashi Sakamoto 681*d67c46b9STakashi Sakamoto return pcm_frames; 682*d67c46b9STakashi Sakamoto } 683*d67c46b9STakashi Sakamoto 684*d67c46b9STakashi Sakamoto static int handle_out_packet(struct amdtp_stream *s, unsigned int data_blocks, 685*d67c46b9STakashi Sakamoto unsigned int syt) 686*d67c46b9STakashi Sakamoto { 687*d67c46b9STakashi Sakamoto __be32 *buffer; 688*d67c46b9STakashi Sakamoto unsigned int payload_length; 689*d67c46b9STakashi Sakamoto unsigned int pcm_frames; 690*d67c46b9STakashi Sakamoto struct snd_pcm_substream *pcm; 691*d67c46b9STakashi Sakamoto 692*d67c46b9STakashi Sakamoto buffer = s->buffer.packets[s->packet_index].buffer; 693*d67c46b9STakashi Sakamoto pcm_frames = process_rx_data_blocks(s, buffer + 2, data_blocks, &syt); 694*d67c46b9STakashi Sakamoto 695*d67c46b9STakashi Sakamoto buffer[0] = cpu_to_be32(ACCESS_ONCE(s->source_node_id_field) | 696*d67c46b9STakashi Sakamoto (s->data_block_quadlets << CIP_DBS_SHIFT) | 697*d67c46b9STakashi Sakamoto s->data_block_counter); 698*d67c46b9STakashi Sakamoto buffer[1] = cpu_to_be32(CIP_EOH | 699*d67c46b9STakashi Sakamoto ((s->fmt << CIP_FMT_SHIFT) & CIP_FMT_MASK) | 700*d67c46b9STakashi Sakamoto ((s->fdf << CIP_FDF_SHIFT) & CIP_FDF_MASK) | 701*d67c46b9STakashi Sakamoto (syt & CIP_SYT_MASK)); 702*d67c46b9STakashi Sakamoto 703*d67c46b9STakashi Sakamoto s->data_block_counter = (s->data_block_counter + data_blocks) & 0xff; 704*d67c46b9STakashi Sakamoto 705*d67c46b9STakashi Sakamoto payload_length = 8 + data_blocks * 4 * s->data_block_quadlets; 706*d67c46b9STakashi Sakamoto if (queue_out_packet(s, payload_length, false) < 0) 707*d67c46b9STakashi Sakamoto return -EIO; 708*d67c46b9STakashi Sakamoto 709*d67c46b9STakashi Sakamoto pcm = ACCESS_ONCE(s->pcm); 710*d67c46b9STakashi Sakamoto if (pcm && pcm_frames > 0) 711*d67c46b9STakashi Sakamoto update_pcm_pointers(s, pcm, pcm_frames); 712*d67c46b9STakashi Sakamoto 713*d67c46b9STakashi Sakamoto /* No need to return the number of handled data blocks. */ 714*d67c46b9STakashi Sakamoto return 0; 715*d67c46b9STakashi Sakamoto } 716*d67c46b9STakashi Sakamoto 717*d67c46b9STakashi Sakamoto unsigned int process_tx_data_blocks(struct amdtp_stream *s, __be32 *buffer, 718*d67c46b9STakashi Sakamoto unsigned int data_blocks, unsigned int *syt) 719*d67c46b9STakashi Sakamoto { 720*d67c46b9STakashi Sakamoto struct snd_pcm_substream *pcm = ACCESS_ONCE(s->pcm); 721*d67c46b9STakashi Sakamoto unsigned int pcm_frames; 722*d67c46b9STakashi Sakamoto 723*d67c46b9STakashi Sakamoto if (pcm) { 724*d67c46b9STakashi Sakamoto s->transfer_samples(s, pcm, buffer, data_blocks); 725*d67c46b9STakashi Sakamoto pcm_frames = data_blocks * s->frame_multiplier; 726*d67c46b9STakashi Sakamoto } else { 727*d67c46b9STakashi Sakamoto pcm_frames = 0; 728*d67c46b9STakashi Sakamoto } 729*d67c46b9STakashi Sakamoto 730*d67c46b9STakashi Sakamoto if (s->midi_ports) 731*d67c46b9STakashi Sakamoto read_midi_messages(s, buffer, data_blocks); 732*d67c46b9STakashi Sakamoto 733*d67c46b9STakashi Sakamoto return pcm_frames; 734*d67c46b9STakashi Sakamoto } 735*d67c46b9STakashi Sakamoto 736*d67c46b9STakashi Sakamoto static int handle_in_packet(struct amdtp_stream *s, 737*d67c46b9STakashi Sakamoto unsigned int payload_quadlets, __be32 *buffer, 738*d67c46b9STakashi Sakamoto unsigned int *data_blocks, unsigned int syt) 739*d67c46b9STakashi Sakamoto { 740*d67c46b9STakashi Sakamoto u32 cip_header[2]; 741*d67c46b9STakashi Sakamoto unsigned int fmt, fdf; 742*d67c46b9STakashi Sakamoto unsigned int data_block_quadlets, data_block_counter, dbc_interval; 743*d67c46b9STakashi Sakamoto struct snd_pcm_substream *pcm; 744*d67c46b9STakashi Sakamoto unsigned int pcm_frames; 745*d67c46b9STakashi Sakamoto bool lost; 746*d67c46b9STakashi Sakamoto 747*d67c46b9STakashi Sakamoto cip_header[0] = be32_to_cpu(buffer[0]); 748*d67c46b9STakashi Sakamoto cip_header[1] = be32_to_cpu(buffer[1]); 749*d67c46b9STakashi Sakamoto 750*d67c46b9STakashi Sakamoto /* 751*d67c46b9STakashi Sakamoto * This module supports 'Two-quadlet CIP header with SYT field'. 752*d67c46b9STakashi Sakamoto * For convenience, also check FMT field is AM824 or not. 753*d67c46b9STakashi Sakamoto */ 754*d67c46b9STakashi Sakamoto if (((cip_header[0] & CIP_EOH_MASK) == CIP_EOH) || 755*d67c46b9STakashi Sakamoto ((cip_header[1] & CIP_EOH_MASK) != CIP_EOH)) { 756*d67c46b9STakashi Sakamoto dev_info_ratelimited(&s->unit->device, 757*d67c46b9STakashi Sakamoto "Invalid CIP header for AMDTP: %08X:%08X\n", 758*d67c46b9STakashi Sakamoto cip_header[0], cip_header[1]); 759*d67c46b9STakashi Sakamoto *data_blocks = 0; 760*d67c46b9STakashi Sakamoto pcm_frames = 0; 761*d67c46b9STakashi Sakamoto goto end; 762*d67c46b9STakashi Sakamoto } 763*d67c46b9STakashi Sakamoto 764*d67c46b9STakashi Sakamoto /* Check valid protocol or not. */ 765*d67c46b9STakashi Sakamoto fmt = (cip_header[1] & CIP_FMT_MASK) >> CIP_FMT_SHIFT; 766*d67c46b9STakashi Sakamoto if (fmt != s->fmt) { 767*d67c46b9STakashi Sakamoto dev_err(&s->unit->device, 768*d67c46b9STakashi Sakamoto "Detect unexpected protocol: %08x %08x\n", 769*d67c46b9STakashi Sakamoto cip_header[0], cip_header[1]); 770*d67c46b9STakashi Sakamoto return -EIO; 771*d67c46b9STakashi Sakamoto } 772*d67c46b9STakashi Sakamoto 773*d67c46b9STakashi Sakamoto /* Calculate data blocks */ 774*d67c46b9STakashi Sakamoto fdf = (cip_header[1] & CIP_FDF_MASK) >> CIP_FDF_SHIFT; 775*d67c46b9STakashi Sakamoto if (payload_quadlets < 3 || 776*d67c46b9STakashi Sakamoto (fmt == CIP_FMT_AM && fdf == AMDTP_FDF_NO_DATA)) { 777*d67c46b9STakashi Sakamoto *data_blocks = 0; 778*d67c46b9STakashi Sakamoto } else { 779*d67c46b9STakashi Sakamoto data_block_quadlets = 780*d67c46b9STakashi Sakamoto (cip_header[0] & CIP_DBS_MASK) >> CIP_DBS_SHIFT; 781*d67c46b9STakashi Sakamoto /* avoid division by zero */ 782*d67c46b9STakashi Sakamoto if (data_block_quadlets == 0) { 783*d67c46b9STakashi Sakamoto dev_err(&s->unit->device, 784*d67c46b9STakashi Sakamoto "Detect invalid value in dbs field: %08X\n", 785*d67c46b9STakashi Sakamoto cip_header[0]); 786*d67c46b9STakashi Sakamoto return -EPROTO; 787*d67c46b9STakashi Sakamoto } 788*d67c46b9STakashi Sakamoto if (s->flags & CIP_WRONG_DBS) 789*d67c46b9STakashi Sakamoto data_block_quadlets = s->data_block_quadlets; 790*d67c46b9STakashi Sakamoto 791*d67c46b9STakashi Sakamoto *data_blocks = (payload_quadlets - 2) / data_block_quadlets; 792*d67c46b9STakashi Sakamoto } 793*d67c46b9STakashi Sakamoto 794*d67c46b9STakashi Sakamoto /* Check data block counter continuity */ 795*d67c46b9STakashi Sakamoto data_block_counter = cip_header[0] & CIP_DBC_MASK; 796*d67c46b9STakashi Sakamoto if (*data_blocks == 0 && (s->flags & CIP_EMPTY_HAS_WRONG_DBC) && 797*d67c46b9STakashi Sakamoto s->data_block_counter != UINT_MAX) 798*d67c46b9STakashi Sakamoto data_block_counter = s->data_block_counter; 799*d67c46b9STakashi Sakamoto 800*d67c46b9STakashi Sakamoto if (((s->flags & CIP_SKIP_DBC_ZERO_CHECK) && 801*d67c46b9STakashi Sakamoto data_block_counter == s->tx_first_dbc) || 802*d67c46b9STakashi Sakamoto s->data_block_counter == UINT_MAX) { 803*d67c46b9STakashi Sakamoto lost = false; 804*d67c46b9STakashi Sakamoto } else if (!(s->flags & CIP_DBC_IS_END_EVENT)) { 805*d67c46b9STakashi Sakamoto lost = data_block_counter != s->data_block_counter; 806*d67c46b9STakashi Sakamoto } else { 807*d67c46b9STakashi Sakamoto if ((*data_blocks > 0) && (s->tx_dbc_interval > 0)) 808*d67c46b9STakashi Sakamoto dbc_interval = s->tx_dbc_interval; 809*d67c46b9STakashi Sakamoto else 810*d67c46b9STakashi Sakamoto dbc_interval = *data_blocks; 811*d67c46b9STakashi Sakamoto 812*d67c46b9STakashi Sakamoto lost = data_block_counter != 813*d67c46b9STakashi Sakamoto ((s->data_block_counter + dbc_interval) & 0xff); 814*d67c46b9STakashi Sakamoto } 815*d67c46b9STakashi Sakamoto 816*d67c46b9STakashi Sakamoto if (lost) { 817*d67c46b9STakashi Sakamoto dev_err(&s->unit->device, 818*d67c46b9STakashi Sakamoto "Detect discontinuity of CIP: %02X %02X\n", 819*d67c46b9STakashi Sakamoto s->data_block_counter, data_block_counter); 820*d67c46b9STakashi Sakamoto return -EIO; 821*d67c46b9STakashi Sakamoto } 822*d67c46b9STakashi Sakamoto 823*d67c46b9STakashi Sakamoto pcm_frames = process_tx_data_blocks(s, buffer + 2, *data_blocks, &syt); 824*d67c46b9STakashi Sakamoto 825*d67c46b9STakashi Sakamoto if (s->flags & CIP_DBC_IS_END_EVENT) 826*d67c46b9STakashi Sakamoto s->data_block_counter = data_block_counter; 827*d67c46b9STakashi Sakamoto else 828*d67c46b9STakashi Sakamoto s->data_block_counter = 829*d67c46b9STakashi Sakamoto (data_block_counter + *data_blocks) & 0xff; 830*d67c46b9STakashi Sakamoto end: 831*d67c46b9STakashi Sakamoto if (queue_in_packet(s) < 0) 832*d67c46b9STakashi Sakamoto return -EIO; 833*d67c46b9STakashi Sakamoto 834*d67c46b9STakashi Sakamoto pcm = ACCESS_ONCE(s->pcm); 835*d67c46b9STakashi Sakamoto if (pcm && pcm_frames > 0) 836*d67c46b9STakashi Sakamoto update_pcm_pointers(s, pcm, pcm_frames); 837*d67c46b9STakashi Sakamoto 838*d67c46b9STakashi Sakamoto return 0; 839*d67c46b9STakashi Sakamoto } 840*d67c46b9STakashi Sakamoto 841*d67c46b9STakashi Sakamoto static void out_stream_callback(struct fw_iso_context *context, u32 cycle, 842*d67c46b9STakashi Sakamoto size_t header_length, void *header, 843*d67c46b9STakashi Sakamoto void *private_data) 844*d67c46b9STakashi Sakamoto { 845*d67c46b9STakashi Sakamoto struct amdtp_stream *s = private_data; 846*d67c46b9STakashi Sakamoto unsigned int i, syt, packets = header_length / 4; 847*d67c46b9STakashi Sakamoto unsigned int data_blocks; 848*d67c46b9STakashi Sakamoto 849*d67c46b9STakashi Sakamoto if (s->packet_index < 0) 850*d67c46b9STakashi Sakamoto return; 851*d67c46b9STakashi Sakamoto 852*d67c46b9STakashi Sakamoto /* 853*d67c46b9STakashi Sakamoto * Compute the cycle of the last queued packet. 854*d67c46b9STakashi Sakamoto * (We need only the four lowest bits for the SYT, so we can ignore 855*d67c46b9STakashi Sakamoto * that bits 0-11 must wrap around at 3072.) 856*d67c46b9STakashi Sakamoto */ 857*d67c46b9STakashi Sakamoto cycle += QUEUE_LENGTH - packets; 858*d67c46b9STakashi Sakamoto 859*d67c46b9STakashi Sakamoto for (i = 0; i < packets; ++i) { 860*d67c46b9STakashi Sakamoto syt = calculate_syt(s, ++cycle); 861*d67c46b9STakashi Sakamoto data_blocks = calculate_data_blocks(s, syt); 862*d67c46b9STakashi Sakamoto 863*d67c46b9STakashi Sakamoto if (handle_out_packet(s, data_blocks, syt) < 0) { 864*d67c46b9STakashi Sakamoto s->packet_index = -1; 865*d67c46b9STakashi Sakamoto amdtp_stream_pcm_abort(s); 866*d67c46b9STakashi Sakamoto return; 867*d67c46b9STakashi Sakamoto } 868*d67c46b9STakashi Sakamoto } 869*d67c46b9STakashi Sakamoto 870*d67c46b9STakashi Sakamoto fw_iso_context_queue_flush(s->context); 871*d67c46b9STakashi Sakamoto } 872*d67c46b9STakashi Sakamoto 873*d67c46b9STakashi Sakamoto static void in_stream_callback(struct fw_iso_context *context, u32 cycle, 874*d67c46b9STakashi Sakamoto size_t header_length, void *header, 875*d67c46b9STakashi Sakamoto void *private_data) 876*d67c46b9STakashi Sakamoto { 877*d67c46b9STakashi Sakamoto struct amdtp_stream *s = private_data; 878*d67c46b9STakashi Sakamoto unsigned int p, syt, packets; 879*d67c46b9STakashi Sakamoto unsigned int payload_quadlets, max_payload_quadlets; 880*d67c46b9STakashi Sakamoto unsigned int data_blocks; 881*d67c46b9STakashi Sakamoto __be32 *buffer, *headers = header; 882*d67c46b9STakashi Sakamoto 883*d67c46b9STakashi Sakamoto if (s->packet_index < 0) 884*d67c46b9STakashi Sakamoto return; 885*d67c46b9STakashi Sakamoto 886*d67c46b9STakashi Sakamoto /* The number of packets in buffer */ 887*d67c46b9STakashi Sakamoto packets = header_length / IN_PACKET_HEADER_SIZE; 888*d67c46b9STakashi Sakamoto 889*d67c46b9STakashi Sakamoto /* For buffer-over-run prevention. */ 890*d67c46b9STakashi Sakamoto max_payload_quadlets = amdtp_stream_get_max_payload(s) / 4; 891*d67c46b9STakashi Sakamoto 892*d67c46b9STakashi Sakamoto for (p = 0; p < packets; p++) { 893*d67c46b9STakashi Sakamoto buffer = s->buffer.packets[s->packet_index].buffer; 894*d67c46b9STakashi Sakamoto 895*d67c46b9STakashi Sakamoto /* The number of quadlets in this packet */ 896*d67c46b9STakashi Sakamoto payload_quadlets = 897*d67c46b9STakashi Sakamoto (be32_to_cpu(headers[p]) >> ISO_DATA_LENGTH_SHIFT) / 4; 898*d67c46b9STakashi Sakamoto if (payload_quadlets > max_payload_quadlets) { 899*d67c46b9STakashi Sakamoto dev_err(&s->unit->device, 900*d67c46b9STakashi Sakamoto "Detect jumbo payload: %02x %02x\n", 901*d67c46b9STakashi Sakamoto payload_quadlets, max_payload_quadlets); 902*d67c46b9STakashi Sakamoto s->packet_index = -1; 903*d67c46b9STakashi Sakamoto break; 904*d67c46b9STakashi Sakamoto } 905*d67c46b9STakashi Sakamoto 906*d67c46b9STakashi Sakamoto syt = be32_to_cpu(buffer[1]) & CIP_SYT_MASK; 907*d67c46b9STakashi Sakamoto if (handle_in_packet(s, payload_quadlets, buffer, 908*d67c46b9STakashi Sakamoto &data_blocks, syt) < 0) { 909*d67c46b9STakashi Sakamoto s->packet_index = -1; 910*d67c46b9STakashi Sakamoto break; 911*d67c46b9STakashi Sakamoto } 912*d67c46b9STakashi Sakamoto 913*d67c46b9STakashi Sakamoto /* Process sync slave stream */ 914*d67c46b9STakashi Sakamoto if (s->sync_slave && s->sync_slave->callbacked) { 915*d67c46b9STakashi Sakamoto if (handle_out_packet(s->sync_slave, 916*d67c46b9STakashi Sakamoto data_blocks, syt) < 0) { 917*d67c46b9STakashi Sakamoto s->packet_index = -1; 918*d67c46b9STakashi Sakamoto break; 919*d67c46b9STakashi Sakamoto } 920*d67c46b9STakashi Sakamoto } 921*d67c46b9STakashi Sakamoto } 922*d67c46b9STakashi Sakamoto 923*d67c46b9STakashi Sakamoto /* Queueing error or detecting discontinuity */ 924*d67c46b9STakashi Sakamoto if (s->packet_index < 0) { 925*d67c46b9STakashi Sakamoto amdtp_stream_pcm_abort(s); 926*d67c46b9STakashi Sakamoto 927*d67c46b9STakashi Sakamoto /* Abort sync slave. */ 928*d67c46b9STakashi Sakamoto if (s->sync_slave) { 929*d67c46b9STakashi Sakamoto s->sync_slave->packet_index = -1; 930*d67c46b9STakashi Sakamoto amdtp_stream_pcm_abort(s->sync_slave); 931*d67c46b9STakashi Sakamoto } 932*d67c46b9STakashi Sakamoto return; 933*d67c46b9STakashi Sakamoto } 934*d67c46b9STakashi Sakamoto 935*d67c46b9STakashi Sakamoto /* when sync to device, flush the packets for slave stream */ 936*d67c46b9STakashi Sakamoto if (s->sync_slave && s->sync_slave->callbacked) 937*d67c46b9STakashi Sakamoto fw_iso_context_queue_flush(s->sync_slave->context); 938*d67c46b9STakashi Sakamoto 939*d67c46b9STakashi Sakamoto fw_iso_context_queue_flush(s->context); 940*d67c46b9STakashi Sakamoto } 941*d67c46b9STakashi Sakamoto 942*d67c46b9STakashi Sakamoto /* processing is done by master callback */ 943*d67c46b9STakashi Sakamoto static void slave_stream_callback(struct fw_iso_context *context, u32 cycle, 944*d67c46b9STakashi Sakamoto size_t header_length, void *header, 945*d67c46b9STakashi Sakamoto void *private_data) 946*d67c46b9STakashi Sakamoto { 947*d67c46b9STakashi Sakamoto return; 948*d67c46b9STakashi Sakamoto } 949*d67c46b9STakashi Sakamoto 950*d67c46b9STakashi Sakamoto /* this is executed one time */ 951*d67c46b9STakashi Sakamoto static void amdtp_stream_first_callback(struct fw_iso_context *context, 952*d67c46b9STakashi Sakamoto u32 cycle, size_t header_length, 953*d67c46b9STakashi Sakamoto void *header, void *private_data) 954*d67c46b9STakashi Sakamoto { 955*d67c46b9STakashi Sakamoto struct amdtp_stream *s = private_data; 956*d67c46b9STakashi Sakamoto 957*d67c46b9STakashi Sakamoto /* 958*d67c46b9STakashi Sakamoto * For in-stream, first packet has come. 959*d67c46b9STakashi Sakamoto * For out-stream, prepared to transmit first packet 960*d67c46b9STakashi Sakamoto */ 961*d67c46b9STakashi Sakamoto s->callbacked = true; 962*d67c46b9STakashi Sakamoto wake_up(&s->callback_wait); 963*d67c46b9STakashi Sakamoto 964*d67c46b9STakashi Sakamoto if (s->direction == AMDTP_IN_STREAM) 965*d67c46b9STakashi Sakamoto context->callback.sc = in_stream_callback; 966*d67c46b9STakashi Sakamoto else if (s->flags & CIP_SYNC_TO_DEVICE) 967*d67c46b9STakashi Sakamoto context->callback.sc = slave_stream_callback; 968*d67c46b9STakashi Sakamoto else 969*d67c46b9STakashi Sakamoto context->callback.sc = out_stream_callback; 970*d67c46b9STakashi Sakamoto 971*d67c46b9STakashi Sakamoto context->callback.sc(context, cycle, header_length, header, s); 972*d67c46b9STakashi Sakamoto } 973*d67c46b9STakashi Sakamoto 974*d67c46b9STakashi Sakamoto /** 975*d67c46b9STakashi Sakamoto * amdtp_stream_start - start transferring packets 976*d67c46b9STakashi Sakamoto * @s: the AMDTP stream to start 977*d67c46b9STakashi Sakamoto * @channel: the isochronous channel on the bus 978*d67c46b9STakashi Sakamoto * @speed: firewire speed code 979*d67c46b9STakashi Sakamoto * 980*d67c46b9STakashi Sakamoto * The stream cannot be started until it has been configured with 981*d67c46b9STakashi Sakamoto * amdtp_stream_set_parameters() and it must be started before any PCM or MIDI 982*d67c46b9STakashi Sakamoto * device can be started. 983*d67c46b9STakashi Sakamoto */ 984*d67c46b9STakashi Sakamoto int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed) 985*d67c46b9STakashi Sakamoto { 986*d67c46b9STakashi Sakamoto static const struct { 987*d67c46b9STakashi Sakamoto unsigned int data_block; 988*d67c46b9STakashi Sakamoto unsigned int syt_offset; 989*d67c46b9STakashi Sakamoto } initial_state[] = { 990*d67c46b9STakashi Sakamoto [CIP_SFC_32000] = { 4, 3072 }, 991*d67c46b9STakashi Sakamoto [CIP_SFC_48000] = { 6, 1024 }, 992*d67c46b9STakashi Sakamoto [CIP_SFC_96000] = { 12, 1024 }, 993*d67c46b9STakashi Sakamoto [CIP_SFC_192000] = { 24, 1024 }, 994*d67c46b9STakashi Sakamoto [CIP_SFC_44100] = { 0, 67 }, 995*d67c46b9STakashi Sakamoto [CIP_SFC_88200] = { 0, 67 }, 996*d67c46b9STakashi Sakamoto [CIP_SFC_176400] = { 0, 67 }, 997*d67c46b9STakashi Sakamoto }; 998*d67c46b9STakashi Sakamoto unsigned int header_size; 999*d67c46b9STakashi Sakamoto enum dma_data_direction dir; 1000*d67c46b9STakashi Sakamoto int type, tag, err; 1001*d67c46b9STakashi Sakamoto 1002*d67c46b9STakashi Sakamoto mutex_lock(&s->mutex); 1003*d67c46b9STakashi Sakamoto 1004*d67c46b9STakashi Sakamoto if (WARN_ON(amdtp_stream_running(s) || 1005*d67c46b9STakashi Sakamoto (s->data_block_quadlets < 1))) { 1006*d67c46b9STakashi Sakamoto err = -EBADFD; 1007*d67c46b9STakashi Sakamoto goto err_unlock; 1008*d67c46b9STakashi Sakamoto } 1009*d67c46b9STakashi Sakamoto 1010*d67c46b9STakashi Sakamoto if (s->direction == AMDTP_IN_STREAM && 1011*d67c46b9STakashi Sakamoto s->flags & CIP_SKIP_INIT_DBC_CHECK) 1012*d67c46b9STakashi Sakamoto s->data_block_counter = UINT_MAX; 1013*d67c46b9STakashi Sakamoto else 1014*d67c46b9STakashi Sakamoto s->data_block_counter = 0; 1015*d67c46b9STakashi Sakamoto s->data_block_state = initial_state[s->sfc].data_block; 1016*d67c46b9STakashi Sakamoto s->syt_offset_state = initial_state[s->sfc].syt_offset; 1017*d67c46b9STakashi Sakamoto s->last_syt_offset = TICKS_PER_CYCLE; 1018*d67c46b9STakashi Sakamoto 1019*d67c46b9STakashi Sakamoto /* initialize packet buffer */ 1020*d67c46b9STakashi Sakamoto if (s->direction == AMDTP_IN_STREAM) { 1021*d67c46b9STakashi Sakamoto dir = DMA_FROM_DEVICE; 1022*d67c46b9STakashi Sakamoto type = FW_ISO_CONTEXT_RECEIVE; 1023*d67c46b9STakashi Sakamoto header_size = IN_PACKET_HEADER_SIZE; 1024*d67c46b9STakashi Sakamoto } else { 1025*d67c46b9STakashi Sakamoto dir = DMA_TO_DEVICE; 1026*d67c46b9STakashi Sakamoto type = FW_ISO_CONTEXT_TRANSMIT; 1027*d67c46b9STakashi Sakamoto header_size = OUT_PACKET_HEADER_SIZE; 1028*d67c46b9STakashi Sakamoto } 1029*d67c46b9STakashi Sakamoto err = iso_packets_buffer_init(&s->buffer, s->unit, QUEUE_LENGTH, 1030*d67c46b9STakashi Sakamoto amdtp_stream_get_max_payload(s), dir); 1031*d67c46b9STakashi Sakamoto if (err < 0) 1032*d67c46b9STakashi Sakamoto goto err_unlock; 1033*d67c46b9STakashi Sakamoto 1034*d67c46b9STakashi Sakamoto s->context = fw_iso_context_create(fw_parent_device(s->unit)->card, 1035*d67c46b9STakashi Sakamoto type, channel, speed, header_size, 1036*d67c46b9STakashi Sakamoto amdtp_stream_first_callback, s); 1037*d67c46b9STakashi Sakamoto if (IS_ERR(s->context)) { 1038*d67c46b9STakashi Sakamoto err = PTR_ERR(s->context); 1039*d67c46b9STakashi Sakamoto if (err == -EBUSY) 1040*d67c46b9STakashi Sakamoto dev_err(&s->unit->device, 1041*d67c46b9STakashi Sakamoto "no free stream on this controller\n"); 1042*d67c46b9STakashi Sakamoto goto err_buffer; 1043*d67c46b9STakashi Sakamoto } 1044*d67c46b9STakashi Sakamoto 1045*d67c46b9STakashi Sakamoto amdtp_stream_update(s); 1046*d67c46b9STakashi Sakamoto 1047*d67c46b9STakashi Sakamoto s->packet_index = 0; 1048*d67c46b9STakashi Sakamoto do { 1049*d67c46b9STakashi Sakamoto if (s->direction == AMDTP_IN_STREAM) 1050*d67c46b9STakashi Sakamoto err = queue_in_packet(s); 1051*d67c46b9STakashi Sakamoto else 1052*d67c46b9STakashi Sakamoto err = queue_out_packet(s, 0, true); 1053*d67c46b9STakashi Sakamoto if (err < 0) 1054*d67c46b9STakashi Sakamoto goto err_context; 1055*d67c46b9STakashi Sakamoto } while (s->packet_index > 0); 1056*d67c46b9STakashi Sakamoto 1057*d67c46b9STakashi Sakamoto /* NOTE: TAG1 matches CIP. This just affects in stream. */ 1058*d67c46b9STakashi Sakamoto tag = FW_ISO_CONTEXT_MATCH_TAG1; 1059*d67c46b9STakashi Sakamoto if (s->flags & CIP_EMPTY_WITH_TAG0) 1060*d67c46b9STakashi Sakamoto tag |= FW_ISO_CONTEXT_MATCH_TAG0; 1061*d67c46b9STakashi Sakamoto 1062*d67c46b9STakashi Sakamoto s->callbacked = false; 1063*d67c46b9STakashi Sakamoto err = fw_iso_context_start(s->context, -1, 0, tag); 1064*d67c46b9STakashi Sakamoto if (err < 0) 1065*d67c46b9STakashi Sakamoto goto err_context; 1066*d67c46b9STakashi Sakamoto 1067*d67c46b9STakashi Sakamoto mutex_unlock(&s->mutex); 1068*d67c46b9STakashi Sakamoto 1069*d67c46b9STakashi Sakamoto return 0; 1070*d67c46b9STakashi Sakamoto 1071*d67c46b9STakashi Sakamoto err_context: 1072*d67c46b9STakashi Sakamoto fw_iso_context_destroy(s->context); 1073*d67c46b9STakashi Sakamoto s->context = ERR_PTR(-1); 1074*d67c46b9STakashi Sakamoto err_buffer: 1075*d67c46b9STakashi Sakamoto iso_packets_buffer_destroy(&s->buffer, s->unit); 1076*d67c46b9STakashi Sakamoto err_unlock: 1077*d67c46b9STakashi Sakamoto mutex_unlock(&s->mutex); 1078*d67c46b9STakashi Sakamoto 1079*d67c46b9STakashi Sakamoto return err; 1080*d67c46b9STakashi Sakamoto } 1081*d67c46b9STakashi Sakamoto EXPORT_SYMBOL(amdtp_stream_start); 1082*d67c46b9STakashi Sakamoto 1083*d67c46b9STakashi Sakamoto /** 1084*d67c46b9STakashi Sakamoto * amdtp_stream_pcm_pointer - get the PCM buffer position 1085*d67c46b9STakashi Sakamoto * @s: the AMDTP stream that transports the PCM data 1086*d67c46b9STakashi Sakamoto * 1087*d67c46b9STakashi Sakamoto * Returns the current buffer position, in frames. 1088*d67c46b9STakashi Sakamoto */ 1089*d67c46b9STakashi Sakamoto unsigned long amdtp_stream_pcm_pointer(struct amdtp_stream *s) 1090*d67c46b9STakashi Sakamoto { 1091*d67c46b9STakashi Sakamoto /* this optimization is allowed to be racy */ 1092*d67c46b9STakashi Sakamoto if (s->pointer_flush && amdtp_stream_running(s)) 1093*d67c46b9STakashi Sakamoto fw_iso_context_flush_completions(s->context); 1094*d67c46b9STakashi Sakamoto else 1095*d67c46b9STakashi Sakamoto s->pointer_flush = true; 1096*d67c46b9STakashi Sakamoto 1097*d67c46b9STakashi Sakamoto return ACCESS_ONCE(s->pcm_buffer_pointer); 1098*d67c46b9STakashi Sakamoto } 1099*d67c46b9STakashi Sakamoto EXPORT_SYMBOL(amdtp_stream_pcm_pointer); 1100*d67c46b9STakashi Sakamoto 1101*d67c46b9STakashi Sakamoto /** 1102*d67c46b9STakashi Sakamoto * amdtp_stream_update - update the stream after a bus reset 1103*d67c46b9STakashi Sakamoto * @s: the AMDTP stream 1104*d67c46b9STakashi Sakamoto */ 1105*d67c46b9STakashi Sakamoto void amdtp_stream_update(struct amdtp_stream *s) 1106*d67c46b9STakashi Sakamoto { 1107*d67c46b9STakashi Sakamoto /* Precomputing. */ 1108*d67c46b9STakashi Sakamoto ACCESS_ONCE(s->source_node_id_field) = 1109*d67c46b9STakashi Sakamoto (fw_parent_device(s->unit)->card->node_id << CIP_SID_SHIFT) & 1110*d67c46b9STakashi Sakamoto CIP_SID_MASK; 1111*d67c46b9STakashi Sakamoto } 1112*d67c46b9STakashi Sakamoto EXPORT_SYMBOL(amdtp_stream_update); 1113*d67c46b9STakashi Sakamoto 1114*d67c46b9STakashi Sakamoto /** 1115*d67c46b9STakashi Sakamoto * amdtp_stream_stop - stop sending packets 1116*d67c46b9STakashi Sakamoto * @s: the AMDTP stream to stop 1117*d67c46b9STakashi Sakamoto * 1118*d67c46b9STakashi Sakamoto * All PCM and MIDI devices of the stream must be stopped before the stream 1119*d67c46b9STakashi Sakamoto * itself can be stopped. 1120*d67c46b9STakashi Sakamoto */ 1121*d67c46b9STakashi Sakamoto void amdtp_stream_stop(struct amdtp_stream *s) 1122*d67c46b9STakashi Sakamoto { 1123*d67c46b9STakashi Sakamoto mutex_lock(&s->mutex); 1124*d67c46b9STakashi Sakamoto 1125*d67c46b9STakashi Sakamoto if (!amdtp_stream_running(s)) { 1126*d67c46b9STakashi Sakamoto mutex_unlock(&s->mutex); 1127*d67c46b9STakashi Sakamoto return; 1128*d67c46b9STakashi Sakamoto } 1129*d67c46b9STakashi Sakamoto 1130*d67c46b9STakashi Sakamoto tasklet_kill(&s->period_tasklet); 1131*d67c46b9STakashi Sakamoto fw_iso_context_stop(s->context); 1132*d67c46b9STakashi Sakamoto fw_iso_context_destroy(s->context); 1133*d67c46b9STakashi Sakamoto s->context = ERR_PTR(-1); 1134*d67c46b9STakashi Sakamoto iso_packets_buffer_destroy(&s->buffer, s->unit); 1135*d67c46b9STakashi Sakamoto 1136*d67c46b9STakashi Sakamoto s->callbacked = false; 1137*d67c46b9STakashi Sakamoto 1138*d67c46b9STakashi Sakamoto mutex_unlock(&s->mutex); 1139*d67c46b9STakashi Sakamoto } 1140*d67c46b9STakashi Sakamoto EXPORT_SYMBOL(amdtp_stream_stop); 1141*d67c46b9STakashi Sakamoto 1142*d67c46b9STakashi Sakamoto /** 1143*d67c46b9STakashi Sakamoto * amdtp_stream_pcm_abort - abort the running PCM device 1144*d67c46b9STakashi Sakamoto * @s: the AMDTP stream about to be stopped 1145*d67c46b9STakashi Sakamoto * 1146*d67c46b9STakashi Sakamoto * If the isochronous stream needs to be stopped asynchronously, call this 1147*d67c46b9STakashi Sakamoto * function first to stop the PCM device. 1148*d67c46b9STakashi Sakamoto */ 1149*d67c46b9STakashi Sakamoto void amdtp_stream_pcm_abort(struct amdtp_stream *s) 1150*d67c46b9STakashi Sakamoto { 1151*d67c46b9STakashi Sakamoto struct snd_pcm_substream *pcm; 1152*d67c46b9STakashi Sakamoto 1153*d67c46b9STakashi Sakamoto pcm = ACCESS_ONCE(s->pcm); 1154*d67c46b9STakashi Sakamoto if (pcm) 1155*d67c46b9STakashi Sakamoto snd_pcm_stop_xrun(pcm); 1156*d67c46b9STakashi Sakamoto } 1157*d67c46b9STakashi Sakamoto EXPORT_SYMBOL(amdtp_stream_pcm_abort); 1158