amdtp.c 31.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
 * Audio and Music Data Transmission Protocol (IEC 61883-6) streams
 * with Common Isochronous Packet (IEC 61883-1) headers
 *
 * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
 * Licensed under the terms of the GNU General Public License, version 2.
 */

#include <linux/device.h>
#include <linux/err.h>
#include <linux/firewire.h>
#include <linux/module.h>
#include <linux/slab.h>
14
#include <linux/sched.h>
15
#include <sound/pcm.h>
16
#include <sound/pcm_params.h>
17
#include <sound/rawmidi.h>
18 19 20 21 22 23
#include "amdtp.h"

#define TICKS_PER_CYCLE		3072
#define CYCLES_PER_SECOND	8000
#define TICKS_PER_SECOND	(TICKS_PER_CYCLE * CYCLES_PER_SECOND)

24 25 26 27 28 29
/*
 * Nominally 3125 bytes/second, but the MIDI port's clock might be
 * 1% too slow, and the bus clock 100 ppm too fast.
 */
#define MIDI_BYTES_PER_SECOND	3093

30 31 32 33 34 35
/*
 * Several devices look only at the first eight data blocks.
 * In any case, this is more than enough for the MIDI data rate.
 */
#define MAX_MIDI_RX_BLOCKS	8

36
#define TRANSFER_DELAY_TICKS	0x2e00 /* 479.17 microseconds */
37

38 39
/* isochronous header parameters */
#define ISO_DATA_LENGTH_SHIFT	16
40 41
#define TAG_CIP			1

42
/* common isochronous packet header parameters */
43 44
#define CIP_EOH_SHIFT		31
#define CIP_EOH			(1u << CIP_EOH_SHIFT)
45
#define CIP_EOH_MASK		0x80000000
46 47 48 49 50 51
#define CIP_SID_SHIFT		24
#define CIP_SID_MASK		0x3f000000
#define CIP_DBS_MASK		0x00ff0000
#define CIP_DBS_SHIFT		16
#define CIP_DBC_MASK		0x000000ff
#define CIP_FMT_SHIFT		24
52
#define CIP_FMT_MASK		0x3f000000
53 54
#define CIP_FDF_MASK		0x00ff0000
#define CIP_FDF_SHIFT		16
55 56 57 58 59 60 61
#define CIP_SYT_MASK		0x0000ffff
#define CIP_SYT_NO_INFO		0xffff

/*
 * Audio and Music transfer protocol specific parameters
 * only "Clock-based rate control mode" is supported
 */
62 63
#define CIP_FMT_AM		0x10
#define AMDTP_FDF_AM824		0x00
64
#define AMDTP_FDF_NO_DATA	0xff
65 66 67 68 69

/* TODO: make these configurable */
#define INTERRUPT_INTERVAL	16
#define QUEUE_LENGTH		48

70
#define IN_PACKET_HEADER_SIZE	4
71 72
#define OUT_PACKET_HEADER_SIZE	0

73 74
static void pcm_period_tasklet(unsigned long data);

75
/**
76 77
 * amdtp_stream_init - initialize an AMDTP stream structure
 * @s: the AMDTP stream to initialize
78
 * @unit: the target of the stream
79
 * @dir: the direction of stream
80 81
 * @flags: the packet transmission method to use
 */
82
int amdtp_stream_init(struct amdtp_stream *s, struct fw_unit *unit,
83
		      enum amdtp_stream_direction dir, enum cip_flags flags)
84
{
85
	s->unit = unit;
86
	s->direction = dir;
87 88 89
	s->flags = flags;
	s->context = ERR_PTR(-1);
	mutex_init(&s->mutex);
90
	tasklet_init(&s->period_tasklet, pcm_period_tasklet, (unsigned long)s);
91
	s->packet_index = 0;
92

93 94 95 96
	init_waitqueue_head(&s->callback_wait);
	s->callbacked = false;
	s->sync_slave = NULL;

97 98
	s->fmt = CIP_FMT_AM;

99 100
	return 0;
}
101
EXPORT_SYMBOL(amdtp_stream_init);
102 103

/**
104 105
 * amdtp_stream_destroy - free stream resources
 * @s: the AMDTP stream to destroy
106
 */
107
void amdtp_stream_destroy(struct amdtp_stream *s)
108
{
109
	WARN_ON(amdtp_stream_running(s));
110 111
	mutex_destroy(&s->mutex);
}
112
EXPORT_SYMBOL(amdtp_stream_destroy);
113

114
const unsigned int amdtp_syt_intervals[CIP_SFC_COUNT] = {
115 116 117 118 119 120 121 122 123 124
	[CIP_SFC_32000]  =  8,
	[CIP_SFC_44100]  =  8,
	[CIP_SFC_48000]  =  8,
	[CIP_SFC_88200]  = 16,
	[CIP_SFC_96000]  = 16,
	[CIP_SFC_176400] = 32,
	[CIP_SFC_192000] = 32,
};
EXPORT_SYMBOL(amdtp_syt_intervals);

125
const unsigned int amdtp_rate_table[CIP_SFC_COUNT] = {
126 127 128 129 130 131 132 133 134 135
	[CIP_SFC_32000]  =  32000,
	[CIP_SFC_44100]  =  44100,
	[CIP_SFC_48000]  =  48000,
	[CIP_SFC_88200]  =  88200,
	[CIP_SFC_96000]  =  96000,
	[CIP_SFC_176400] = 176400,
	[CIP_SFC_192000] = 192000,
};
EXPORT_SYMBOL(amdtp_rate_table);

136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
/**
 * amdtp_stream_add_pcm_hw_constraints - add hw constraints for PCM substream
 * @s:		the AMDTP stream, which must be initialized.
 * @runtime:	the PCM substream runtime
 */
