1 // SPDX-License-Identifier: GPL-2.0-only
3 * amdtp-motu.c - a part of driver for MOTU FireWire series
5 * Copyright (c) 2015-2017 Takashi Sakamoto <o-takashi@sakamocchi.jp>
8 #include <linux/slab.h>
12 #define CREATE_TRACE_POINTS
13 #include "amdtp-motu-trace.h"
15 #define CIP_FMT_MOTU 0x02
16 #define CIP_FMT_MOTU_TX_V3 0x22
17 #define MOTU_FDF_AM824 0x22
20 * Nominally 3125 bytes/second, but the MIDI port's clock might be
21 * 1% too slow, and the bus clock 100 ppm too fast.
23 #define MIDI_BYTES_PER_SECOND 3093
26 /* For timestamp processing. */
27 unsigned int quotient_ticks_per_event
;
28 unsigned int remainder_ticks_per_event
;
29 unsigned int next_ticks
;
30 unsigned int next_accumulated
;
31 unsigned int next_cycles
;
32 unsigned int next_seconds
;
34 unsigned int pcm_chunks
;
35 unsigned int pcm_byte_offset
;
37 struct snd_rawmidi_substream
*midi
;
38 unsigned int midi_ports
;
39 unsigned int midi_flag_offset
;
40 unsigned int midi_byte_offset
;
43 unsigned int midi_db_interval
;
46 int amdtp_motu_set_parameters(struct amdtp_stream
*s
, unsigned int rate
,
47 unsigned int midi_ports
,
48 struct snd_motu_packet_format
*formats
)
51 unsigned int quotient_ticks_per_event
;
52 unsigned int remainder_ticks_per_event
;
54 [CIP_SFC_44100
] = { 557, 123 },
55 [CIP_SFC_48000
] = { 512, 0 },
56 [CIP_SFC_88200
] = { 278, 282 },
57 [CIP_SFC_96000
] = { 256, 0 },
58 [CIP_SFC_176400
] = { 139, 141 },
59 [CIP_SFC_192000
] = { 128, 0 },
61 struct amdtp_motu
*p
= s
->protocol
;
62 unsigned int pcm_chunks
, data_chunks
, data_block_quadlets
;
67 if (amdtp_stream_running(s
))
70 for (i
= 0; i
< ARRAY_SIZE(snd_motu_clock_rates
); ++i
) {
71 if (snd_motu_clock_rates
[i
] == rate
) {
76 if (i
== ARRAY_SIZE(snd_motu_clock_rates
))
79 // Each data block includes SPH in its head. Data chunks follow with
80 // 3 byte alignment. Padding follows with zero to conform to quadlet
82 pcm_chunks
= formats
->pcm_chunks
[mode
];
83 data_chunks
= formats
->msg_chunks
+ pcm_chunks
;
84 data_block_quadlets
= 1 + DIV_ROUND_UP(data_chunks
* 3, 4);
86 err
= amdtp_stream_set_parameters(s
, rate
, data_block_quadlets
);
90 p
->pcm_chunks
= pcm_chunks
;
91 p
->pcm_byte_offset
= formats
->pcm_byte_offset
;
93 p
->midi_ports
= midi_ports
;
94 p
->midi_flag_offset
= formats
->midi_flag_offset
;
95 p
->midi_byte_offset
= formats
->midi_byte_offset
;
98 p
->midi_db_interval
= rate
/ MIDI_BYTES_PER_SECOND
;
100 /* IEEE 1394 bus requires. */
103 /* For no-data or empty packets to adjust PCM sampling frequency. */
104 delay
+= 8000 * 3072 * s
->syt_interval
/ rate
;
107 p
->next_cycles
= delay
/ 3072;
108 p
->quotient_ticks_per_event
= params
[s
->sfc
].quotient_ticks_per_event
;
109 p
->remainder_ticks_per_event
= params
[s
->sfc
].remainder_ticks_per_event
;
110 p
->next_ticks
= delay
% 3072;
111 p
->next_accumulated
= 0;
116 static void read_pcm_s32(struct amdtp_stream
*s
, struct snd_pcm_substream
*pcm
,
117 __be32
*buffer
, unsigned int data_blocks
,
118 unsigned int pcm_frames
)
120 struct amdtp_motu
*p
= s
->protocol
;
121 unsigned int channels
= p
->pcm_chunks
;
122 struct snd_pcm_runtime
*runtime
= pcm
->runtime
;
123 unsigned int pcm_buffer_pointer
;
124 int remaining_frames
;
129 pcm_buffer_pointer
= s
->pcm_buffer_pointer
+ pcm_frames
;
130 pcm_buffer_pointer
%= runtime
->buffer_size
;
132 dst
= (void *)runtime
->dma_area
+
133 frames_to_bytes(runtime
, pcm_buffer_pointer
);
134 remaining_frames
= runtime
->buffer_size
- pcm_buffer_pointer
;
136 for (i
= 0; i
< data_blocks
; ++i
) {
137 byte
= (u8
*)buffer
+ p
->pcm_byte_offset
;
139 for (c
= 0; c
< channels
; ++c
) {
140 *dst
= (byte
[0] << 24) |
146 buffer
+= s
->data_block_quadlets
;
147 if (--remaining_frames
== 0)
148 dst
= (void *)runtime
->dma_area
;
152 static void write_pcm_s32(struct amdtp_stream
*s
, struct snd_pcm_substream
*pcm
,
153 __be32
*buffer
, unsigned int data_blocks
,
154 unsigned int pcm_frames
)
156 struct amdtp_motu
*p
= s
->protocol
;
157 unsigned int channels
= p
->pcm_chunks
;
158 struct snd_pcm_runtime
*runtime
= pcm
->runtime
;
159 unsigned int pcm_buffer_pointer
;
160 int remaining_frames
;
165 pcm_buffer_pointer
= s
->pcm_buffer_pointer
+ pcm_frames
;
166 pcm_buffer_pointer
%= runtime
->buffer_size
;
168 src
= (void *)runtime
->dma_area
+
169 frames_to_bytes(runtime
, pcm_buffer_pointer
);
170 remaining_frames
= runtime
->buffer_size
- pcm_buffer_pointer
;
172 for (i
= 0; i
< data_blocks
; ++i
) {
173 byte
= (u8
*)buffer
+ p
->pcm_byte_offset
;
175 for (c
= 0; c
< channels
; ++c
) {
176 byte
[0] = (*src
>> 24) & 0xff;
177 byte
[1] = (*src
>> 16) & 0xff;
178 byte
[2] = (*src
>> 8) & 0xff;
183 buffer
+= s
->data_block_quadlets
;
184 if (--remaining_frames
== 0)
185 src
= (void *)runtime
->dma_area
;
189 static void write_pcm_silence(struct amdtp_stream
*s
, __be32
*buffer
,
190 unsigned int data_blocks
)
192 struct amdtp_motu
*p
= s
->protocol
;
193 unsigned int channels
, i
, c
;
196 channels
= p
->pcm_chunks
;
198 for (i
= 0; i
< data_blocks
; ++i
) {
199 byte
= (u8
*)buffer
+ p
->pcm_byte_offset
;
201 for (c
= 0; c
< channels
; ++c
) {
208 buffer
+= s
->data_block_quadlets
;
212 int amdtp_motu_add_pcm_hw_constraints(struct amdtp_stream
*s
,
213 struct snd_pcm_runtime
*runtime
)
217 /* TODO: how to set an constraint for exactly 24bit PCM sample? */
218 err
= snd_pcm_hw_constraint_msbits(runtime
, 0, 32, 24);
222 return amdtp_stream_add_pcm_hw_constraints(s
, runtime
);
225 void amdtp_motu_midi_trigger(struct amdtp_stream
*s
, unsigned int port
,
226 struct snd_rawmidi_substream
*midi
)
228 struct amdtp_motu
*p
= s
->protocol
;
230 if (port
< p
->midi_ports
)
231 WRITE_ONCE(p
->midi
, midi
);
234 static void write_midi_messages(struct amdtp_stream
*s
, __be32
*buffer
,
235 unsigned int data_blocks
)
237 struct amdtp_motu
*p
= s
->protocol
;
238 struct snd_rawmidi_substream
*midi
= READ_ONCE(p
->midi
);
242 for (i
= 0; i
< data_blocks
; i
++) {
245 if (midi
&& p
->midi_db_count
== 0 &&
246 snd_rawmidi_transmit(midi
, b
+ p
->midi_byte_offset
, 1) == 1) {
247 b
[p
->midi_flag_offset
] = 0x01;
249 b
[p
->midi_byte_offset
] = 0x00;
250 b
[p
->midi_flag_offset
] = 0x00;
253 buffer
+= s
->data_block_quadlets
;
255 if (--p
->midi_db_count
< 0)
256 p
->midi_db_count
= p
->midi_db_interval
;
260 static void read_midi_messages(struct amdtp_stream
*s
, __be32
*buffer
,
261 unsigned int data_blocks
)
263 struct amdtp_motu
*p
= s
->protocol
;
264 struct snd_rawmidi_substream
*midi
;
268 for (i
= 0; i
< data_blocks
; i
++) {
270 midi
= READ_ONCE(p
->midi
);
272 if (midi
&& (b
[p
->midi_flag_offset
] & 0x01))
273 snd_rawmidi_receive(midi
, b
+ p
->midi_byte_offset
, 1);
275 buffer
+= s
->data_block_quadlets
;
279 /* For tracepoints. */
280 static void __maybe_unused
copy_sph(u32
*frames
, __be32
*buffer
,
281 unsigned int data_blocks
,
282 unsigned int data_block_quadlets
)
286 for (i
= 0; i
< data_blocks
; ++i
) {
287 *frames
= be32_to_cpu(*buffer
);
288 buffer
+= data_block_quadlets
;
293 /* For tracepoints. */
294 static void __maybe_unused
copy_message(u64
*frames
, __be32
*buffer
,
295 unsigned int data_blocks
,
296 unsigned int data_block_quadlets
)
300 /* This is just for v2/v3 protocol. */
301 for (i
= 0; i
< data_blocks
; ++i
) {
302 *frames
= (be32_to_cpu(buffer
[1]) << 16) |
303 (be32_to_cpu(buffer
[2]) >> 16);
304 buffer
+= data_block_quadlets
;
309 static void probe_tracepoints_events(struct amdtp_stream
*s
,
310 const struct pkt_desc
*descs
,
311 unsigned int packets
)
315 for (i
= 0; i
< packets
; ++i
) {
316 const struct pkt_desc
*desc
= descs
+ i
;
317 __be32
*buf
= desc
->ctx_payload
;
318 unsigned int data_blocks
= desc
->data_blocks
;
320 trace_data_block_sph(s
, data_blocks
, buf
);
321 trace_data_block_message(s
, data_blocks
, buf
);
325 static unsigned int process_ir_ctx_payloads(struct amdtp_stream
*s
,
326 const struct pkt_desc
*descs
,
327 unsigned int packets
,
328 struct snd_pcm_substream
*pcm
)
330 struct amdtp_motu
*p
= s
->protocol
;
331 unsigned int pcm_frames
= 0;
334 // For data block processing.
335 for (i
= 0; i
< packets
; ++i
) {
336 const struct pkt_desc
*desc
= descs
+ i
;
337 __be32
*buf
= desc
->ctx_payload
;
338 unsigned int data_blocks
= desc
->data_blocks
;
341 read_pcm_s32(s
, pcm
, buf
, data_blocks
, pcm_frames
);
342 pcm_frames
+= data_blocks
;
346 read_midi_messages(s
, buf
, data_blocks
);
350 if (trace_data_block_sph_enabled() ||
351 trace_data_block_message_enabled())
352 probe_tracepoints_events(s
, descs
, packets
);
357 static inline void compute_next_elapse_from_start(struct amdtp_motu
*p
)
359 p
->next_accumulated
+= p
->remainder_ticks_per_event
;
360 if (p
->next_accumulated
>= 441) {
361 p
->next_accumulated
-= 441;
365 p
->next_ticks
+= p
->quotient_ticks_per_event
;
366 if (p
->next_ticks
>= 3072) {
367 p
->next_ticks
-= 3072;
371 if (p
->next_cycles
>= 8000) {
372 p
->next_cycles
-= 8000;
376 if (p
->next_seconds
>= 128)
377 p
->next_seconds
-= 128;
380 static void write_sph(struct amdtp_stream
*s
, __be32
*buffer
,
381 unsigned int data_blocks
)
383 struct amdtp_motu
*p
= s
->protocol
;
384 unsigned int next_cycles
;
388 for (i
= 0; i
< data_blocks
; i
++) {
389 next_cycles
= (s
->start_cycle
+ p
->next_cycles
) % 8000;
390 sph
= ((next_cycles
<< 12) | p
->next_ticks
) & 0x01ffffff;
391 *buffer
= cpu_to_be32(sph
);
393 compute_next_elapse_from_start(p
);
395 buffer
+= s
->data_block_quadlets
;
399 static unsigned int process_it_ctx_payloads(struct amdtp_stream
*s
,
400 const struct pkt_desc
*descs
,
401 unsigned int packets
,
402 struct snd_pcm_substream
*pcm
)
404 struct amdtp_motu
*p
= s
->protocol
;
405 unsigned int pcm_frames
= 0;
408 // For data block processing.
409 for (i
= 0; i
< packets
; ++i
) {
410 const struct pkt_desc
*desc
= descs
+ i
;
411 __be32
*buf
= desc
->ctx_payload
;
412 unsigned int data_blocks
= desc
->data_blocks
;
415 write_pcm_s32(s
, pcm
, buf
, data_blocks
, pcm_frames
);
416 pcm_frames
+= data_blocks
;
418 write_pcm_silence(s
, buf
, data_blocks
);
422 write_midi_messages(s
, buf
, data_blocks
);
424 // TODO: how to interact control messages between userspace?
426 write_sph(s
, buf
, data_blocks
);
430 if (trace_data_block_sph_enabled() ||
431 trace_data_block_message_enabled())
432 probe_tracepoints_events(s
, descs
, packets
);
437 int amdtp_motu_init(struct amdtp_stream
*s
, struct fw_unit
*unit
,
438 enum amdtp_stream_direction dir
,
439 const struct snd_motu_spec
*spec
)
441 amdtp_stream_process_ctx_payloads_t process_ctx_payloads
;
442 int fmt
= CIP_FMT_MOTU
;
443 int flags
= CIP_BLOCKING
;
446 if (dir
== AMDTP_IN_STREAM
) {
447 process_ctx_payloads
= process_ir_ctx_payloads
;
450 * Units of version 3 transmits packets with invalid CIP header
451 * against IEC 61883-1.
453 if (spec
->protocol_version
== SND_MOTU_PROTOCOL_V3
) {
454 flags
|= CIP_WRONG_DBS
|
455 CIP_SKIP_DBC_ZERO_CHECK
|
456 CIP_HEADER_WITHOUT_EOH
;
457 fmt
= CIP_FMT_MOTU_TX_V3
;
460 if (spec
== &snd_motu_spec_8pre
||
461 spec
== &snd_motu_spec_ultralite
) {
462 // 8pre has some quirks.
463 flags
|= CIP_WRONG_DBS
|
464 CIP_SKIP_DBC_ZERO_CHECK
;
467 process_ctx_payloads
= process_it_ctx_payloads
;
468 flags
|= CIP_DBC_IS_END_EVENT
;
471 err
= amdtp_stream_init(s
, unit
, dir
, flags
, fmt
, process_ctx_payloads
,
472 sizeof(struct amdtp_motu
));
478 if (dir
== AMDTP_OUT_STREAM
) {
479 // Use fixed value for FDF field.
480 s
->ctx_data
.rx
.fdf
= MOTU_FDF_AM824
;
482 s
->ctx_data
.rx
.syt_override
= 0xffff;