Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / sound / firewire / motu / amdtp-motu.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * amdtp-motu.c - a part of driver for MOTU FireWire series
4  *
5  * Copyright (c) 2015-2017 Takashi Sakamoto <o-takashi@sakamocchi.jp>
6  */
7
8 #include <linux/slab.h>
9 #include <sound/pcm.h>
10 #include "motu.h"
11
12 #define CREATE_TRACE_POINTS
13 #include "amdtp-motu-trace.h"
14
15 #define CIP_FMT_MOTU            0x02
16 #define CIP_FMT_MOTU_TX_V3      0x22
17 #define MOTU_FDF_AM824          0x22
18
19 /*
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.
22  */
23 #define MIDI_BYTES_PER_SECOND   3093
24
25 struct amdtp_motu {
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;
33
34         unsigned int pcm_chunks;
35         unsigned int pcm_byte_offset;
36
37         struct snd_rawmidi_substream *midi;
38         unsigned int midi_ports;
39         unsigned int midi_flag_offset;
40         unsigned int midi_byte_offset;
41
42         int midi_db_count;
43         unsigned int midi_db_interval;
44 };
45
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)
49 {
50         static const struct {
51                 unsigned int quotient_ticks_per_event;
52                 unsigned int remainder_ticks_per_event;
53         } params[] = {
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 },
60         };
61         struct amdtp_motu *p = s->protocol;
62         unsigned int pcm_chunks, data_chunks, data_block_quadlets;
63         unsigned int delay;
64         unsigned int mode;
65         int i, err;
66
67         if (amdtp_stream_running(s))
68                 return -EBUSY;
69
70         for (i = 0; i < ARRAY_SIZE(snd_motu_clock_rates); ++i) {
71                 if (snd_motu_clock_rates[i] == rate) {
72                         mode = i >> 1;
73                         break;
74                 }
75         }
76         if (i == ARRAY_SIZE(snd_motu_clock_rates))
77                 return -EINVAL;
78
79         pcm_chunks = formats->fixed_part_pcm_chunks[mode] +
80                      formats->differed_part_pcm_chunks[mode];
81         data_chunks = formats->msg_chunks + pcm_chunks;
82
83         /*
84          * Each data block includes SPH in its head. Data chunks follow with
85          * 3 byte alignment. Padding follows with zero to conform to quadlet
86          * alignment.
87          */
88         data_block_quadlets = 1 + DIV_ROUND_UP(data_chunks * 3, 4);
89
90         err = amdtp_stream_set_parameters(s, rate, data_block_quadlets);
91         if (err < 0)
92                 return err;
93
94         p->pcm_chunks = pcm_chunks;
95         p->pcm_byte_offset = formats->pcm_byte_offset;
96
97         p->midi_ports = midi_ports;
98         p->midi_flag_offset = formats->midi_flag_offset;
99         p->midi_byte_offset = formats->midi_byte_offset;
100
101         p->midi_db_count = 0;
102         p->midi_db_interval = rate / MIDI_BYTES_PER_SECOND;
103
104         /* IEEE 1394 bus requires. */
105         delay = 0x2e00;
106
107         /* For no-data or empty packets to adjust PCM sampling frequency. */
108         delay += 8000 * 3072 * s->syt_interval / rate;
109
110         p->next_seconds = 0;
111         p->next_cycles = delay / 3072;
112         p->quotient_ticks_per_event = params[s->sfc].quotient_ticks_per_event;
113         p->remainder_ticks_per_event = params[s->sfc].remainder_ticks_per_event;
114         p->next_ticks = delay % 3072;
115         p->next_accumulated = 0;
116
117         return 0;
118 }
119
120 static void read_pcm_s32(struct amdtp_stream *s,
121                          struct snd_pcm_runtime *runtime,
122                          __be32 *buffer, unsigned int data_blocks)
123 {
124         struct amdtp_motu *p = s->protocol;
125         unsigned int channels, remaining_frames, i, c;
126         u8 *byte;
127         u32 *dst;
128
129         channels = p->pcm_chunks;
130         dst = (void *)runtime->dma_area +
131                         frames_to_bytes(runtime, s->pcm_buffer_pointer);
132         remaining_frames = runtime->buffer_size - s->pcm_buffer_pointer;
133
134         for (i = 0; i < data_blocks; ++i) {
135                 byte = (u8 *)buffer + p->pcm_byte_offset;
136
137                 for (c = 0; c < channels; ++c) {
138                         *dst = (byte[0] << 24) |
139                                (byte[1] << 16) |
140                                (byte[2] << 8);
141                         byte += 3;
142                         dst++;
143                 }
144                 buffer += s->data_block_quadlets;
145                 if (--remaining_frames == 0)
146                         dst = (void *)runtime->dma_area;
147         }
148 }
149
150 static void write_pcm_s32(struct amdtp_stream *s,
151                           struct snd_pcm_runtime *runtime,
152                           __be32 *buffer, unsigned int data_blocks)
153 {
154         struct amdtp_motu *p = s->protocol;
155         unsigned int channels, remaining_frames, i, c;
156         u8 *byte;
157         const u32 *src;
158
159         channels = p->pcm_chunks;
160         src = (void *)runtime->dma_area +
161                         frames_to_bytes(runtime, s->pcm_buffer_pointer);
162         remaining_frames = runtime->buffer_size - s->pcm_buffer_pointer;
163
164         for (i = 0; i < data_blocks; ++i) {
165                 byte = (u8 *)buffer + p->pcm_byte_offset;
166
167                 for (c = 0; c < channels; ++c) {
168                         byte[0] = (*src >> 24) & 0xff;
169                         byte[1] = (*src >> 16) & 0xff;
170                         byte[2] = (*src >>  8) & 0xff;
171                         byte += 3;
172                         src++;
173                 }
174
175                 buffer += s->data_block_quadlets;
176                 if (--remaining_frames == 0)
177                         src = (void *)runtime->dma_area;
178         }
179 }
180
181 static void write_pcm_silence(struct amdtp_stream *s, __be32 *buffer,
182                               unsigned int data_blocks)
183 {
184         struct amdtp_motu *p = s->protocol;
185         unsigned int channels, i, c;
186         u8 *byte;
187
188         channels = p->pcm_chunks;
189
190         for (i = 0; i < data_blocks; ++i) {
191                 byte = (u8 *)buffer + p->pcm_byte_offset;
192
193                 for (c = 0; c < channels; ++c) {
194                         byte[0] = 0;
195                         byte[1] = 0;
196                         byte[2] = 0;
197                         byte += 3;
198                 }
199
200                 buffer += s->data_block_quadlets;
201         }
202 }
203
204 int amdtp_motu_add_pcm_hw_constraints(struct amdtp_stream *s,
205                                       struct snd_pcm_runtime *runtime)
206 {
207         int err;
208
209         /* TODO: how to set an constraint for exactly 24bit PCM sample? */
210         err = snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
211         if (err < 0)
212                 return err;
213
214         return amdtp_stream_add_pcm_hw_constraints(s, runtime);
215 }
216
217 void amdtp_motu_midi_trigger(struct amdtp_stream *s, unsigned int port,
218                              struct snd_rawmidi_substream *midi)
219 {
220         struct amdtp_motu *p = s->protocol;
221
222         if (port < p->midi_ports)
223                 WRITE_ONCE(p->midi, midi);
224 }
225
226 static void write_midi_messages(struct amdtp_stream *s, __be32 *buffer,
227                                 unsigned int data_blocks)
228 {
229         struct amdtp_motu *p = s->protocol;
230         struct snd_rawmidi_substream *midi = READ_ONCE(p->midi);
231         u8 *b;
232         int i;
233
234         for (i = 0; i < data_blocks; i++) {
235                 b = (u8 *)buffer;
236
237                 if (midi && p->midi_db_count == 0 &&
238                     snd_rawmidi_transmit(midi, b + p->midi_byte_offset, 1) == 1) {
239                         b[p->midi_flag_offset] = 0x01;
240                 } else {
241                         b[p->midi_byte_offset] = 0x00;
242                         b[p->midi_flag_offset] = 0x00;
243                 }
244
245                 buffer += s->data_block_quadlets;
246
247                 if (--p->midi_db_count < 0)
248                         p->midi_db_count = p->midi_db_interval;
249         }
250 }
251
252 static void read_midi_messages(struct amdtp_stream *s, __be32 *buffer,
253                                unsigned int data_blocks)
254 {
255         struct amdtp_motu *p = s->protocol;
256         struct snd_rawmidi_substream *midi;
257         u8 *b;
258         int i;
259
260         for (i = 0; i < data_blocks; i++) {
261                 b = (u8 *)buffer;
262                 midi = READ_ONCE(p->midi);
263
264                 if (midi && (b[p->midi_flag_offset] & 0x01))
265                         snd_rawmidi_receive(midi, b + p->midi_byte_offset, 1);
266
267                 buffer += s->data_block_quadlets;
268         }
269 }
270
271 /* For tracepoints. */
272 static void __maybe_unused copy_sph(u32 *frames, __be32 *buffer,
273                                     unsigned int data_blocks,
274                                     unsigned int data_block_quadlets)
275 {
276         unsigned int i;
277
278         for (i = 0; i < data_blocks; ++i) {
279                 *frames = be32_to_cpu(*buffer);
280                 buffer += data_block_quadlets;
281                 frames++;
282         }
283 }
284
285 /* For tracepoints. */
286 static void __maybe_unused copy_message(u64 *frames, __be32 *buffer,
287                                         unsigned int data_blocks,
288                                         unsigned int data_block_quadlets)
289 {
290         unsigned int i;
291
292         /* This is just for v2/v3 protocol. */
293         for (i = 0; i < data_blocks; ++i) {
294                 *frames = (be32_to_cpu(buffer[1]) << 16) |
295                           (be32_to_cpu(buffer[2]) >> 16);
296                 buffer += data_block_quadlets;
297                 frames++;
298         }
299 }
300
301 static unsigned int process_tx_data_blocks(struct amdtp_stream *s,
302                                 __be32 *buffer, unsigned int data_blocks,
303                                 unsigned int *syt)
304 {
305         struct amdtp_motu *p = s->protocol;
306         struct snd_pcm_substream *pcm;
307
308         trace_data_block_sph(s, data_blocks, buffer);
309         trace_data_block_message(s, data_blocks, buffer);
310
311         if (p->midi_ports)
312                 read_midi_messages(s, buffer, data_blocks);
313
314         pcm = READ_ONCE(s->pcm);
315         if (data_blocks > 0 && pcm)
316                 read_pcm_s32(s, pcm->runtime, buffer, data_blocks);
317
318         return data_blocks;
319 }
320
321 static inline void compute_next_elapse_from_start(struct amdtp_motu *p)
322 {
323         p->next_accumulated += p->remainder_ticks_per_event;
324         if (p->next_accumulated >= 441) {
325                 p->next_accumulated -= 441;
326                 p->next_ticks++;
327         }
328
329         p->next_ticks += p->quotient_ticks_per_event;
330         if (p->next_ticks >= 3072) {
331                 p->next_ticks -= 3072;
332                 p->next_cycles++;
333         }
334
335         if (p->next_cycles >= 8000) {
336                 p->next_cycles -= 8000;
337                 p->next_seconds++;
338         }
339
340         if (p->next_seconds >= 128)
341                 p->next_seconds -= 128;
342 }
343
344 static void write_sph(struct amdtp_stream *s, __be32 *buffer,
345                       unsigned int data_blocks)
346 {
347         struct amdtp_motu *p = s->protocol;
348         unsigned int next_cycles;
349         unsigned int i;
350         u32 sph;
351
352         for (i = 0; i < data_blocks; i++) {
353                 next_cycles = (s->start_cycle + p->next_cycles) % 8000;
354                 sph = ((next_cycles << 12) | p->next_ticks) & 0x01ffffff;
355                 *buffer = cpu_to_be32(sph);
356
357                 compute_next_elapse_from_start(p);
358
359                 buffer += s->data_block_quadlets;
360         }
361 }
362
363 static unsigned int process_rx_data_blocks(struct amdtp_stream *s,
364                                 __be32 *buffer, unsigned int data_blocks,
365                                 unsigned int *syt)
366 {
367         struct amdtp_motu *p = (struct amdtp_motu *)s->protocol;
368         struct snd_pcm_substream *pcm;
369
370         /* Not used. */
371         *syt = 0xffff;
372
373         /* TODO: how to interact control messages between userspace? */
374
375         if (p->midi_ports)
376                 write_midi_messages(s, buffer, data_blocks);
377
378         pcm = READ_ONCE(s->pcm);
379         if (pcm)
380                 write_pcm_s32(s, pcm->runtime, buffer, data_blocks);
381         else
382                 write_pcm_silence(s, buffer, data_blocks);
383
384         write_sph(s, buffer, data_blocks);
385
386         trace_data_block_sph(s, data_blocks, buffer);
387         trace_data_block_message(s, data_blocks, buffer);
388
389         return data_blocks;
390 }
391
392 int amdtp_motu_init(struct amdtp_stream *s, struct fw_unit *unit,
393                     enum amdtp_stream_direction dir,
394                     const struct snd_motu_protocol *const protocol)
395 {
396         amdtp_stream_process_data_blocks_t process_data_blocks;
397         int fmt = CIP_FMT_MOTU;
398         int flags = CIP_BLOCKING;
399         int err;
400
401         if (dir == AMDTP_IN_STREAM) {
402                 process_data_blocks = process_tx_data_blocks;
403
404                 /*
405                  * Units of version 3 transmits packets with invalid CIP header
406                  * against IEC 61883-1.
407                  */
408                 if (protocol == &snd_motu_protocol_v3) {
409                         flags |= CIP_WRONG_DBS |
410                                  CIP_SKIP_DBC_ZERO_CHECK |
411                                  CIP_HEADER_WITHOUT_EOH;
412                         fmt = CIP_FMT_MOTU_TX_V3;
413                 }
414
415                 if (protocol == &snd_motu_protocol_v2) {
416                         // 8pre has some quirks.
417                         flags |= CIP_WRONG_DBS |
418                                  CIP_SKIP_DBC_ZERO_CHECK;
419                 }
420         } else {
421                 process_data_blocks = process_rx_data_blocks;
422                 flags |= CIP_DBC_IS_END_EVENT;
423         }
424
425         err = amdtp_stream_init(s, unit, dir, flags, fmt, process_data_blocks,
426                                 sizeof(struct amdtp_motu));
427         if (err < 0)
428                 return err;
429
430         s->sph = 1;
431         s->ctx_data.rx.fdf = MOTU_FDF_AM824;
432
433         return 0;
434 }