int amdtp_stream_add_pcm_hw_constraints(struct amdtp_stream *s,
					struct snd_pcm_runtime *runtime)
{
	int err;

	/* AM824 in IEC 61883-6 can deliver 24bit data */
	err = snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
	if (err < 0)
		goto end;

	/*
	 * Currently firewire-lib processes 16 packets in one software
	 * interrupt callback. This equals to 2msec but actually the
	 * interval of the interrupts has a jitter.
	 * Additionally, even if adding a constraint to fit period size to
	 * 2msec, actual calculated frames per period doesn't equal to 2msec,
	 * depending on sampling rate.
	 * Anyway, the interval to call snd_pcm_period_elapsed() cannot 2msec.
	 * Here let us use 5msec for safe period interrupt.
	 */
	err = snd_pcm_hw_constraint_minmax(runtime,
					   SNDRV_PCM_HW_PARAM_PERIOD_TIME,
					   5000, UINT_MAX);
	if (err < 0)
		goto end;

	/* Non-Blocking stream has no more constraints */
	if (!(s->flags & CIP_BLOCKING))
		goto end;

	/*
	 * One AMDTP packet can include some frames. In blocking mode, the
	 * number equals to SYT_INTERVAL. So the number is 8, 16 or 32,
	 * depending on its sampling rate. For accurate period interrupt, it's
175
	 * preferrable to align period/buffer sizes to current SYT_INTERVAL.
176
	 *
177 178
	 * TODO: These constraints can be improved with proper rules.
	 * Currently apply LCM of SYT_INTERVALs.
179 180 181 182 183 184 185 186 187 188 189 190
	 */
	err = snd_pcm_hw_constraint_step(runtime, 0,
					 SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 32);
	if (err < 0)
		goto end;
	err = snd_pcm_hw_constraint_step(runtime, 0,
					 SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 32);
end:
	return err;
}
EXPORT_SYMBOL(amdtp_stream_add_pcm_hw_constraints);

191
/**
192 193
 * amdtp_stream_set_parameters - set stream parameters
 * @s: the AMDTP stream to configure
194
 * @rate: the sample rate
195 196 197
 * @pcm_channels: the number of PCM samples in each data block, to be encoded
 *                as AM824 multi-bit linear audio
 * @midi_ports: the number of MIDI ports (i.e., MPX-MIDI Data Channels)
198
 * @double_pcm_frames: one data block transfers two PCM frames
199
 *
200
 * The parameters must be set before the stream is started, and must not be
201 202
 * changed while the stream is running.
 */
203 204 205
int amdtp_stream_set_parameters(struct amdtp_stream *s,
				unsigned int rate,
				unsigned int pcm_channels,
206 207
				unsigned int midi_ports,
				bool double_pcm_frames)
208
{
209
	unsigned int i, sfc, midi_channels;
210

211 212
	midi_channels = DIV_ROUND_UP(midi_ports, 8);

213 214
	if (WARN_ON(amdtp_stream_running(s)) |
	    WARN_ON(pcm_channels > AMDTP_MAX_CHANNELS_FOR_PCM) |
215
	    WARN_ON(midi_channels > AMDTP_MAX_CHANNELS_FOR_MIDI))
216
		return -EINVAL;
217

218
	for (sfc = 0; sfc < ARRAY_SIZE(amdtp_rate_table); ++sfc) {
219
		if (amdtp_rate_table[sfc] == rate)
220 221 222 223
			break;
	}
	if (sfc == ARRAY_SIZE(amdtp_rate_table))
		return -EINVAL;
224

225
	s->pcm_channels = pcm_channels;
226
	s->sfc = sfc;
227
	s->data_block_quadlets = s->pcm_channels + midi_channels;
228 229
	s->midi_ports = midi_ports;

230 231
	s->fdf = AMDTP_FDF_AM824 | s->sfc;

232 233 234 235 236 237 238 239 240 241
	/*
	 * In IEC 61883-6, one data block represents one event. In ALSA, one
	 * event equals to one PCM frame. But Dice has a quirk at higher
	 * sampling rate to transfer two PCM frames in one data block.
	 */
	if (double_pcm_frames)
		s->frame_multiplier = 2;
	else
		s->frame_multiplier = 1;

242
	s->syt_interval = amdtp_syt_intervals[sfc];
243 244 245 246 247 248

	/* default buffering in the device */
	s->transfer_delay = TRANSFER_DELAY_TICKS - TICKS_PER_CYCLE;
	if (s->flags & CIP_BLOCKING)
		/* additional buffering needed to adjust for no-data packets */
		s->transfer_delay += TICKS_PER_SECOND * s->syt_interval / rate;
249 250 251 252 253

	/* init the position map for PCM and MIDI channels */
	for (i = 0; i < pcm_channels; i++)
		s->pcm_positions[i] = i;
	s->midi_position = s->pcm_channels;
254 255 256 257 258 259 260 261

	/*
	 * We do not know the actual MIDI FIFO size of most devices.  Just
	 * assume two bytes, i.e., one byte can be received over the bus while
	 * the previous one is transmitted over MIDI.
	 * (The value here is adjusted for midi_ratelimit_per_packet().)
	 */
	s->midi_fifo_limit = rate - MIDI_BYTES_PER_SECOND * s->syt_interval + 1;
262 263

	return 0;
264
}
265
EXPORT_SYMBOL(amdtp_stream_set_parameters);
266 267

/**
268 269
 * amdtp_stream_get_max_payload - get the stream's packet size
 * @s: the AMDTP stream
270 271
 *
 * This function must not be called before the stream has been configured
272
 * with amdtp_stream_set_parameters().
273
 */
