1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2012-2021 Ruslan Bukin <br@bsdpad.com>
5 * Copyright (c) 2023-2024 Florian Walpen <dev@submerge.ch>
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30 /*
31 * RME HDSP driver for FreeBSD (pcm-part).
32 * Supported cards: HDSP 9632, HDSP 9652.
33 */
34
35 #include <sys/libkern.h>
36
37 #include <dev/sound/pcm/sound.h>
38 #include <dev/sound/pci/hdsp.h>
39
40 #include <dev/pci/pcireg.h>
41 #include <dev/pci/pcivar.h>
42
43 #include <mixer_if.h>
44
45 #define HDSP_MATRIX_MAX 8
46
47 struct hdsp_latency {
48 uint32_t n;
49 uint32_t period;
50 float ms;
51 };
52
53 static struct hdsp_latency latency_map[] = {
54 { 7, 32, 0.7 },
55 { 0, 64, 1.5 },
56 { 1, 128, 3 },
57 { 2, 256, 6 },
58 { 3, 512, 12 },
59 { 4, 1024, 23 },
60 { 5, 2048, 46 },
61 { 6, 4096, 93 },
62
63 { 0, 0, 0 },
64 };
65
66 struct hdsp_rate {
67 uint32_t speed;
68 uint32_t reg;
69 };
70
71 static struct hdsp_rate rate_map[] = {
72 { 32000, (HDSP_FREQ_32000) },
73 { 44100, (HDSP_FREQ_44100) },
74 { 48000, (HDSP_FREQ_48000) },
75 { 64000, (HDSP_FREQ_32000 | HDSP_FREQ_DOUBLE) },
76 { 88200, (HDSP_FREQ_44100 | HDSP_FREQ_DOUBLE) },
77 { 96000, (HDSP_FREQ_48000 | HDSP_FREQ_DOUBLE) },
78 { 128000, (HDSP_FREQ_32000 | HDSP_FREQ_QUAD) },
79 { 176400, (HDSP_FREQ_44100 | HDSP_FREQ_QUAD) },
80 { 192000, (HDSP_FREQ_48000 | HDSP_FREQ_QUAD) },
81
82 { 0, 0 },
83 };
84
85 static uint32_t
hdsp_adat_slot_map(uint32_t speed)86 hdsp_adat_slot_map(uint32_t speed)
87 {
88 /* ADAT slot bitmap depends on sample rate. */
89 if (speed <= 48000)
90 return (0x000000ff); /* 8 channels single speed. */
91 else if (speed <= 96000)
92 return (0x000000aa); /* 4 channels (1,3,5,7) double speed. */
93 else
94 return (0x00000000); /* ADAT disabled at quad speed. */
95 }
96
97 static uint32_t
hdsp_port_slot_map(uint32_t ports,uint32_t speed)98 hdsp_port_slot_map(uint32_t ports, uint32_t speed)
99 {
100 uint32_t slot_map = 0;
101
102 if (ports & HDSP_CHAN_9632_ALL) {
103 /* Map HDSP 9632 ports to slot bitmap. */
104 if (ports & HDSP_CHAN_9632_ADAT)
105 slot_map |= (hdsp_adat_slot_map(speed) << 0);
106 if (ports & HDSP_CHAN_9632_SPDIF)
107 slot_map |= (0x03 << 8); /* 2 channels SPDIF. */
108 if (ports & HDSP_CHAN_9632_LINE)
109 slot_map |= (0x03 << 10); /* 2 channels line. */
110 if (ports & HDSP_CHAN_9632_EXT)
111 slot_map |= (0x0f << 12); /* 4 channels extension. */
112 } else if ((ports & HDSP_CHAN_9652_ALL) && (speed <= 96000)) {
113 /* Map HDSP 9652 ports to slot bitmap, no quad speed. */
114 if (ports & HDSP_CHAN_9652_ADAT1)
115 slot_map |= (hdsp_adat_slot_map(speed) << 0);
116 if (ports & HDSP_CHAN_9652_ADAT2)
117 slot_map |= (hdsp_adat_slot_map(speed) << 8);
118 if (ports & HDSP_CHAN_9652_ADAT3)
119 slot_map |= (hdsp_adat_slot_map(speed) << 16);
120 if (ports & HDSP_CHAN_9652_SPDIF)
121 slot_map |= (0x03 << 24); /* 2 channels SPDIF. */
122 }
123
124 return (slot_map);
125 }
126
127 static uint32_t
hdsp_slot_first(uint32_t slots)128 hdsp_slot_first(uint32_t slots)
129 {
130 return (slots & (~(slots - 1))); /* Extract first bit set. */
131 }
132
133 static uint32_t
hdsp_slot_first_row(uint32_t slots)134 hdsp_slot_first_row(uint32_t slots)
135 {
136 uint32_t ends;
137
138 /* Ends of slot rows are followed by a slot which is not in the set. */
139 ends = slots & (~(slots >> 1));
140 /* First row of contiguous slots ends in the first row end. */
141 return (slots & (ends ^ (ends - 1)));
142 }
143
144 static uint32_t
hdsp_slot_first_n(uint32_t slots,unsigned int n)145 hdsp_slot_first_n(uint32_t slots, unsigned int n)
146 {
147 /* Clear all but the first n slots. */
148 for (uint32_t slot = 1; slot != 0; slot <<= 1) {
149 if ((slots & slot) && n > 0)
150 --n;
151 else
152 slots &= ~slot;
153 }
154 return (slots);
155 }
156
157 static unsigned int
hdsp_slot_count(uint32_t slots)158 hdsp_slot_count(uint32_t slots)
159 {
160 return (bitcount32(slots));
161 }
162
163 static unsigned int
hdsp_slot_offset(uint32_t slots)164 hdsp_slot_offset(uint32_t slots)
165 {
166 return (hdsp_slot_count(hdsp_slot_first(slots) - 1));
167 }
168
169 static unsigned int
hdsp_slot_channel_offset(uint32_t subset,uint32_t slots)170 hdsp_slot_channel_offset(uint32_t subset, uint32_t slots)
171 {
172 uint32_t preceding;
173
174 /* Make sure we have a subset of slots. */
175 subset &= slots;
176 /* Include all slots preceding the first one of the subset. */
177 preceding = slots & (hdsp_slot_first(subset) - 1);
178
179 return (hdsp_slot_count(preceding));
180 }
181
182 static uint32_t
hdsp_port_first(uint32_t ports)183 hdsp_port_first(uint32_t ports)
184 {
185 return (ports & (~(ports - 1))); /* Extract first bit set. */
186 }
187
188 static unsigned int
hdsp_port_slot_count(uint32_t ports,uint32_t speed)189 hdsp_port_slot_count(uint32_t ports, uint32_t speed)
190 {
191 return (hdsp_slot_count(hdsp_port_slot_map(ports, speed)));
192 }
193
194 static unsigned int
hdsp_port_slot_count_max(uint32_t ports)195 hdsp_port_slot_count_max(uint32_t ports)
196 {
197 return (hdsp_slot_count(hdsp_port_slot_map(ports, 48000)));
198 }
199
200 static uint32_t
hdsp_channel_play_ports(struct hdsp_channel * hc)201 hdsp_channel_play_ports(struct hdsp_channel *hc)
202 {
203 return (hc->ports & (HDSP_CHAN_9632_ALL | HDSP_CHAN_9652_ALL));
204 }
205
206 static uint32_t
hdsp_channel_rec_ports(struct hdsp_channel * hc)207 hdsp_channel_rec_ports(struct hdsp_channel *hc)
208 {
209 return (hc->ports & (HDSP_CHAN_9632_ALL | HDSP_CHAN_9652_ALL));
210 }
211
212 static int
hdsp_hw_mixer(struct sc_chinfo * ch,unsigned int dst,unsigned int src,unsigned short data)213 hdsp_hw_mixer(struct sc_chinfo *ch, unsigned int dst,
214 unsigned int src, unsigned short data)
215 {
216 struct sc_pcminfo *scp;
217 struct sc_info *sc;
218 uint32_t value;
219 int offset;
220
221 scp = ch->parent;
222 sc = scp->sc;
223
224 offset = 0;
225 value = (HDSP_MIN_GAIN << 16) | (uint16_t) data;
226
227 if (ch->dir != PCMDIR_PLAY)
228 return (0);
229
230 switch (sc->type) {
231 case HDSP_9632:
232 /* Mixer is 2 rows of sources (inputs, playback) per output. */
233 offset = dst * (2 * HDSP_MIX_SLOTS_9632);
234 /* Source index in the second row (playback). */
235 offset += HDSP_MIX_SLOTS_9632 + src;
236 break;
237 case HDSP_9652:
238 /* Mixer is 2 rows of sources (inputs, playback) per output. */
239 offset = dst * (2 * HDSP_MIX_SLOTS_9652);
240 /* Source index in the second row (playback). */
241 offset += HDSP_MIX_SLOTS_9652 + src;
242 break;
243 default:
244 return (0);
245 }
246
247 /*
248 * We have to write mixer matrix values in pairs, with the second
249 * (odd) value in the upper 16 bits of the 32 bit value.
250 * Make value offset even and shift value accordingly.
251 * Assume the paired value to be silenced, since we only set gain
252 * on the diagonal where src and dst are the same.
253 */
254 if (offset % 2) {
255 offset -= 1;
256 value = (value << 16) | HDSP_MIN_GAIN;
257 }
258
259 hdsp_write_4(sc, HDSP_MIXER_BASE + offset * sizeof(uint16_t), value);
260
261 return (0);
262 };
263
264 static int
hdspchan_setgain(struct sc_chinfo * ch)265 hdspchan_setgain(struct sc_chinfo *ch)
266 {
267 uint32_t port, ports;
268 uint32_t slot, slots;
269 unsigned int offset;
270 unsigned short volume;
271
272 /* Iterate through all physical ports of the channel. */
273 ports = ch->ports;
274 port = hdsp_port_first(ports);
275 while (port != 0) {
276 /*
277 * Get slot map from physical port.
278 * Unlike DMA buffers, the hardware mixer's channel mapping
279 * does not change with double or quad speed sample rates.
280 */
281 slots = hdsp_port_slot_map(port, 48000);
282 slot = hdsp_slot_first(slots);
283
284 /* Treat first slot as left channel. */
285 volume = ch->lvol * HDSP_MAX_GAIN / 100;
286 while (slot != 0) {
287 offset = hdsp_slot_offset(slot);
288 hdsp_hw_mixer(ch, offset, offset, volume);
289
290 slots &= ~slot;
291 slot = hdsp_slot_first(slots);
292
293 /* Subsequent slots all get the right channel volume. */
294 volume = ch->rvol * HDSP_MAX_GAIN / 100;
295 }
296
297 ports &= ~port;
298 port = hdsp_port_first(ports);
299 }
300
301 return (0);
302 }
303
304 static int
hdspmixer_init(struct snd_mixer * m)305 hdspmixer_init(struct snd_mixer *m)
306 {
307 struct sc_pcminfo *scp;
308 struct sc_info *sc;
309 int mask;
310
311 scp = mix_getdevinfo(m);
312 sc = scp->sc;
313 if (sc == NULL)
314 return (-1);
315
316 mask = SOUND_MASK_PCM;
317
318 if (hdsp_channel_play_ports(scp->hc))
319 mask |= SOUND_MASK_VOLUME;
320
321 if (hdsp_channel_rec_ports(scp->hc))
322 mask |= SOUND_MASK_RECLEV;
323
324 snd_mtxlock(sc->lock);
325 pcm_setflags(scp->dev, pcm_getflags(scp->dev) | SD_F_SOFTPCMVOL);
326 mix_setdevs(m, mask);
327 snd_mtxunlock(sc->lock);
328
329 return (0);
330 }
331
332 static int
hdspmixer_set(struct snd_mixer * m,unsigned dev,unsigned left,unsigned right)333 hdspmixer_set(struct snd_mixer *m, unsigned dev,
334 unsigned left, unsigned right)
335 {
336 struct sc_pcminfo *scp;
337 struct sc_chinfo *ch;
338 int i;
339
340 scp = mix_getdevinfo(m);
341
342 #if 0
343 device_printf(scp->dev, "hdspmixer_set() %d %d\n",
344 left, right);
345 #endif
346
347 for (i = 0; i < scp->chnum; i++) {
348 ch = &scp->chan[i];
349 if ((dev == SOUND_MIXER_VOLUME && ch->dir == PCMDIR_PLAY) ||
350 (dev == SOUND_MIXER_RECLEV && ch->dir == PCMDIR_REC)) {
351 ch->lvol = left;
352 ch->rvol = right;
353 if (ch->run)
354 hdspchan_setgain(ch);
355 }
356 }
357
358 return (0);
359 }
360
361 static kobj_method_t hdspmixer_methods[] = {
362 KOBJMETHOD(mixer_init, hdspmixer_init),
363 KOBJMETHOD(mixer_set, hdspmixer_set),
364 KOBJMETHOD_END
365 };
366 MIXER_DECLARE(hdspmixer);
367
368 static void
hdspchan_enable(struct sc_chinfo * ch,int value)369 hdspchan_enable(struct sc_chinfo *ch, int value)
370 {
371 struct sc_pcminfo *scp;
372 struct sc_info *sc;
373 uint32_t slot, slots;
374 unsigned int offset;
375 int reg;
376
377 scp = ch->parent;
378 sc = scp->sc;
379
380 if (ch->dir == PCMDIR_PLAY)
381 reg = HDSP_OUT_ENABLE_BASE;
382 else
383 reg = HDSP_IN_ENABLE_BASE;
384
385 ch->run = value;
386
387 /* Iterate through all slots of the channel's physical ports. */
388 slots = hdsp_port_slot_map(ch->ports, sc->speed);
389 slot = hdsp_slot_first(slots);
390 while (slot != 0) {
391 /* Set register to enable or disable slot. */
392 offset = hdsp_slot_offset(slot);
393 hdsp_write_1(sc, reg + (4 * offset), value);
394
395 slots &= ~slot;
396 slot = hdsp_slot_first(slots);
397 }
398 }
399
400 static int
hdsp_running(struct sc_info * sc)401 hdsp_running(struct sc_info *sc)
402 {
403 struct sc_pcminfo *scp;
404 struct sc_chinfo *ch;
405 device_t *devlist;
406 int devcount;
407 int i, j;
408 int running;
409
410 running = 0;
411
412 devlist = NULL;
413 devcount = 0;
414
415 if (device_get_children(sc->dev, &devlist, &devcount) != 0)
416 running = 1; /* On error, avoid channel config changes. */
417
418 for (i = 0; running == 0 && i < devcount; i++) {
419 scp = device_get_ivars(devlist[i]);
420 for (j = 0; j < scp->chnum; j++) {
421 ch = &scp->chan[j];
422 if (ch->run) {
423 running = 1;
424 break;
425 }
426 }
427 }
428
429 #if 0
430 if (running == 1)
431 device_printf(sc->dev, "hdsp is running\n");
432 #endif
433
434 free(devlist, M_TEMP);
435
436 return (running);
437 }
438
439 static void
hdsp_start_audio(struct sc_info * sc)440 hdsp_start_audio(struct sc_info *sc)
441 {
442
443 sc->ctrl_register |= (HDSP_AUDIO_INT_ENABLE | HDSP_ENABLE);
444 hdsp_write_4(sc, HDSP_CONTROL_REG, sc->ctrl_register);
445 }
446
447 static void
hdsp_stop_audio(struct sc_info * sc)448 hdsp_stop_audio(struct sc_info *sc)
449 {
450
451 if (hdsp_running(sc) == 1)
452 return;
453
454 sc->ctrl_register &= ~(HDSP_AUDIO_INT_ENABLE | HDSP_ENABLE);
455 hdsp_write_4(sc, HDSP_CONTROL_REG, sc->ctrl_register);
456 }
457
458 static void
buffer_mux_write(uint32_t * dma,uint32_t * pcm,unsigned int pos,unsigned int pos_end,unsigned int width,unsigned int channels)459 buffer_mux_write(uint32_t *dma, uint32_t *pcm, unsigned int pos,
460 unsigned int pos_end, unsigned int width, unsigned int channels)
461 {
462 unsigned int slot;
463
464 for (; pos < pos_end; ++pos) {
465 for (slot = 0; slot < width; slot++) {
466 dma[slot * HDSP_CHANBUF_SAMPLES + pos] =
467 pcm[pos * channels + slot];
468 }
469 }
470 }
471
472 static void
buffer_mux_port(uint32_t * dma,uint32_t * pcm,uint32_t subset,uint32_t slots,unsigned int pos,unsigned int samples,unsigned int channels)473 buffer_mux_port(uint32_t *dma, uint32_t *pcm, uint32_t subset, uint32_t slots,
474 unsigned int pos, unsigned int samples, unsigned int channels)
475 {
476 unsigned int slot_offset, width;
477 unsigned int chan_pos;
478
479 /* Translate DMA slot offset to DMA buffer offset. */
480 slot_offset = hdsp_slot_offset(subset);
481 dma += slot_offset * HDSP_CHANBUF_SAMPLES;
482
483 /* Channel position of the slot subset. */
484 chan_pos = hdsp_slot_channel_offset(subset, slots);
485 pcm += chan_pos;
486
487 /* Only copy channels supported by both hardware and pcm format. */
488 width = hdsp_slot_count(subset);
489
490 /* Let the compiler inline and loop unroll common cases. */
491 if (width == 1)
492 buffer_mux_write(dma, pcm, pos, pos + samples, 1, channels);
493 else if (width == 2)
494 buffer_mux_write(dma, pcm, pos, pos + samples, 2, channels);
495 else if (width == 4)
496 buffer_mux_write(dma, pcm, pos, pos + samples, 4, channels);
497 else if (width == 8)
498 buffer_mux_write(dma, pcm, pos, pos + samples, 8, channels);
499 else
500 buffer_mux_write(dma, pcm, pos, pos + samples, width, channels);
501 }
502
503 static void
buffer_demux_read(uint32_t * dma,uint32_t * pcm,unsigned int pos,unsigned int pos_end,unsigned int width,unsigned int channels)504 buffer_demux_read(uint32_t *dma, uint32_t *pcm, unsigned int pos,
505 unsigned int pos_end, unsigned int width, unsigned int channels)
506 {
507 unsigned int slot;
508
509 for (; pos < pos_end; ++pos) {
510 for (slot = 0; slot < width; slot++) {
511 pcm[pos * channels + slot] =
512 dma[slot * HDSP_CHANBUF_SAMPLES + pos];
513 }
514 }
515 }
516
517 static void
buffer_demux_port(uint32_t * dma,uint32_t * pcm,uint32_t subset,uint32_t slots,unsigned int pos,unsigned int samples,unsigned int channels)518 buffer_demux_port(uint32_t *dma, uint32_t *pcm, uint32_t subset, uint32_t slots,
519 unsigned int pos, unsigned int samples, unsigned int channels)
520 {
521 unsigned int slot_offset, width;
522 unsigned int chan_pos;
523
524 /* Translate DMA slot offset to DMA buffer offset. */
525 slot_offset = hdsp_slot_offset(subset);
526 dma += slot_offset * HDSP_CHANBUF_SAMPLES;
527
528 /* Channel position of the slot subset. */
529 chan_pos = hdsp_slot_channel_offset(subset, slots);
530 pcm += chan_pos;
531
532 /* Only copy channels supported by both hardware and pcm format. */
533 width = hdsp_slot_count(subset);
534
535 /* Let the compiler inline and loop unroll common cases. */
536 if (width == 1)
537 buffer_demux_read(dma, pcm, pos, pos + samples, 1, channels);
538 else if (width == 2)
539 buffer_demux_read(dma, pcm, pos, pos + samples, 2, channels);
540 else if (width == 4)
541 buffer_demux_read(dma, pcm, pos, pos + samples, 4, channels);
542 else if (width == 8)
543 buffer_demux_read(dma, pcm, pos, pos + samples, 8, channels);
544 else
545 buffer_demux_read(dma, pcm, pos, pos + samples, width, channels);
546 }
547
548
549 /* Copy data between DMA and PCM buffers. */
550 static void
buffer_copy(struct sc_chinfo * ch)551 buffer_copy(struct sc_chinfo *ch)
552 {
553 struct sc_pcminfo *scp;
554 struct sc_info *sc;
555 uint32_t row, slots;
556 uint32_t dma_pos;
557 unsigned int pos, length, remainder, offset, buffer_size;
558 unsigned int channels;
559
560 scp = ch->parent;
561 sc = scp->sc;
562
563 channels = AFMT_CHANNEL(ch->format); /* Number of PCM channels. */
564
565 /* HDSP cards read / write a double buffer, twice the latency period. */
566 buffer_size = 2 * sc->period * sizeof(uint32_t);
567
568 /* Derive buffer position and length to be copied. */
569 if (ch->dir == PCMDIR_PLAY) {
570 /* Buffer position scaled down to a single channel. */
571 pos = sndbuf_getreadyptr(ch->buffer) / channels;
572 length = sndbuf_getready(ch->buffer) / channels;
573 /* Copy no more than 2 periods in advance. */
574 if (length > buffer_size)
575 length = buffer_size;
576 /* Skip what was already copied last time. */
577 offset = (ch->position + buffer_size) - pos;
578 offset %= buffer_size;
579 if (offset <= length) {
580 pos = (pos + offset) % buffer_size;
581 length -= offset;
582 }
583 } else {
584 /* Buffer position scaled down to a single channel. */
585 pos = sndbuf_getfreeptr(ch->buffer) / channels;
586 /* Get DMA buffer write position. */
587 dma_pos = hdsp_read_2(sc, HDSP_STATUS_REG);
588 dma_pos &= HDSP_BUF_POSITION_MASK;
589 dma_pos %= buffer_size;
590 /* Copy what is newly available. */
591 length = (dma_pos + buffer_size) - pos;
592 length %= buffer_size;
593 }
594
595 /* Position and length in samples (4 bytes). */
596 pos /= 4;
597 length /= 4;
598 buffer_size /= sizeof(uint32_t);
599
600 /* Split copy length to wrap around at buffer end. */
601 remainder = 0;
602 if (pos + length > buffer_size)
603 remainder = (pos + length) - buffer_size;
604
605 /* Iterate through rows of contiguous slots. */
606 slots = hdsp_port_slot_map(ch->ports, sc->speed);
607 slots = hdsp_slot_first_n(slots, channels);
608 row = hdsp_slot_first_row(slots);
609
610 while (row != 0) {
611 if (ch->dir == PCMDIR_PLAY) {
612 buffer_mux_port(sc->pbuf, ch->data, row, slots, pos,
613 length - remainder, channels);
614 buffer_mux_port(sc->pbuf, ch->data, row, slots, 0,
615 remainder, channels);
616 } else {
617 buffer_demux_port(sc->rbuf, ch->data, row, slots, pos,
618 length - remainder, channels);
619 buffer_demux_port(sc->rbuf, ch->data, row, slots, 0,
620 remainder, channels);
621 }
622
623 slots &= ~row;
624 row = hdsp_slot_first_row(slots);
625 }
626
627 ch->position = ((pos + length) * 4) % buffer_size;
628 }
629
630 static int
clean(struct sc_chinfo * ch)631 clean(struct sc_chinfo *ch)
632 {
633 struct sc_pcminfo *scp;
634 struct sc_info *sc;
635 uint32_t *buf;
636 uint32_t slot, slots;
637 unsigned int offset;
638
639 scp = ch->parent;
640 sc = scp->sc;
641 buf = sc->rbuf;
642
643 if (ch->dir == PCMDIR_PLAY)
644 buf = sc->pbuf;
645
646 /* Iterate through all of the channel's slots. */
647 slots = hdsp_port_slot_map(ch->ports, sc->speed);
648 slot = hdsp_slot_first(slots);
649 while (slot != 0) {
650 /* Clear the slot's buffer. */
651 offset = hdsp_slot_offset(slot);
652 bzero(buf + offset * HDSP_CHANBUF_SAMPLES, HDSP_CHANBUF_SIZE);
653
654 slots &= ~slot;
655 slot = hdsp_slot_first(slots);
656 }
657
658 ch->position = 0;
659
660 return (0);
661 }
662
663 /* Channel interface. */
664 static int
hdspchan_free(kobj_t obj,void * data)665 hdspchan_free(kobj_t obj, void *data)
666 {
667 struct sc_pcminfo *scp;
668 struct sc_chinfo *ch;
669 struct sc_info *sc;
670
671 ch = data;
672 scp = ch->parent;
673 sc = scp->sc;
674
675 #if 0
676 device_printf(scp->dev, "hdspchan_free()\n");
677 #endif
678
679 snd_mtxlock(sc->lock);
680 if (ch->data != NULL) {
681 free(ch->data, M_HDSP);
682 ch->data = NULL;
683 }
684 if (ch->caps != NULL) {
685 free(ch->caps, M_HDSP);
686 ch->caps = NULL;
687 }
688 snd_mtxunlock(sc->lock);
689
690 return (0);
691 }
692
693 static void *
hdspchan_init(kobj_t obj,void * devinfo,struct snd_dbuf * b,struct pcm_channel * c,int dir)694 hdspchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
695 struct pcm_channel *c, int dir)
696 {
697 struct sc_pcminfo *scp;
698 struct sc_chinfo *ch;
699 struct sc_info *sc;
700 int num;
701
702 scp = devinfo;
703 sc = scp->sc;
704
705 snd_mtxlock(sc->lock);
706 num = scp->chnum;
707
708 ch = &scp->chan[num];
709
710 if (dir == PCMDIR_PLAY)
711 ch->ports = hdsp_channel_play_ports(scp->hc);
712 else
713 ch->ports = hdsp_channel_rec_ports(scp->hc);
714
715 ch->run = 0;
716 ch->lvol = 0;
717 ch->rvol = 0;
718
719 /* Support all possible ADAT widths as channel formats. */
720 ch->cap_fmts[0] =
721 SND_FORMAT(AFMT_S32_LE, hdsp_port_slot_count(ch->ports, 48000), 0);
722 ch->cap_fmts[1] =
723 SND_FORMAT(AFMT_S32_LE, hdsp_port_slot_count(ch->ports, 96000), 0);
724 ch->cap_fmts[2] =
725 SND_FORMAT(AFMT_S32_LE, hdsp_port_slot_count(ch->ports, 192000), 0);
726 ch->cap_fmts[3] = 0;
727
728 ch->caps = malloc(sizeof(struct pcmchan_caps), M_HDSP, M_NOWAIT);
729 *(ch->caps) = (struct pcmchan_caps) {32000, 192000, ch->cap_fmts, 0};
730
731 /* HDSP 9652 does not support quad speed sample rates. */
732 if (sc->type == HDSP_9652) {
733 ch->cap_fmts[2] = SND_FORMAT(AFMT_S32_LE, 2, 0);
734 ch->caps->maxspeed = 96000;
735 }
736
737 /* Allocate maximum buffer size. */
738 ch->size = HDSP_CHANBUF_SIZE * hdsp_port_slot_count_max(ch->ports);
739 ch->data = malloc(ch->size, M_HDSP, M_NOWAIT);
740 ch->position = 0;
741
742 ch->buffer = b;
743 ch->channel = c;
744 ch->parent = scp;
745
746 ch->dir = dir;
747
748 snd_mtxunlock(sc->lock);
749
750 if (sndbuf_setup(ch->buffer, ch->data, ch->size) != 0) {
751 device_printf(scp->dev, "Can't setup sndbuf.\n");
752 hdspchan_free(obj, ch);
753 return (NULL);
754 }
755
756 return (ch);
757 }
758
759 static int
hdspchan_trigger(kobj_t obj,void * data,int go)760 hdspchan_trigger(kobj_t obj, void *data, int go)
761 {
762 struct sc_pcminfo *scp;
763 struct sc_chinfo *ch;
764 struct sc_info *sc;
765
766 ch = data;
767 scp = ch->parent;
768 sc = scp->sc;
769
770 snd_mtxlock(sc->lock);
771 switch (go) {
772 case PCMTRIG_START:
773 #if 0
774 device_printf(scp->dev, "hdspchan_trigger(): start\n");
775 #endif
776 hdspchan_enable(ch, 1);
777 hdspchan_setgain(ch);
778 hdsp_start_audio(sc);
779 break;
780
781 case PCMTRIG_STOP:
782 case PCMTRIG_ABORT:
783 #if 0
784 device_printf(scp->dev, "hdspchan_trigger(): stop or abort\n");
785 #endif
786 clean(ch);
787 hdspchan_enable(ch, 0);
788 hdsp_stop_audio(sc);
789 break;
790
791 case PCMTRIG_EMLDMAWR:
792 case PCMTRIG_EMLDMARD:
793 if(ch->run)
794 buffer_copy(ch);
795 break;
796 }
797
798 snd_mtxunlock(sc->lock);
799
800 return (0);
801 }
802
803 static uint32_t
hdspchan_getptr(kobj_t obj,void * data)804 hdspchan_getptr(kobj_t obj, void *data)
805 {
806 struct sc_pcminfo *scp;
807 struct sc_chinfo *ch;
808 struct sc_info *sc;
809 uint32_t ret, pos;
810
811 ch = data;
812 scp = ch->parent;
813 sc = scp->sc;
814
815 snd_mtxlock(sc->lock);
816 ret = hdsp_read_2(sc, HDSP_STATUS_REG);
817 snd_mtxunlock(sc->lock);
818
819 pos = ret & HDSP_BUF_POSITION_MASK;
820 pos %= (2 * sc->period * sizeof(uint32_t)); /* Double buffer. */
821 pos *= AFMT_CHANNEL(ch->format); /* Hardbuf with multiple channels. */
822
823 return (pos);
824 }
825
826 static int
hdspchan_setformat(kobj_t obj,void * data,uint32_t format)827 hdspchan_setformat(kobj_t obj, void *data, uint32_t format)
828 {
829 struct sc_chinfo *ch;
830
831 ch = data;
832
833 #if 0
834 struct sc_pcminfo *scp = ch->parent;
835 device_printf(scp->dev, "hdspchan_setformat(%d)\n", format);
836 #endif
837
838 ch->format = format;
839
840 return (0);
841 }
842
843 static uint32_t
hdspchan_setspeed(kobj_t obj,void * data,uint32_t speed)844 hdspchan_setspeed(kobj_t obj, void *data, uint32_t speed)
845 {
846 struct sc_pcminfo *scp;
847 struct hdsp_rate *hr;
848 struct sc_chinfo *ch;
849 struct sc_info *sc;
850 int threshold;
851 int i;
852
853 ch = data;
854 scp = ch->parent;
855 sc = scp->sc;
856 hr = NULL;
857
858 #if 0
859 device_printf(scp->dev, "hdspchan_setspeed(%d)\n", speed);
860 #endif
861
862 if (hdsp_running(sc) == 1)
863 goto end;
864
865 /* HDSP 9652 only supports sample rates up to 96kHz. */
866 if (sc->type == HDSP_9652 && speed > 96000)
867 speed = 96000;
868
869 if (sc->force_speed > 0)
870 speed = sc->force_speed;
871
872 /* First look for equal frequency. */
873 for (i = 0; rate_map[i].speed != 0; i++) {
874 if (rate_map[i].speed == speed)
875 hr = &rate_map[i];
876 }
877
878 /* If no match, just find nearest. */
879 if (hr == NULL) {
880 for (i = 0; rate_map[i].speed != 0; i++) {
881 hr = &rate_map[i];
882 threshold = hr->speed + ((rate_map[i + 1].speed != 0) ?
883 ((rate_map[i + 1].speed - hr->speed) >> 1) : 0);
884 if (speed < threshold)
885 break;
886 }
887 }
888
889 /* Write frequency on the device. */
890 sc->ctrl_register &= ~HDSP_FREQ_MASK;
891 sc->ctrl_register |= hr->reg;
892 hdsp_write_4(sc, HDSP_CONTROL_REG, sc->ctrl_register);
893
894 if (sc->type == HDSP_9632) {
895 /* Set DDS value. */
896 hdsp_write_4(sc, HDSP_FREQ_REG, hdsp_freq_reg_value(hr->speed));
897 }
898
899 sc->speed = hr->speed;
900 end:
901
902 return (sc->speed);
903 }
904
905 static uint32_t
hdspchan_setblocksize(kobj_t obj,void * data,uint32_t blocksize)906 hdspchan_setblocksize(kobj_t obj, void *data, uint32_t blocksize)
907 {
908 struct hdsp_latency *hl;
909 struct sc_pcminfo *scp;
910 struct sc_chinfo *ch;
911 struct sc_info *sc;
912 int threshold;
913 int i;
914
915 ch = data;
916 scp = ch->parent;
917 sc = scp->sc;
918 hl = NULL;
919
920 #if 0
921 device_printf(scp->dev, "hdspchan_setblocksize(%d)\n", blocksize);
922 #endif
923
924 if (hdsp_running(sc) == 1)
925 goto end;
926
927 if (blocksize > HDSP_LAT_BYTES_MAX)
928 blocksize = HDSP_LAT_BYTES_MAX;
929 else if (blocksize < HDSP_LAT_BYTES_MIN)
930 blocksize = HDSP_LAT_BYTES_MIN;
931
932 blocksize /= 4 /* samples */;
933
934 if (sc->force_period > 0)
935 blocksize = sc->force_period;
936
937 /* First look for equal latency. */
938 for (i = 0; latency_map[i].period != 0; i++) {
939 if (latency_map[i].period == blocksize)
940 hl = &latency_map[i];
941 }
942
943 /* If no match, just find nearest. */
944 if (hl == NULL) {
945 for (i = 0; latency_map[i].period != 0; i++) {
946 hl = &latency_map[i];
947 threshold = hl->period + ((latency_map[i + 1].period != 0) ?
948 ((latency_map[i + 1].period - hl->period) >> 1) : 0);
949 if (blocksize < threshold)
950 break;
951 }
952 }
953
954 snd_mtxlock(sc->lock);
955 sc->ctrl_register &= ~HDSP_LAT_MASK;
956 sc->ctrl_register |= hdsp_encode_latency(hl->n);
957 hdsp_write_4(sc, HDSP_CONTROL_REG, sc->ctrl_register);
958 sc->period = hl->period;
959 snd_mtxunlock(sc->lock);
960
961 #if 0
962 device_printf(scp->dev, "New period=%d\n", sc->period);
963 #endif
964
965 sndbuf_resize(ch->buffer, 2,
966 (sc->period * AFMT_CHANNEL(ch->format) * sizeof(uint32_t)));
967
968 /* Reset pointer, rewrite frequency (same register) for 9632. */
969 hdsp_write_4(sc, HDSP_RESET_POINTER, 0);
970 if (sc->type == HDSP_9632)
971 hdsp_write_4(sc, HDSP_FREQ_REG, hdsp_freq_reg_value(sc->speed));
972 end:
973
974 return (sndbuf_getblksz(ch->buffer));
975 }
976
977 static uint32_t hdsp_bkp_fmt[] = {
978 SND_FORMAT(AFMT_S32_LE, 2, 0),
979 0
980 };
981
982 /* Capabilities fallback, no quad speed for HDSP 9652 compatibility. */
983 static struct pcmchan_caps hdsp_bkp_caps = {32000, 96000, hdsp_bkp_fmt, 0};
984
985 static struct pcmchan_caps *
hdspchan_getcaps(kobj_t obj,void * data)986 hdspchan_getcaps(kobj_t obj, void *data)
987 {
988 struct sc_chinfo *ch;
989
990 ch = data;
991
992 #if 0
993 device_printf(ch->parent->dev, "hdspchan_getcaps()\n");
994 #endif
995
996 if (ch->caps != NULL)
997 return (ch->caps);
998
999 return (&hdsp_bkp_caps);
1000 }
1001
1002 static kobj_method_t hdspchan_methods[] = {
1003 KOBJMETHOD(channel_init, hdspchan_init),
1004 KOBJMETHOD(channel_free, hdspchan_free),
1005 KOBJMETHOD(channel_setformat, hdspchan_setformat),
1006 KOBJMETHOD(channel_setspeed, hdspchan_setspeed),
1007 KOBJMETHOD(channel_setblocksize, hdspchan_setblocksize),
1008 KOBJMETHOD(channel_trigger, hdspchan_trigger),
1009 KOBJMETHOD(channel_getptr, hdspchan_getptr),
1010 KOBJMETHOD(channel_getcaps, hdspchan_getcaps),
1011 KOBJMETHOD_END
1012 };
1013 CHANNEL_DECLARE(hdspchan);
1014
1015 static int
hdsp_pcm_probe(device_t dev)1016 hdsp_pcm_probe(device_t dev)
1017 {
1018
1019 #if 0
1020 device_printf(dev,"hdsp_pcm_probe()\n");
1021 #endif
1022
1023 return (0);
1024 }
1025
1026 static uint32_t
hdsp_pcm_intr(struct sc_pcminfo * scp)1027 hdsp_pcm_intr(struct sc_pcminfo *scp)
1028 {
1029 struct sc_chinfo *ch;
1030 struct sc_info *sc;
1031 int i;
1032
1033 sc = scp->sc;
1034
1035 for (i = 0; i < scp->chnum; i++) {
1036 ch = &scp->chan[i];
1037 snd_mtxunlock(sc->lock);
1038 chn_intr(ch->channel);
1039 snd_mtxlock(sc->lock);
1040 }
1041
1042 return (0);
1043 }
1044
1045 static int
hdsp_pcm_attach(device_t dev)1046 hdsp_pcm_attach(device_t dev)
1047 {
1048 char status[SND_STATUSLEN];
1049 struct sc_pcminfo *scp;
1050 const char *buf;
1051 uint32_t pcm_flags;
1052 int err;
1053 int play, rec;
1054
1055 scp = device_get_ivars(dev);
1056 scp->ih = &hdsp_pcm_intr;
1057
1058 if (scp->hc->ports & HDSP_CHAN_9632_ALL)
1059 buf = "9632";
1060 else if (scp->hc->ports & HDSP_CHAN_9652_ALL)
1061 buf = "9652";
1062 else
1063 buf = "?";
1064 device_set_descf(dev, "HDSP %s [%s]", buf, scp->hc->descr);
1065
1066 /*
1067 * We don't register interrupt handler with snd_setup_intr
1068 * in pcm device. Mark pcm device as MPSAFE manually.
1069 */
1070 pcm_flags = pcm_getflags(dev) | SD_F_MPSAFE;
1071 if (hdsp_port_slot_count_max(scp->hc->ports) > HDSP_MATRIX_MAX)
1072 /* Disable vchan conversion, too many channels. */
1073 pcm_flags |= SD_F_BITPERFECT;
1074 pcm_setflags(dev, pcm_flags);
1075
1076 pcm_init(dev, scp);
1077
1078 play = (hdsp_channel_play_ports(scp->hc)) ? 1 : 0;
1079 rec = (hdsp_channel_rec_ports(scp->hc)) ? 1 : 0;
1080
1081 scp->chnum = 0;
1082 if (play) {
1083 pcm_addchan(dev, PCMDIR_PLAY, &hdspchan_class, scp);
1084 scp->chnum++;
1085 }
1086
1087 if (rec) {
1088 pcm_addchan(dev, PCMDIR_REC, &hdspchan_class, scp);
1089 scp->chnum++;
1090 }
1091
1092 snprintf(status, SND_STATUSLEN, "port 0x%jx irq %jd on %s",
1093 rman_get_start(scp->sc->cs),
1094 rman_get_start(scp->sc->irq),
1095 device_get_nameunit(device_get_parent(dev)));
1096 err = pcm_register(dev, status);
1097 if (err) {
1098 device_printf(dev, "Can't register pcm.\n");
1099 return (ENXIO);
1100 }
1101
1102 mixer_init(dev, &hdspmixer_class, scp);
1103
1104 return (0);
1105 }
1106
1107 static int
hdsp_pcm_detach(device_t dev)1108 hdsp_pcm_detach(device_t dev)
1109 {
1110 int err;
1111
1112 err = pcm_unregister(dev);
1113 if (err) {
1114 device_printf(dev, "Can't unregister device.\n");
1115 return (err);
1116 }
1117
1118 return (0);
1119 }
1120
1121 static device_method_t hdsp_pcm_methods[] = {
1122 DEVMETHOD(device_probe, hdsp_pcm_probe),
1123 DEVMETHOD(device_attach, hdsp_pcm_attach),
1124 DEVMETHOD(device_detach, hdsp_pcm_detach),
1125 { 0, 0 }
1126 };
1127
1128 static driver_t hdsp_pcm_driver = {
1129 "pcm",
1130 hdsp_pcm_methods,
1131 PCM_SOFTC_SIZE,
1132 };
1133
1134 DRIVER_MODULE(snd_hdsp_pcm, hdsp, hdsp_pcm_driver, 0, 0);
1135 MODULE_DEPEND(snd_hdsp, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER);
1136 MODULE_VERSION(snd_hdsp, 1);
1137