274
unsigned int amdtp_stream_get_max_payload(struct amdtp_stream *s)
275
{
276 277 278 279 280 281
	unsigned int multiplier = 1;

	if (s->flags & CIP_JUMBO_PAYLOAD)
		multiplier = 5;

	return 8 + s->syt_interval * s->data_block_quadlets * 4 * multiplier;
282
}
283
EXPORT_SYMBOL(amdtp_stream_get_max_payload);
284

285 286 287 288 289 290 291 292 293
static void write_pcm_s16(struct amdtp_stream *s,
			  struct snd_pcm_substream *pcm,
			  __be32 *buffer, unsigned int frames);
static void write_pcm_s32(struct amdtp_stream *s,
			  struct snd_pcm_substream *pcm,
			  __be32 *buffer, unsigned int frames);
static void read_pcm_s32(struct amdtp_stream *s,
			 struct snd_pcm_substream *pcm,
			 __be32 *buffer, unsigned int frames);
294 295

/**
296 297
 * amdtp_stream_set_pcm_format - set the PCM format
 * @s: the AMDTP stream to configure
298 299
 * @format: the format of the ALSA PCM device
 *
300
 * The sample format must be set after the other parameters (rate/PCM channels/
301 302
 * MIDI) and before the stream is started, and must not be changed while the
 * stream is running.
303
 */
304 305
void amdtp_stream_set_pcm_format(struct amdtp_stream *s,
				 snd_pcm_format_t format)
306
{
307
	if (WARN_ON(amdtp_stream_pcm_running(s)))
308 309 310 311 312 313 314
		return;

	switch (format) {
	default:
		WARN_ON(1);
		/* fall through */
	case SNDRV_PCM_FORMAT_S16:
315
		if (s->direction == AMDTP_OUT_STREAM) {
316
			s->transfer_samples = write_pcm_s16;
317 318 319 320
			break;
		}
		WARN_ON(1);
		/* fall through */
321
	case SNDRV_PCM_FORMAT_S32:
322
		if (s->direction == AMDTP_OUT_STREAM)
323
			s->transfer_samples = write_pcm_s32;
324
		else
325
			s->transfer_samples = read_pcm_s32;
326 327 328
		break;
	}
}
329
EXPORT_SYMBOL(amdtp_stream_set_pcm_format);
330

331
/**
332 333
 * amdtp_stream_pcm_prepare - prepare PCM device for running
 * @s: the AMDTP stream
334 335 336
 *
 * This function should be called from the PCM device's .prepare callback.
 */
337
void amdtp_stream_pcm_prepare(struct amdtp_stream *s)
338 339 340 341
{
	tasklet_kill(&s->period_tasklet);
	s->pcm_buffer_pointer = 0;
	s->pcm_period_pointer = 0;
342
	s->pointer_flush = true;
343
}
344
EXPORT_SYMBOL(amdtp_stream_pcm_prepare);
345

346 347
static unsigned int calculate_data_blocks(struct amdtp_stream *s,
					  unsigned int syt)
348 349 350
{
	unsigned int phase, data_blocks;

351 352 353 354 355 356 357 358
	/* Blocking mode. */
	if (s->flags & CIP_BLOCKING) {
		/* This module generate empty packet for 'no data'. */
		if (syt == CIP_SYT_NO_INFO)
			data_blocks = 0;
		else
			data_blocks = s->syt_interval;
	/* Non-blocking mode. */
359
	} else {
360 361 362 363 364
		if (!cip_sfc_is_base_44100(s->sfc)) {
			/* Sample_rate / 8000 is an integer, and precomputed. */
			data_blocks = s->data_block_state;
		} else {
			phase = s->data_block_state;
365 366 367 368 369 370 371 372 373

		/*
		 * This calculates the number of data blocks per packet so that
		 * 1) the overall rate is correct and exactly synchronized to
		 *    the bus clock, and
		 * 2) packets with a rounded-up number of blocks occur as early
		 *    as possible in the sequence (to prevent underruns of the
		 *    device's buffer).
		 */
374 375 376 377 378 379 380 381 382 383 384
			if (s->sfc == CIP_SFC_44100)
				/* 6 6 5 6 5 6 5 ... */
				data_blocks = 5 + ((phase & 1) ^
						   (phase == 0 || phase >= 40));
			else
				/* 12 11 11 11 11 ... or 23 22 22 22 22 ... */
				data_blocks = 11 * (s->sfc >> 1) + (phase == 0);
			if (++phase >= (80 >> (s->sfc >> 1)))
				phase = 0;
			s->data_block_state = phase;
		}
385 386 387 388 389
	}

	return data_blocks;
}

390
static unsigned int calculate_syt(struct amdtp_stream *s,
391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421
				  unsigned int cycle)
{
	unsigned int syt_offset, phase, index, syt;

	if (s->last_syt_offset < TICKS_PER_CYCLE) {
		if (!cip_sfc_is_base_44100(s->sfc))
			syt_offset = s->last_syt_offset + s->syt_offset_state;
		else {
		/*
		 * The time, in ticks, of the n'th SYT_INTERVAL sample is:
		 *   n * SYT_INTERVAL * 24576000 / sample_rate
		 * Modulo TICKS_PER_CYCLE, the difference between successive
		 * elements is about 1386.23.  Rounding the results of this
		 * formula to the SYT precision results in a sequence of
		 * differences that begins with:
		 *   1386 1386 1387 1386 1386 1386 1387 1386 1386 1386 1387 ...
		 * This code generates _exactly_ the same sequence.
		 */
			phase = s->syt_offset_state;
			index = phase % 13;
			syt_offset = s->last_syt_offset;
			syt_offset += 1386 + ((index && !(index & 3)) ||
					      phase == 146);
			if (++phase >= 147)
				phase = 0;
			s->syt_offset_state = phase;
		}
	} else
		syt_offset = s->last_syt_offset - TICKS_PER_CYCLE;
	s->last_syt_offset = syt_offset;

422
	if (syt_offset < TICKS_PER_CYCLE) {
423
		syt_offset += s->transfer_delay;
424 425
		syt = (cycle + syt_offset / TICKS_PER_CYCLE) << 12;
		syt += syt_offset % TICKS_PER_CYCLE;
426

427
		return syt & CIP_SYT_MASK;
428
	} else {
429
		return CIP_SYT_NO_INFO;
430
	}
431 432
}

433 434 435
static void write_pcm_s32(struct amdtp_stream *s,
			  struct snd_pcm_substream *pcm,
			  __be32 *buffer, unsigned int frames)
436 437
{
	struct snd_pcm_runtime *runtime = pcm->runtime;
438
	unsigned int channels, remaining_frames, i, c;
439 440 441 442
	const u32 *src;

	channels = s->pcm_channels;
	src = (void *)runtime->dma_area +
443
			frames_to_bytes(runtime, s->pcm_buffer_pointer);
444 445 446 447
	remaining_frames = runtime->buffer_size - s->pcm_buffer_pointer;

	for (i = 0; i < frames; ++i) {
		for (c = 0; c < channels; ++c) {
448 449
			buffer[s->pcm_positions[c]] =
					cpu_to_be32((*src >> 8) | 0x40000000);
450 451
			src++;
		}
452
		buffer += s->data_block_quadlets;
453 454 455 456 457
		if (--remaining_frames == 0)
			src = (void *)runtime->dma_area;
	}
}

458 459 460
static void write_pcm_s16(struct amdtp_stream *s,
			  struct snd_pcm_substream *pcm,
			  __be32 *buffer, unsigned int frames)
461 462
{
	struct snd_pcm_runtime *runtime = pcm->runtime;
463
	unsigned int channels, remaining_frames, i, c;
464 465 466 467
	const u16 *src;

	channels = s->pcm_channels;
	src = (void *)runtime->dma_area +
468
			frames_to_bytes(runtime, s->pcm_buffer_pointer);
469 470 471 472
	remaining_frames = runtime->buffer_size - s->pcm_buffer_pointer;

	for (i = 0; i < frames; ++i) {
		for (c = 0; c < channels; ++c) {
473
			buffer[s->pcm_positions[c]] =
474
					cpu_to_be32((*src << 8) | 0x42000000);
475 476
			src++;
		}
477
		buffer += s->data_block_quadlets;
478 479 480 481 482
		if (--remaining_frames == 0)
			src = (void *)runtime->dma_area;
	}
}

483 484 485
static void read_pcm_s32(struct amdtp_stream *s,
			 struct snd_pcm_substream *pcm,
			 __be32 *buffer, unsigned int frames)
486 487 488 489 490 491 492 493 494 495 496 497
{
	struct snd_pcm_runtime *runtime = pcm->runtime;
	unsigned int channels, remaining_frames, i, c;
	u32 *dst;

	channels = s->pcm_channels;
	dst  = (void *)runtime->dma_area +
			frames_to_bytes(runtime, s->pcm_buffer_pointer);
	remaining_frames = runtime->buffer_size - s->pcm_buffer_pointer;

	for (i = 0; i < frames; ++i) {
		for (c = 0; c < channels; ++c) {
498
			*dst = be32_to_cpu(buffer[s->pcm_positions[c]]) << 8;
499 500 501 502 503 504 505 506
			dst++;
		}
		buffer += s->data_block_quadlets;
		if (--remaining_frames == 0)
			dst = (void *)runtime->dma_area;
	}
}

507 508
static void write_pcm_silence(struct amdtp_stream *s,
			      __be32 *buffer, unsigned int frames)
509 510 511 512 513
{
	unsigned int i, c;

	for (i = 0; i < frames; ++i) {
		for (c = 0; c < s->pcm_channels; ++c)
514
			buffer[s->pcm_positions[c]] = cpu_to_be32(0x40000000);
515 516 517 518
		buffer += s->data_block_quadlets;
	}
}

519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548
/*
 * To avoid sending MIDI bytes at too high a rate, assume that the receiving
 * device has a FIFO, and track how much it is filled.  This values increases
 * by one whenever we send one byte in a packet, but the FIFO empties at
 * a constant rate independent of our packet rate.  One packet has syt_interval
 * samples, so the number of bytes that empty out of the FIFO, per packet(!),
 * is MIDI_BYTES_PER_SECOND * syt_interval / sample_rate.  To avoid storing
 * fractional values, the values in midi_fifo_used[] are measured in bytes
 * multiplied by the sample rate.
 */
static bool midi_ratelimit_per_packet(struct amdtp_stream *s, unsigned int port)
{
	int used;

	used = s->midi_fifo_used[port];
	if (used == 0) /* common shortcut */
		return true;

	used -= MIDI_BYTES_PER_SECOND * s->syt_interval;
	used = max(used, 0);
	s->midi_fifo_used[port] = used;

	return used < s->midi_fifo_limit;
}

static void midi_rate_use_one_byte(struct amdtp_stream *s, unsigned int port)
{
	s->midi_fifo_used[port] += amdtp_rate_table[s->sfc];
}

549 550
static void write_midi_messages(struct amdtp_stream *s,
				__be32 *buffer, unsigned int frames)
551
{
552 553 554 555
	unsigned int f, port;
	u8 *b;

	for (f = 0; f < frames; f++) {
556
		b = (u8 *)&buffer[s->midi_position];
557 558

		port = (s->data_block_counter + f) % 8;
559 560 561 562 563
		if (f < MAX_MIDI_RX_BLOCKS &&
		    midi_ratelimit_per_packet(s, port) &&
		    s->midi[port] != NULL &&
		    snd_rawmidi_transmit(s->midi[port], &b[1], 1) == 1) {
			midi_rate_use_one_byte(s, port);
564
			b[0] = 0x81;
565 566 567 568 569 570
		} else {
			b[0] = 0x80;
			b[1] = 0;
		}
		b[2] = 0;
		b[3] = 0;
571 572 573 574 575

		buffer += s->data_block_quadlets;
	}
}

576 577
static void read_midi_messages(struct amdtp_stream *s,
			       __be32 *buffer, unsigned int frames)
578 579 580 581 582 583 584
{
	unsigned int f, port;
	int len;
	u8 *b;

	for (f = 0; f < frames; f++) {
		port = (s->data_block_counter + f) % 8;
585
		b = (u8 *)&buffer[s->midi_position];
586

587 588 589 590 591 592
		len = b[0] - 0x80;
		if ((1 <= len) &&  (len <= 3) && (s->midi[port]))
			snd_rawmidi_receive(s->midi[port], b + 1, len);

		buffer += s->data_block_quadlets;
	}
593 594
}

595 596 597
static void update_pcm_pointers(struct amdtp_stream *s,
				struct snd_pcm_substream *pcm,
				unsigned int frames)
598 599 600
{
	unsigned int ptr;

601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627
	ptr = s->pcm_buffer_pointer + frames;
	if (ptr >= pcm->runtime->buffer_size)
		ptr -= pcm->runtime->buffer_size;
	ACCESS_ONCE(s->pcm_buffer_pointer) = ptr;

	s->pcm_period_pointer += frames;
	if (s->pcm_period_pointer >= pcm->runtime->period_size) {
		s->pcm_period_pointer -= pcm->runtime->period_size;
		s->pointer_flush = false;
		tasklet_hi_schedule(&s->period_tasklet);
	}
}

static void pcm_period_tasklet(unsigned long data)
{
	struct amdtp_stream *s = (void *)data;
	struct snd_pcm_substream *pcm = ACCESS_ONCE(s->pcm);

	if (pcm)
		snd_pcm_period_elapsed(pcm);
}

static int queue_packet(struct amdtp_stream *s,
			unsigned int header_length,
			unsigned int payload_length, bool skip)
{
	struct fw_iso_packet p = {0};
628 629 630 631
	int err = 0;

	if (IS_ERR(s->context))
		goto end;
632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657

	p.interrupt = IS_ALIGNED(s->packet_index + 1, INTERRUPT_INTERVAL);
	p.tag = TAG_CIP;
	p.header_length = header_length;
	p.payload_length = (!skip) ? payload_length : 0;
	p.skip = skip;
	err = fw_iso_context_queue(s->context, &p, &s->buffer.iso_buffer,
				   s->buffer.packets[s->packet_index].offset);
	if (err < 0) {
		dev_err(&s->unit->device, "queueing error: %d\n", err);
		goto end;
	}

	if (++s->packet_index >= QUEUE_LENGTH)
		s->packet_index = 0;
end:
	return err;
}

static inline int queue_out_packet(struct amdtp_stream *s,
				   unsigned int payload_length, bool skip)
{
	return queue_packet(s, OUT_PACKET_HEADER_SIZE,
			    payload_length, skip);
}

658 659 660 661 662 663
static inline int queue_in_packet(struct amdtp_stream *s)
{
	return queue_packet(s, IN_PACKET_HEADER_SIZE,
			    amdtp_stream_get_max_payload(s), false);
}

664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683
unsigned int process_rx_data_blocks(struct amdtp_stream *s, __be32 *buffer,
				    unsigned int data_blocks, unsigned int *syt)
{
	struct snd_pcm_substream *pcm = ACCESS_ONCE(s->pcm);
	unsigned int pcm_frames;

	if (pcm) {
		s->transfer_samples(s, pcm, buffer, data_blocks);
		pcm_frames = data_blocks * s->frame_multiplier;
	} else {
		write_pcm_silence(s, buffer, data_blocks);
		pcm_frames = 0;
	}

	if (s->midi_ports)
		write_midi_messages(s, buffer, data_blocks);

	return pcm_frames;
}

684 685
static int handle_out_packet(struct amdtp_stream *s, unsigned int data_blocks,
			     unsigned int syt)
686 687
{
	__be32 *buffer;
688
	unsigned int payload_length;
689
	unsigned int pcm_frames;
690 691
	struct snd_pcm_substream *pcm;

692
	buffer = s->buffer.packets[s->packet_index].buffer;
693 694
	pcm_frames = process_rx_data_blocks(s, buffer + 2, data_blocks, &syt);

695
	buffer[0] = cpu_to_be32(ACCESS_ONCE(s->source_node_id_field) |
696
				(s->data_block_quadlets << CIP_DBS_SHIFT) |
697
				s->data_block_counter);
698 699 700 701
	buffer[1] = cpu_to_be32(CIP_EOH |
				((s->fmt << CIP_FMT_SHIFT) & CIP_FMT_MASK) |
				((s->fdf << CIP_FDF_SHIFT) & CIP_FDF_MASK) |
				(syt & CIP_SYT_MASK));
702 703 704

	s->data_block_counter = (s->data_block_counter + data_blocks) & 0xff;

705
	payload_length = 8 + data_blocks * 4 * s->data_block_quadlets;
706 707
	if (queue_out_packet(s, payload_length, false) < 0)
		return -EIO;
708

709 710 711
	pcm = ACCESS_ONCE(s->pcm);
	if (pcm && pcm_frames > 0)
		update_pcm_pointers(s, pcm, pcm_frames);
712 713 714

	/* No need to return the number of handled data blocks. */
	return 0;
715 716
}

717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735
unsigned int process_tx_data_blocks(struct amdtp_stream *s, __be32 *buffer,
				    unsigned int data_blocks, unsigned int *syt)
{
	struct snd_pcm_substream *pcm = ACCESS_ONCE(s->pcm);
	unsigned int pcm_frames;

	if (pcm) {
		s->transfer_samples(s, pcm, buffer, data_blocks);
		pcm_frames = data_blocks * s->frame_multiplier;
	} else {
		pcm_frames = 0;
	}

	if (s->midi_ports)
		read_midi_messages(s, buffer, data_blocks);

	return pcm_frames;
}

736
static int handle_in_packet(struct amdtp_stream *s,
737
			    unsigned int payload_quadlets, __be32 *buffer,
738
			    unsigned int *data_blocks, unsigned int syt)
739 740
{
	u32 cip_header[2];
741
	unsigned int fmt, fdf;
742
	unsigned int data_block_quadlets, data_block_counter, dbc_interval;
743 744
	struct snd_pcm_substream *pcm;
	unsigned int pcm_frames;
745
	bool lost;
746 747 748 749 750 751

	cip_header[0] = be32_to_cpu(buffer[0]);
	cip_header[1] = be32_to_cpu(buffer[1]);

	/*
	 * This module supports 'Two-quadlet CIP header with SYT field'.
752
	 * For convenience, also check FMT field is AM824 or not.
753 754
	 */
	if (((cip_header[0] & CIP_EOH_MASK) == CIP_EOH) ||
755
	    ((cip_header[1] & CIP_EOH_MASK) != CIP_EOH)) {
756 757 758
		dev_info_ratelimited(&s->unit->device,
				"Invalid CIP header for AMDTP: %08X:%08X\n",
				cip_header[0], cip_header[1]);
759
		*data_blocks = 0;
760
		pcm_frames = 0;
761 762 763
		goto end;
	}

764 765 766 767 768 769 770 771 772
	/* Check valid protocol or not. */
	fmt = (cip_header[1] & CIP_FMT_MASK) >> CIP_FMT_SHIFT;
	if (fmt != s->fmt) {
		dev_err(&s->unit->device,
			"Detect unexpected protocol: %08x %08x\n",
			cip_header[0], cip_header[1]);
		return -EIO;
	}

773
	/* Calculate data blocks */
774
	fdf = (cip_header[1] & CIP_FDF_MASK) >> CIP_FDF_SHIFT;
775
	if (payload_quadlets < 3 ||
776
	    (fmt == CIP_FMT_AM && fdf == AMDTP_FDF_NO_DATA)) {
777
		*data_blocks = 0;
778 779
	} else {
		data_block_quadlets =
780
			(cip_header[0] & CIP_DBS_MASK) >> CIP_DBS_SHIFT;
781 782
		/* avoid division by zero */
		if (data_block_quadlets == 0) {
783
			dev_err(&s->unit->device,
784 785
				"Detect invalid value in dbs field: %08X\n",
				cip_header[0]);
786
			return -EPROTO;
787
		}
788 789
		if (s->flags & CIP_WRONG_DBS)
			data_block_quadlets = s->data_block_quadlets;
790

791
		*data_blocks = (payload_quadlets - 2) / data_block_quadlets;
792 793 794
	}

	/* Check data block counter continuity */
795
	data_block_counter = cip_header[0] & CIP_DBC_MASK;
796
	if (*data_blocks == 0 && (s->flags & CIP_EMPTY_HAS_WRONG_DBC) &&
797 798 799
	    s->data_block_counter != UINT_MAX)
		data_block_counter = s->data_block_counter;

800 801 802
	if (((s->flags & CIP_SKIP_DBC_ZERO_CHECK) &&
	     data_block_counter == s->tx_first_dbc) ||
	    s->data_block_counter == UINT_MAX) {
803 804
		lost = false;
	} else if (!(s->flags & CIP_DBC_IS_END_EVENT)) {
805
		lost = data_block_counter != s->data_block_counter;
806
	} else {
807
		if ((*data_blocks > 0) && (s->tx_dbc_interval > 0))
808 809
			dbc_interval = s->tx_dbc_interval;
		else
810
			dbc_interval = *data_blocks;
811

812
		lost = data_block_counter !=
813 814
		       ((s->data_block_counter + dbc_interval) & 0xff);
	}
815 816

	if (lost) {
817 818 819
		dev_err(&s->unit->device,
			"Detect discontinuity of CIP: %02X %02X\n",
			s->data_block_counter, data_block_counter);
820
		return -EIO;
821 822
	}

823
	pcm_frames = process_tx_data_blocks(s, buffer + 2, *data_blocks, &syt);
824

825 826 827 828
	if (s->flags & CIP_DBC_IS_END_EVENT)
		s->data_block_counter = data_block_counter;
	else
		s->data_block_counter =
829
				(data_block_counter + *data_blocks) & 0xff;
830 831
end:
	if (queue_in_packet(s) < 0)
832
		return -EIO;
833

834 835 836
	pcm = ACCESS_ONCE(s->pcm);
	if (pcm && pcm_frames > 0)
		update_pcm_pointers(s, pcm, pcm_frames);
837

838
	return 0;
839 840
}

841 842 843
static void out_stream_callback(struct fw_iso_context *context, u32 cycle,
				size_t header_length, void *header,
				void *private_data)
844
{
845
	struct amdtp_stream *s = private_data;
846
	unsigned int i, syt, packets = header_length / 4;
847
	unsigned int data_blocks;
848

849 850 851
	if (s->packet_index < 0)
		return;

852 853 854 855 856 857 858
	/*
	 * Compute the cycle of the last queued packet.
	 * (We need only the four lowest bits for the SYT, so we can ignore
	 * that bits 0-11 must wrap around at 3072.)
	 */
	cycle += QUEUE_LENGTH - packets;

859 860
	for (i = 0; i < packets; ++i) {
		syt = calculate_syt(s, ++cycle);
861 862
		data_blocks = calculate_data_blocks(s, syt);

863 864 865 866 867
		if (handle_out_packet(s, data_blocks, syt) < 0) {
			s->packet_index = -1;
			amdtp_stream_pcm_abort(s);
			return;
		}
868
	}
869

870
	fw_iso_context_queue_flush(s->context);
871 872
}

873 874 875 876 877
static void in_stream_callback(struct fw_iso_context *context, u32 cycle,
			       size_t header_length, void *header,
			       void *private_data)
{
	struct amdtp_stream *s = private_data;
878 879
	unsigned int p, syt, packets;
	unsigned int payload_quadlets, max_payload_quadlets;
880
	unsigned int data_blocks;
881 882
	__be32 *buffer, *headers = header;

883 884 885
	if (s->packet_index < 0)
		return;

886 887 888
	/* The number of packets in buffer */
	packets = header_length / IN_PACKET_HEADER_SIZE;

889 890 891
	/* For buffer-over-run prevention. */
	max_payload_quadlets = amdtp_stream_get_max_payload(s) / 4;

892 893 894 895 896 897
	for (p = 0; p < packets; p++) {
		buffer = s->buffer.packets[s->packet_index].buffer;

		/* The number of quadlets in this packet */
		payload_quadlets =
			(be32_to_cpu(headers[p]) >> ISO_DATA_LENGTH_SHIFT) / 4;
898 899 900 901 902 903 904 905
		if (payload_quadlets > max_payload_quadlets) {
			dev_err(&s->unit->device,
				"Detect jumbo payload: %02x %02x\n",
				payload_quadlets, max_payload_quadlets);
			s->packet_index = -1;
			break;
		}

906
		syt = be32_to_cpu(buffer[1]) & CIP_SYT_MASK;
907
		if (handle_in_packet(s, payload_quadlets, buffer,
908
						&data_blocks, syt) < 0) {
909 910 911 912 913 914
			s->packet_index = -1;
			break;
		}

		/* Process sync slave stream */
		if (s->sync_slave && s->sync_slave->callbacked) {
915 916 917 918 919
			if (handle_out_packet(s->sync_slave,
					      data_blocks, syt) < 0) {
				s->packet_index = -1;
				break;
			}
920
		}
921 922
	}

923 924
	/* Queueing error or detecting discontinuity */
	if (s->packet_index < 0) {
925 926
		amdtp_stream_pcm_abort(s);

927 928 929 930 931 932 933 934 935 936 937 938
		/* Abort sync slave. */
		if (s->sync_slave) {
			s->sync_slave->packet_index = -1;
			amdtp_stream_pcm_abort(s->sync_slave);
		}
		return;
	}

	/* when sync to device, flush the packets for slave stream */
	if (s->sync_slave && s->sync_slave->callbacked)
		fw_iso_context_queue_flush(s->sync_slave->context);

939 940 941
	fw_iso_context_queue_flush(s->context);
}

942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965
/* processing is done by master callback */
static void slave_stream_callback(struct fw_iso_context *context, u32 cycle,
				  size_t header_length, void *header,
				  void *private_data)
{
	return;
}

/* this is executed one time */
static void amdtp_stream_first_callback(struct fw_iso_context *context,
					u32 cycle, size_t header_length,
					void *header, void *private_data)
{
	struct amdtp_stream *s = private_data;

	/*
	 * For in-stream, first packet has come.
	 * For out-stream, prepared to transmit first packet
	 */
	s->callbacked = true;
	wake_up(&s->callback_wait);

	if (s->direction == AMDTP_IN_STREAM)
		context->callback.sc = in_stream_callback;
966
	else if (s->flags & CIP_SYNC_TO_DEVICE)
967 968 969 970 971 972 973
		context->callback.sc = slave_stream_callback;
	else
		context->callback.sc = out_stream_callback;

	context->callback.sc(context, cycle, header_length, header, s);
}

974
/**
975 976
 * amdtp_stream_start - start transferring packets
 * @s: the AMDTP stream to start
977 978 979 980
 * @channel: the isochronous channel on the bus
 * @speed: firewire speed code
 *
 * The stream cannot be started until it has been configured with
981 982
 * amdtp_stream_set_parameters() and it must be started before any PCM or MIDI
 * device can be started.
983
 */
984
int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
985 986 987 988 989 990 991 992 993 994 995 996 997
{
	static const struct {
		unsigned int data_block;
		unsigned int syt_offset;
	} initial_state[] = {
		[CIP_SFC_32000]  = {  4, 3072 },
		[CIP_SFC_48000]  = {  6, 1024 },
		[CIP_SFC_96000]  = { 12, 1024 },
		[CIP_SFC_192000] = { 24, 1024 },
		[CIP_SFC_44100]  = {  0,   67 },
		[CIP_SFC_88200]  = {  0,   67 },
		[CIP_SFC_176400] = {  0,   67 },
	};
998 999
	unsigned int header_size;
	enum dma_data_direction dir;
1000
	int type, tag, err;
1001 1002 1003

	mutex_lock(&s->mutex);

1004
	if (WARN_ON(amdtp_stream_running(s) ||
1005
		    (s->data_block_quadlets < 1))) {
1006 1007 1008 1009
		err = -EBADFD;
		goto err_unlock;
	}

1010 1011 1012 1013 1014
	if (s->direction == AMDTP_IN_STREAM &&
	    s->flags & CIP_SKIP_INIT_DBC_CHECK)
		s->data_block_counter = UINT_MAX;
	else
		s->data_block_counter = 0;
1015 1016 1017 1018
	s->data_block_state = initial_state[s->sfc].data_block;
	s->syt_offset_state = initial_state[s->sfc].syt_offset;
	s->last_syt_offset = TICKS_PER_CYCLE;

1019 1020 1021 1022 1023 1024 1025 1026 1027 1028
	/* initialize packet buffer */
	if (s->direction == AMDTP_IN_STREAM) {
		dir = DMA_FROM_DEVICE;
		type = FW_ISO_CONTEXT_RECEIVE;
		header_size = IN_PACKET_HEADER_SIZE;
	} else {
		dir = DMA_TO_DEVICE;
		type = FW_ISO_CONTEXT_TRANSMIT;
		header_size = OUT_PACKET_HEADER_SIZE;
	}
1029
	err = iso_packets_buffer_init(&s->buffer, s->unit, QUEUE_LENGTH,
1030
				      amdtp_stream_get_max_payload(s), dir);
1031 1032 1033 1034
	if (err < 0)
		goto err_unlock;

	s->context = fw_iso_context_create(fw_parent_device(s->unit)->card,
1035
					   type, channel, speed, header_size,
1036
					   amdtp_stream_first_callback, s);
1037 1038 1039 1040
	if (IS_ERR(s->context)) {
		err = PTR_ERR(s->context);
		if (err == -EBUSY)
			dev_err(&s->unit->device,
1041
				"no free stream on this controller\n");
1042 1043 1044
		goto err_buffer;
	}

1045
	amdtp_stream_update(s);
1046

1047
	s->packet_index = 0;
1048
	do {
1049 1050 1051 1052
		if (s->direction == AMDTP_IN_STREAM)
			err = queue_in_packet(s);
		else
			err = queue_out_packet(s, 0, true);
1053 1054 1055
		if (err < 0)
			goto err_context;
	} while (s->packet_index > 0);
1056

1057
	/* NOTE: TAG1 matches CIP. This just affects in stream. */
1058 1059 1060 1061
	tag = FW_ISO_CONTEXT_MATCH_TAG1;
	if (s->flags & CIP_EMPTY_WITH_TAG0)
		tag |= FW_ISO_CONTEXT_MATCH_TAG0;

1062
	s->callbacked = false;
1063
	err = fw_iso_context_start(s->context, -1, 0, tag);
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080
	if (err < 0)
		goto err_context;

	mutex_unlock(&s->mutex);

	return 0;

err_context:
	fw_iso_context_destroy(s->context);
	s->context = ERR_PTR(-1);
err_buffer:
	iso_packets_buffer_destroy(&s->buffer, s->unit);
err_unlock:
	mutex_unlock(&s->mutex);

	return err;
}
1081
EXPORT_SYMBOL(amdtp_stream_start);
1082

1083
/**
1084 1085
 * amdtp_stream_pcm_pointer - get the PCM buffer position
 * @s: the AMDTP stream that transports the PCM data
1086 1087 1088
 *
 * Returns the current buffer position, in frames.
 */
1089
unsigned long amdtp_stream_pcm_pointer(struct amdtp_stream *s)
1090
{
1091
	/* this optimization is allowed to be racy */
1092
	if (s->pointer_flush && amdtp_stream_running(s))
1093 1094 1095
		fw_iso_context_flush_completions(s->context);
	else
		s->pointer_flush = true;
1096 1097 1098

	return ACCESS_ONCE(s->pcm_buffer_pointer);
}
1099
EXPORT_SYMBOL(amdtp_stream_pcm_pointer);
1100

1101
/**
1102 1103
 * amdtp_stream_update - update the stream after a bus reset
 * @s: the AMDTP stream
1104
 */
1105
void amdtp_stream_update(struct amdtp_stream *s)
1106
{
1107
	/* Precomputing. */
1108
	ACCESS_ONCE(s->source_node_id_field) =
1109 1110
		(fw_parent_device(s->unit)->card->node_id << CIP_SID_SHIFT) &
								CIP_SID_MASK;
1111
}
1112
EXPORT_SYMBOL(amdtp_stream_update);
1113 1114

/**
1115 1116
 * amdtp_stream_stop - stop sending packets
 * @s: the AMDTP stream to stop
1117 1118 1119 1120
 *
 * All PCM and MIDI devices of the stream must be stopped before the stream
 * itself can be stopped.
 */
1121
void amdtp_stream_stop(struct amdtp_stream *s)
1122 1123 1124
{
	mutex_lock(&s->mutex);

1125
	if (!amdtp_stream_running(s)) {
1126 1127 1128 1129
		mutex_unlock(&s->mutex);
		return;
	}

1130
	tasklet_kill(&s->period_tasklet);
1131 1132 1133 1134 1135
	fw_iso_context_stop(s->context);
	fw_iso_context_destroy(s->context);
	s->context = ERR_PTR(-1);
	iso_packets_buffer_destroy(&s->buffer, s->unit);

1136 1137
	s->callbacked = false;

1138 1139
	mutex_unlock(&s->mutex);
}
1140
EXPORT_SYMBOL(amdtp_stream_stop);
1141 1142

/**
1143
 * amdtp_stream_pcm_abort - abort the running PCM device
1144 1145 1146 1147 1148
 * @s: the AMDTP stream about to be stopped
 *
 * If the isochronous stream needs to be stopped asynchronously, call this
 * function first to stop the PCM device.
 */
1149
void amdtp_stream_pcm_abort(struct amdtp_stream *s)
1150 1151 1152 1153
{
	struct snd_pcm_substream *pcm;

	pcm = ACCESS_ONCE(s->pcm);
1154 1155
	if (pcm)
		snd_pcm_stop_xrun(pcm);
1156
}
1157
EXPORT_SYMBOL(amdtp_stream_pcm_abort);