merge
[dragonfly.git] / sys / dev / sound / pci / emu10k1.c
1 /*-
2  * Copyright (c) 2004 David O'Brien <obrien@FreeBSD.org>
3  * Copyright (c) 2003 Orlando Bassotto <orlando.bassotto@ieo-research.it>
4  * Copyright (c) 1999 Cameron Grant <cg@freebsd.org>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHERIN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD: src/sys/dev/sound/pci/emu10k1.c,v 1.55.2.1 2005/12/30 19:55:53 netchild Exp $
29  */
30
31 #include <dev/sound/pcm/sound.h>
32 #include <dev/sound/pcm/ac97.h>
33 #include <gnu/dev/sound/pci/emu10k1.h>
34 #include "emu10k1-alsa%diked.h"
35
36 #include <bus/pci/pcireg.h>
37 #include <bus/pci/pcivar.h>
38 #include <sys/queue.h>
39
40 SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pci/emu10k1.c,v 1.14 2008/01/06 16:55:51 swildner Exp $");
41
42 /* -------------------------------------------------------------------- */
43
44 #define NUM_G           64      /* use all channels */
45 #define WAVEOUT_MAXBUFSIZE 32768
46 #define EMUPAGESIZE     4096    /* don't change */
47 #define EMUMAXPAGES     (WAVEOUT_MAXBUFSIZE * NUM_G / EMUPAGESIZE)
48 #define EMU10K1_PCI_ID  0x00021102      /* 1102 => Creative Labs Vendor ID */
49 #define EMU10K2_PCI_ID  0x00041102      
50 #define EMU10K3_PCI_ID  0x00081102      
51 #define EMU_DEFAULT_BUFSZ       4096
52 #define EMU_MAX_CHANS   8
53 #define EMU_CHANS       4
54
55 #define MAXREQVOICES    8
56 #define RESERVED        0
57 #define NUM_MIDI        16
58 #define NUM_FXSENDS     4
59
60 #define TMEMSIZE        256*1024
61 #define TMEMSIZEREG     4
62
63 #define ENABLE          0xffffffff
64 #define DISABLE         0x00000000
65 #define ENV_ON          DCYSUSV_CHANNELENABLE_MASK
66 #define ENV_OFF         0x00    /* XXX: should this be 1? */
67
68 #define A_IOCFG_GPOUT_A 0x40    /* Analog Output */
69 #define A_IOCFG_GPOUT_D 0x04    /* Digital Output */
70 #define A_IOCFG_GPOUT_AD (A_IOCFG_GPOUT_A|A_IOCFG_GPOUT_D)  /* A_IOCFG_GPOUT0 */
71
72 struct emu_memblk {
73         SLIST_ENTRY(emu_memblk) link;
74         void *buf;
75         bus_addr_t buf_addr;
76         u_int32_t pte_start, pte_size;
77 };
78
79 struct emu_mem {
80         u_int8_t bmap[EMUMAXPAGES / 8];
81         u_int32_t *ptb_pages;
82         void *silent_page;
83         bus_addr_t silent_page_addr;
84         bus_addr_t ptb_pages_addr;
85         SLIST_HEAD(, emu_memblk) blocks;
86 };
87
88 struct emu_voice {
89         int vnum;
90         int b16:1, stereo:1, busy:1, running:1, ismaster:1;
91         int speed;
92         int start, end, vol;
93         int fxrt1;      /* FX routing */
94         int fxrt2;      /* FX routing (only for audigy) */
95         u_int32_t buf;
96         struct emu_voice *slave;
97         struct pcm_channel *channel;
98 };
99
100 struct sc_info;
101
102 /* channel registers */
103 struct sc_pchinfo {
104         int spd, fmt, blksz, run;
105         struct emu_voice *master, *slave;
106         struct snd_dbuf *buffer;
107         struct pcm_channel *channel;
108         struct sc_info *parent;
109 };
110
111 struct sc_rchinfo {
112         int spd, fmt, run, blksz, num;
113         u_int32_t idxreg, basereg, sizereg, setupreg, irqmask;
114         struct snd_dbuf *buffer;
115         struct pcm_channel *channel;
116         struct sc_info *parent;
117 };
118
119 /* device private data */
120 struct sc_info {
121         device_t        dev;
122         u_int32_t       type, rev;
123         u_int32_t       tos_link:1, APS:1, audigy:1, audigy2:1;
124         u_int32_t       addrmask;       /* wider if audigy */
125
126         bus_space_tag_t st;
127         bus_space_handle_t sh;
128         bus_dma_tag_t parent_dmat;
129
130         struct resource *reg, *irq;
131         void            *ih;
132         sndlock_t       lock;
133
134         unsigned int bufsz;
135         int timer, timerinterval;
136         int pnum, rnum;
137         int nchans;
138         struct emu_mem mem;
139         struct emu_voice voice[64];
140         struct sc_pchinfo pch[EMU_MAX_CHANS];
141         struct sc_rchinfo rch[3];
142 };
143
144 /* -------------------------------------------------------------------- */
145
146 /*
147  * prototypes
148  */
149
150 /* stuff */
151 static int emu_init(struct sc_info *);
152 static void emu_intr(void *);
153 static void *emu_malloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr);
154 static void *emu_memalloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr);
155 static int emu_memfree(struct sc_info *sc, void *buf);
156 static int emu_memstart(struct sc_info *sc, void *buf);
157 #ifdef EMUDEBUG
158 static void emu_vdump(struct sc_info *sc, struct emu_voice *v);
159 #endif
160
161 /* talk to the card */
162 static u_int32_t emu_rd(struct sc_info *, int, int);
163 static void emu_wr(struct sc_info *, int, u_int32_t, int);
164
165 /* -------------------------------------------------------------------- */
166
167 static u_int32_t emu_rfmt_ac97[] = {
168         AFMT_S16_LE,
169         AFMT_STEREO | AFMT_S16_LE,
170         0
171 };
172
173 static u_int32_t emu_rfmt_mic[] = {
174         AFMT_U8,
175         0
176 };
177
178 static u_int32_t emu_rfmt_efx[] = {
179         AFMT_STEREO | AFMT_S16_LE,
180         0
181 };
182
183 static struct pcmchan_caps emu_reccaps[3] = {
184         {8000, 48000, emu_rfmt_ac97, 0},
185         {8000, 8000, emu_rfmt_mic, 0},
186         {48000, 48000, emu_rfmt_efx, 0},
187 };
188
189 static u_int32_t emu_pfmt[] = {
190         AFMT_U8,
191         AFMT_STEREO | AFMT_U8,
192         AFMT_S16_LE,
193         AFMT_STEREO | AFMT_S16_LE,
194         0
195 };
196
197 static struct pcmchan_caps emu_playcaps = {4000, 48000, emu_pfmt, 0};
198
199 static int adcspeed[8] = {48000, 44100, 32000, 24000, 22050, 16000, 11025, 8000};
200 /* audigy supports 12kHz. */
201 static int audigy_adcspeed[9] = {
202         48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000
203 };
204
205 /* -------------------------------------------------------------------- */
206 /* Hardware */
207 static u_int32_t
208 emu_rd(struct sc_info *sc, int regno, int size)
209 {
210         switch (size) {
211         case 1:
212                 return bus_space_read_1(sc->st, sc->sh, regno);
213         case 2:
214                 return bus_space_read_2(sc->st, sc->sh, regno);
215         case 4:
216                 return bus_space_read_4(sc->st, sc->sh, regno);
217         default:
218                 return 0xffffffff;
219         }
220 }
221
222 static void
223 emu_wr(struct sc_info *sc, int regno, u_int32_t data, int size)
224 {
225         switch (size) {
226         case 1:
227                 bus_space_write_1(sc->st, sc->sh, regno, data);
228                 break;
229         case 2:
230                 bus_space_write_2(sc->st, sc->sh, regno, data);
231                 break;
232         case 4:
233                 bus_space_write_4(sc->st, sc->sh, regno, data);
234                 break;
235         }
236 }
237
238 static u_int32_t
239 emu_rdptr(struct sc_info *sc, int chn, int reg)
240 {
241         u_int32_t ptr, val, mask, size, offset;
242
243         ptr = ((reg << 16) & sc->addrmask) | (chn & PTR_CHANNELNUM_MASK);
244         emu_wr(sc, PTR, ptr, 4);
245         val = emu_rd(sc, DATA, 4);
246         if (reg & 0xff000000) {
247                 size = (reg >> 24) & 0x3f;
248                 offset = (reg >> 16) & 0x1f;
249                 mask = ((1 << size) - 1) << offset;
250                 val &= mask;
251                 val >>= offset;
252         }
253         return val;
254 }
255
256 static void
257 emu_wrptr(struct sc_info *sc, int chn, int reg, u_int32_t data)
258 {
259         u_int32_t ptr, mask, size, offset;
260
261         ptr = ((reg << 16) & sc->addrmask) | (chn & PTR_CHANNELNUM_MASK);
262         emu_wr(sc, PTR, ptr, 4);
263         if (reg & 0xff000000) {
264                 size = (reg >> 24) & 0x3f;
265                 offset = (reg >> 16) & 0x1f;
266                 mask = ((1 << size) - 1) << offset;
267                 data <<= offset;
268                 data &= mask;
269                 data |= emu_rd(sc, DATA, 4) & ~mask;
270         }
271         emu_wr(sc, DATA, data, 4);
272 }
273
274 static void
275 emu_wrefx(struct sc_info *sc, unsigned int pc, unsigned int data)
276 {
277         pc += sc->audigy ? AUDIGY_CODEBASE : MICROCODEBASE;
278         emu_wrptr(sc, 0, pc, data);
279 }
280
281 /* -------------------------------------------------------------------- */
282 /* ac97 codec */
283 /* no locking needed */
284
285 static int
286 emu_rdcd(kobj_t obj, void *devinfo, int regno)
287 {
288         struct sc_info *sc = (struct sc_info *)devinfo;
289
290         emu_wr(sc, AC97ADDRESS, regno, 1);
291         return emu_rd(sc, AC97DATA, 2);
292 }
293
294 static int
295 emu_wrcd(kobj_t obj, void *devinfo, int regno, u_int32_t data)
296 {
297         struct sc_info *sc = (struct sc_info *)devinfo;
298
299         emu_wr(sc, AC97ADDRESS, regno, 1);
300         emu_wr(sc, AC97DATA, data, 2);
301         return 0;
302 }
303
304 static kobj_method_t emu_ac97_methods[] = {
305         KOBJMETHOD(ac97_read,           emu_rdcd),
306         KOBJMETHOD(ac97_write,          emu_wrcd),
307         KOBJMETHOD_END
308 };
309 AC97_DECLARE(emu_ac97);
310
311 /* -------------------------------------------------------------------- */
312 /* stuff */
313 static int
314 emu_settimer(struct sc_info *sc)
315 {
316         struct sc_pchinfo *pch;
317         struct sc_rchinfo *rch;
318         int i, tmp, rate;
319
320         rate = 0;
321         for (i = 0; i < sc->nchans; i++) {
322                 pch = &sc->pch[i];
323                 if (pch->buffer) {
324                         tmp = (pch->spd * sndbuf_getbps(pch->buffer))
325                             / pch->blksz;
326                         if (tmp > rate)
327                                 rate = tmp;
328                 }
329         }
330
331         for (i = 0; i < 3; i++) {
332                 rch = &sc->rch[i];
333                 if (rch->buffer) {
334                         tmp = (rch->spd * sndbuf_getbps(rch->buffer))
335                             / rch->blksz;
336                         if (tmp > rate)
337                                 rate = tmp;
338                 }
339         }
340         RANGE(rate, 48, 9600);
341         sc->timerinterval = 48000 / rate;
342         emu_wr(sc, TIMER, sc->timerinterval & 0x03ff, 2);
343
344         return sc->timerinterval;
345 }
346
347 static int
348 emu_enatimer(struct sc_info *sc, int go)
349 {
350         u_int32_t x;
351         if (go) {
352                 if (sc->timer++ == 0) {
353                         x = emu_rd(sc, INTE, 4);
354                         x |= INTE_INTERVALTIMERENB;
355                         emu_wr(sc, INTE, x, 4);
356                 }
357         } else {
358                 sc->timer = 0;
359                 x = emu_rd(sc, INTE, 4);
360                 x &= ~INTE_INTERVALTIMERENB;
361                 emu_wr(sc, INTE, x, 4);
362         }
363         return 0;
364 }
365
366 static void
367 emu_enastop(struct sc_info *sc, char channel, int enable)
368 {
369         int reg = (channel & 0x20) ? SOLEH : SOLEL;
370         channel &= 0x1f;
371         reg |= 1 << 24;
372         reg |= channel << 16;
373         emu_wrptr(sc, 0, reg, enable);
374 }
375
376 static int
377 emu_recval(int speed) {
378         int val;
379
380         val = 0;
381         while (val < 7 && speed < adcspeed[val])
382                 val++;
383         return val;
384 }
385
386 static int
387 audigy_recval(int speed) {
388         int val;
389
390         val = 0;
391         while (val < 8 && speed < audigy_adcspeed[val])
392                 val++;
393         return val;
394 }
395
396 static u_int32_t
397 emu_rate_to_pitch(u_int32_t rate)
398 {
399         static u_int32_t logMagTable[128] = {
400                 0x00000, 0x02dfc, 0x05b9e, 0x088e6, 0x0b5d6, 0x0e26f, 0x10eb3, 0x13aa2,
401                 0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 0x2118b, 0x23b9a, 0x2655d, 0x28ed5,
402                 0x2b803, 0x2e0e8, 0x30985, 0x331db, 0x359eb, 0x381b6, 0x3a93d, 0x3d081,
403                 0x3f782, 0x41e42, 0x444c1, 0x46b01, 0x49101, 0x4b6c4, 0x4dc49, 0x50191,
404                 0x5269e, 0x54b6f, 0x57006, 0x59463, 0x5b888, 0x5dc74, 0x60029, 0x623a7,
405                 0x646ee, 0x66a00, 0x68cdd, 0x6af86, 0x6d1fa, 0x6f43c, 0x7164b, 0x73829,
406                 0x759d4, 0x77b4f, 0x79c9a, 0x7bdb5, 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e,
407                 0x86082, 0x88089, 0x8a064, 0x8c014, 0x8df98, 0x8fef1, 0x91e20, 0x93d26,
408                 0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 0x9d5d9, 0x9f3ec, 0xa11d8, 0xa2f9d,
409                 0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 0xac241, 0xadf26, 0xafbe7, 0xb1885,
410                 0xb3500, 0xb5157, 0xb6d8c, 0xb899f, 0xba58f, 0xbc15e, 0xbdd0c, 0xbf899,
411                 0xc1404, 0xc2f50, 0xc4a7b, 0xc6587, 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c,
412                 0xceaec, 0xd053f, 0xd1f73, 0xd398a, 0xd5384, 0xd6d60, 0xd8720, 0xda0c3,
413                 0xdba4a, 0xdd3b4, 0xded03, 0xe0636, 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3,
414                 0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 0xee44c, 0xefc78, 0xf148a, 0xf2c83,
415                 0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 0xfa2f0, 0xfba57, 0xfd1a7, 0xfe8df
416         };
417         static char logSlopeTable[128] = {
418                 0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58,
419                 0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53,
420                 0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f,
421                 0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b,
422                 0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47,
423                 0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44,
424                 0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41,
425                 0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e,
426                 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c,
427                 0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39,
428                 0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37,
429                 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35,
430                 0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34,
431                 0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32,
432                 0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30,
433                 0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f
434         };
435         int i;
436
437         if (rate == 0)
438                 return 0;       /* Bail out if no leading "1" */
439         rate *= 11185;  /* Scale 48000 to 0x20002380 */
440         for (i = 31; i > 0; i--) {
441                 if (rate & 0x80000000) {        /* Detect leading "1" */
442                         return (((u_int32_t) (i - 15) << 20) +
443                             logMagTable[0x7f & (rate >> 24)] +
444                             (0x7f & (rate >> 17)) *
445                             logSlopeTable[0x7f & (rate >> 24)]);
446                 }
447                 rate <<= 1;
448         }
449
450         return 0;               /* Should never reach this point */
451 }
452
453 static u_int32_t
454 emu_rate_to_linearpitch(u_int32_t rate)
455 {
456         rate = (rate << 8) / 375;
457         return (rate >> 1) + (rate & 1);
458 }
459
460 static struct emu_voice *
461 emu_valloc(struct sc_info *sc)
462 {
463         struct emu_voice *v;
464         int i;
465
466         v = NULL;
467         for (i = 0; i < 64 && sc->voice[i].busy; i++);
468         if (i < 64) {
469                 v = &sc->voice[i];
470                 v->busy = 1;
471         }
472         return v;
473 }
474
475 static int
476 emu_vinit(struct sc_info *sc, struct emu_voice *m, struct emu_voice *s,
477           u_int32_t sz, struct snd_dbuf *b)
478 {
479         void *buf;
480         bus_addr_t tmp_addr;
481
482         buf = emu_memalloc(sc, sz, &tmp_addr);
483         if (buf == NULL)
484                 return -1;
485         if (b != NULL)
486                 sndbuf_setup(b, buf, sz);
487         m->start = emu_memstart(sc, buf) * EMUPAGESIZE;
488         m->end = m->start + sz;
489         m->channel = NULL;
490         m->speed = 0;
491         m->b16 = 0;
492         m->stereo = 0;
493         m->running = 0;
494         m->ismaster = 1;
495         m->vol = 0xff;
496         m->buf = tmp_addr;
497         m->slave = s;
498         if (sc->audigy) {
499                 m->fxrt1 = FXBUS_MIDI_CHORUS | FXBUS_PCM_RIGHT << 8 |
500                     FXBUS_PCM_LEFT << 16 | FXBUS_MIDI_REVERB << 24;
501                 m->fxrt2 = 0x3f3f3f3f;  /* No effects on second route */
502         } else {
503                 m->fxrt1 = FXBUS_MIDI_CHORUS | FXBUS_PCM_RIGHT << 4 |
504                     FXBUS_PCM_LEFT << 8 | FXBUS_MIDI_REVERB << 12;
505                 m->fxrt2 = 0;
506         }
507
508         if (s != NULL) {
509                 s->start = m->start;
510                 s->end = m->end;
511                 s->channel = NULL;
512                 s->speed = 0;
513                 s->b16 = 0;
514                 s->stereo = 0;
515                 s->running = 0;
516                 s->ismaster = 0;
517                 s->vol = m->vol;
518                 s->buf = m->buf;
519                 s->fxrt1 = m->fxrt1;
520                 s->fxrt2 = m->fxrt2;
521                 s->slave = NULL;
522         }
523         return 0;
524 }
525
526 static void
527 emu_vsetup(struct sc_pchinfo *ch)
528 {
529         struct emu_voice *v = ch->master;
530
531         if (ch->fmt) {
532                 v->b16 = (ch->fmt & AFMT_16BIT) ? 1 : 0;
533                 v->stereo = (ch->fmt & AFMT_STEREO) ? 1 : 0;
534                 if (v->slave != NULL) {
535                         v->slave->b16 = v->b16;
536                         v->slave->stereo = v->stereo;
537                 }
538         }
539         if (ch->spd) {
540                 v->speed = ch->spd;
541                 if (v->slave != NULL)
542                         v->slave->speed = v->speed;
543         }
544 }
545
546 static void
547 emu_vwrite(struct sc_info *sc, struct emu_voice *v)
548 {
549         int s;
550         int l, r, x, y;
551         u_int32_t sa, ea, start, val, silent_page;
552
553         s = (v->stereo ? 1 : 0) + (v->b16 ? 1 : 0);
554
555         sa = v->start >> s;
556         ea = v->end >> s;
557
558         l = r = x = y = v->vol;
559         if (v->stereo) {
560                 l = v->ismaster ? l : 0;
561                 r = v->ismaster ? 0 : r;
562         }
563
564         emu_wrptr(sc, v->vnum, CPF, v->stereo ? CPF_STEREO_MASK : 0);
565         val = v->stereo ? 28 : 30;
566         val *= v->b16 ? 1 : 2;
567         start = sa + val;
568
569         if (sc->audigy) {
570                 emu_wrptr(sc, v->vnum, A_FXRT1, v->fxrt1);
571                 emu_wrptr(sc, v->vnum, A_FXRT2, v->fxrt2);
572                 emu_wrptr(sc, v->vnum, A_SENDAMOUNTS, 0);
573         }
574         else
575                 emu_wrptr(sc, v->vnum, FXRT, v->fxrt1 << 16);
576
577         emu_wrptr(sc, v->vnum, PTRX, (x << 8) | r);
578         emu_wrptr(sc, v->vnum, DSL, ea | (y << 24));
579         emu_wrptr(sc, v->vnum, PSST, sa | (l << 24));
580         emu_wrptr(sc, v->vnum, CCCA, start | (v->b16 ? 0 : CCCA_8BITSELECT));
581
582         emu_wrptr(sc, v->vnum, Z1, 0);
583         emu_wrptr(sc, v->vnum, Z2, 0);
584
585         silent_page = ((u_int32_t)(sc->mem.silent_page_addr) << 1)
586             | MAP_PTI_MASK;
587         emu_wrptr(sc, v->vnum, MAPA, silent_page);
588         emu_wrptr(sc, v->vnum, MAPB, silent_page);
589
590         emu_wrptr(sc, v->vnum, CVCF, CVCF_CURRENTFILTER_MASK);
591         emu_wrptr(sc, v->vnum, VTFT, VTFT_FILTERTARGET_MASK);
592         emu_wrptr(sc, v->vnum, ATKHLDM, 0);
593         emu_wrptr(sc, v->vnum, DCYSUSM, DCYSUSM_DECAYTIME_MASK);
594         emu_wrptr(sc, v->vnum, LFOVAL1, 0x8000);
595         emu_wrptr(sc, v->vnum, LFOVAL2, 0x8000);
596         emu_wrptr(sc, v->vnum, FMMOD, 0);
597         emu_wrptr(sc, v->vnum, TREMFRQ, 0);
598         emu_wrptr(sc, v->vnum, FM2FRQ2, 0);
599         emu_wrptr(sc, v->vnum, ENVVAL, 0x8000);
600
601         emu_wrptr(sc, v->vnum, ATKHLDV,
602             ATKHLDV_HOLDTIME_MASK | ATKHLDV_ATTACKTIME_MASK);
603         emu_wrptr(sc, v->vnum, ENVVOL, 0x8000);
604
605         emu_wrptr(sc, v->vnum, PEFE_FILTERAMOUNT, 0x7f);
606         emu_wrptr(sc, v->vnum, PEFE_PITCHAMOUNT, 0);
607
608         if (v->slave != NULL)
609                 emu_vwrite(sc, v->slave);
610 }
611
612 static void
613 emu_vtrigger(struct sc_info *sc, struct emu_voice *v, int go)
614 {
615         u_int32_t pitch_target, initial_pitch;
616         u_int32_t cra, cs, ccis;
617         u_int32_t sample, i;
618
619         if (go) {
620                 cra = 64;
621                 cs = v->stereo ? 4 : 2;
622                 ccis = v->stereo ? 28 : 30;
623                 ccis *= v->b16 ? 1 : 2;
624                 sample = v->b16 ? 0x00000000 : 0x80808080;
625
626                 for (i = 0; i < cs; i++)
627                         emu_wrptr(sc, v->vnum, CD0 + i, sample);
628                 emu_wrptr(sc, v->vnum, CCR_CACHEINVALIDSIZE, 0);
629                 emu_wrptr(sc, v->vnum, CCR_READADDRESS, cra);
630                 emu_wrptr(sc, v->vnum, CCR_CACHEINVALIDSIZE, ccis);
631
632                 emu_wrptr(sc, v->vnum, IFATN, 0xff00);
633                 emu_wrptr(sc, v->vnum, VTFT, 0xffffffff);
634                 emu_wrptr(sc, v->vnum, CVCF, 0xffffffff);
635                 emu_wrptr(sc, v->vnum, DCYSUSV, 0x00007f7f);
636                 emu_enastop(sc, v->vnum, 0);
637
638                 pitch_target = emu_rate_to_linearpitch(v->speed);
639                 initial_pitch = emu_rate_to_pitch(v->speed) >> 8;
640                 emu_wrptr(sc, v->vnum, PTRX_PITCHTARGET, pitch_target);
641                 emu_wrptr(sc, v->vnum, CPF_CURRENTPITCH, pitch_target);
642                 emu_wrptr(sc, v->vnum, IP, initial_pitch);
643         } else {
644                 emu_wrptr(sc, v->vnum, PTRX_PITCHTARGET, 0);
645                 emu_wrptr(sc, v->vnum, CPF_CURRENTPITCH, 0);
646                 emu_wrptr(sc, v->vnum, IFATN, 0xffff);
647                 emu_wrptr(sc, v->vnum, VTFT, 0x0000ffff);
648                 emu_wrptr(sc, v->vnum, CVCF, 0x0000ffff);
649                 emu_wrptr(sc, v->vnum, IP, 0);
650                 emu_enastop(sc, v->vnum, 1);
651         }
652         if (v->slave != NULL)
653                 emu_vtrigger(sc, v->slave, go);
654 }
655
656 static int
657 emu_vpos(struct sc_info *sc, struct emu_voice *v)
658 {
659         int s, ptr;
660
661         s = (v->b16 ? 1 : 0) + (v->stereo ? 1 : 0);
662         ptr = (emu_rdptr(sc, v->vnum, CCCA_CURRADDR) - (v->start >> s)) << s;
663         return ptr & ~0x0000001f;
664 }
665
666 #ifdef EMUDEBUG
667 static void
668 emu_vdump(struct sc_info *sc, struct emu_voice *v)
669 {
670         char *regname[] = {
671                 "cpf", "ptrx", "cvcf", "vtft", "z2", "z1", "psst", "dsl",
672                 "ccca", "ccr", "clp", "fxrt", "mapa", "mapb", NULL, NULL,
673                 "envvol", "atkhldv", "dcysusv", "lfoval1",
674                 "envval", "atkhldm", "dcysusm", "lfoval2",
675                 "ip", "ifatn", "pefe", "fmmod", "tremfrq", "fmfrq2",
676                 "tempenv"
677         };
678         char *regname2[] = {
679                 "mudata1", "mustat1", "mudata2", "mustat2",
680                 "fxwc1", "fxwc2", "spdrate", NULL, NULL,
681                 NULL, NULL, NULL, "fxrt2", "sndamnt", "fxrt1",
682                 NULL, NULL
683         };
684         int i, x;
685
686         kprintf("voice number %d\n", v->vnum);
687         for (i = 0, x = 0; i <= 0x1e; i++) {
688                 if (regname[i] == NULL)
689                         continue;
690                 kprintf("%s\t[%08x]", regname[i], emu_rdptr(sc, v->vnum, i));
691                 kprintf("%s", (x == 2) ? "\n" : "\t");
692                 x++;
693                 if (x > 2)
694                         x = 0;
695         }
696
697         /* Print out audigy extra registers */
698         if (sc->audigy) {
699                 for (i = 0; i <= 0xe; i++) {
700                         if (regname2[i] == NULL)
701                                 continue;
702                         kprintf("%s\t[%08x]", regname2[i],
703                             emu_rdptr(sc, v->vnum, i + 0x70));
704                         kprintf("%s", (x == 2)? "\n" : "\t");
705                         x++;
706                         if (x > 2)
707                                 x = 0;
708                 }
709         }
710         kprintf("\n\n");
711 }
712 #endif
713
714 /* channel interface */
715 static void *
716 emupchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
717     struct pcm_channel *c, int dir)
718 {
719         struct sc_info *sc = devinfo;
720         struct sc_pchinfo *ch;
721         void *r;
722
723         KASSERT(dir == PCMDIR_PLAY, ("emupchan_init: bad direction"));
724         ch = &sc->pch[sc->pnum++];
725         ch->buffer = b;
726         ch->parent = sc;
727         ch->channel = c;
728         ch->blksz = sc->bufsz / 2;
729         ch->fmt = AFMT_U8;
730         ch->spd = 8000;
731         snd_mtxlock(sc->lock);
732         ch->master = emu_valloc(sc);
733         ch->slave = emu_valloc(sc);
734         snd_mtxunlock(sc->lock);
735         r = (emu_vinit(sc, ch->master, ch->slave, sc->bufsz, ch->buffer))
736             ? NULL : ch;
737
738         return r;
739 }
740
741 static int
742 emupchan_free(kobj_t obj, void *data)
743 {
744         struct sc_pchinfo *ch = data;
745         struct sc_info *sc = ch->parent;
746         int r;
747
748         snd_mtxlock(sc->lock);
749         r = emu_memfree(sc, sndbuf_getbuf(ch->buffer));
750         snd_mtxunlock(sc->lock);
751
752         return r;
753 }
754
755 static int
756 emupchan_setformat(kobj_t obj, void *data, u_int32_t format)
757 {
758         struct sc_pchinfo *ch = data;
759
760         ch->fmt = format;
761         return 0;
762 }
763
764 static int
765 emupchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
766 {
767         struct sc_pchinfo *ch = data;
768
769         ch->spd = speed;
770         return ch->spd;
771 }
772
773 static int
774 emupchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
775 {
776         struct sc_pchinfo *ch = data;
777         struct sc_info *sc = ch->parent;
778         int irqrate;
779
780         ch->blksz = blocksize;
781         snd_mtxlock(sc->lock);
782         emu_settimer(sc);
783         irqrate = 48000 / sc->timerinterval;
784         snd_mtxunlock(sc->lock);
785         return blocksize;
786 }
787
788 static int
789 emupchan_trigger(kobj_t obj, void *data, int go)
790 {
791         struct sc_pchinfo *ch = data;
792         struct sc_info *sc = ch->parent;
793
794         if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD)
795                 return 0;
796
797         snd_mtxlock(sc->lock);
798         if (go == PCMTRIG_START) {
799                 emu_vsetup(ch);
800                 emu_vwrite(sc, ch->master);
801                 emu_settimer(sc);
802                 emu_enatimer(sc, 1);
803 #ifdef EMUDEBUG
804                 kprintf("start [%d bit, %s, %d hz]\n",
805                         ch->master->b16 ? 16 : 8,
806                         ch->master->stereo ? "stereo" : "mono",
807                         ch->master->speed);
808                 emu_vdump(sc, ch->master);
809                 emu_vdump(sc, ch->slave);
810 #endif
811         }
812         ch->run = (go == PCMTRIG_START) ? 1 : 0;
813         emu_vtrigger(sc, ch->master, ch->run);
814         snd_mtxunlock(sc->lock);
815         return 0;
816 }
817
818 static int
819 emupchan_getptr(kobj_t obj, void *data)
820 {
821         struct sc_pchinfo *ch = data;
822         struct sc_info *sc = ch->parent;
823         int r;
824
825         snd_mtxlock(sc->lock);
826         r = emu_vpos(sc, ch->master);
827         snd_mtxunlock(sc->lock);
828
829         return r;
830 }
831
832 static struct pcmchan_caps *
833 emupchan_getcaps(kobj_t obj, void *data)
834 {
835         return &emu_playcaps;
836 }
837
838 static kobj_method_t emupchan_methods[] = {
839         KOBJMETHOD(channel_init,                emupchan_init),
840         KOBJMETHOD(channel_free,                emupchan_free),
841         KOBJMETHOD(channel_setformat,           emupchan_setformat),
842         KOBJMETHOD(channel_setspeed,            emupchan_setspeed),
843         KOBJMETHOD(channel_setblocksize,        emupchan_setblocksize),
844         KOBJMETHOD(channel_trigger,             emupchan_trigger),
845         KOBJMETHOD(channel_getptr,              emupchan_getptr),
846         KOBJMETHOD(channel_getcaps,             emupchan_getcaps),
847         KOBJMETHOD_END
848 };
849 CHANNEL_DECLARE(emupchan);
850
851 /* channel interface */
852 static void *
853 emurchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
854     struct pcm_channel *c, int dir)
855 {
856         struct sc_info *sc = devinfo;
857         struct sc_rchinfo *ch;
858
859         KASSERT(dir == PCMDIR_REC, ("emurchan_init: bad direction"));
860         ch = &sc->rch[sc->rnum];
861         ch->buffer = b;
862         ch->parent = sc;
863         ch->channel = c;
864         ch->blksz = sc->bufsz / 2;
865         ch->fmt = AFMT_U8;
866         ch->spd = 8000;
867         ch->num = sc->rnum;
868         switch(sc->rnum) {
869         case 0:
870                 ch->idxreg = sc->audigy ? A_ADCIDX : ADCIDX;
871                 ch->basereg = ADCBA;
872                 ch->sizereg = ADCBS;
873                 ch->setupreg = ADCCR;
874                 ch->irqmask = INTE_ADCBUFENABLE;
875                 break;
876
877         case 1:
878                 ch->idxreg = FXIDX;
879                 ch->basereg = FXBA;
880                 ch->sizereg = FXBS;
881                 ch->setupreg = FXWC;
882                 ch->irqmask = INTE_EFXBUFENABLE;
883                 break;
884
885         case 2:
886                 ch->idxreg = MICIDX;
887                 ch->basereg = MICBA;
888                 ch->sizereg = MICBS;
889                 ch->setupreg = 0;
890                 ch->irqmask = INTE_MICBUFENABLE;
891                 break;
892         }
893         sc->rnum++;
894         if (sndbuf_alloc(ch->buffer, sc->parent_dmat, sc->bufsz) != 0)
895                 return NULL;
896         else {
897                 snd_mtxlock(sc->lock);
898                 emu_wrptr(sc, 0, ch->basereg, sndbuf_getbufaddr(ch->buffer));
899                 emu_wrptr(sc, 0, ch->sizereg, 0); /* off */
900                 snd_mtxunlock(sc->lock);
901                 return ch;
902         }
903 }
904
905 static int
906 emurchan_setformat(kobj_t obj, void *data, u_int32_t format)
907 {
908         struct sc_rchinfo *ch = data;
909
910         ch->fmt = format;
911         return 0;
912 }
913
914 static int
915 emurchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
916 {
917         struct sc_rchinfo *ch = data;
918
919         if (ch->num == 0) {
920                 if (ch->parent->audigy)
921                         speed = audigy_adcspeed[audigy_recval(speed)];
922                 else
923                         speed = adcspeed[emu_recval(speed)];
924         }
925         if (ch->num == 1)
926                 speed = 48000;
927         if (ch->num == 2)
928                 speed = 8000;
929         ch->spd = speed;
930         return ch->spd;
931 }
932
933 static int
934 emurchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
935 {
936         struct sc_rchinfo *ch = data;
937         struct sc_info *sc = ch->parent;
938         int irqrate;
939
940         ch->blksz = blocksize;
941         snd_mtxlock(sc->lock);
942         emu_settimer(sc);
943         irqrate = 48000 / sc->timerinterval;
944         snd_mtxunlock(sc->lock);
945         return blocksize;
946 }
947
948 /* semantic note: must start at beginning of buffer */
949 static int
950 emurchan_trigger(kobj_t obj, void *data, int go)
951 {
952         struct sc_rchinfo *ch = data;
953         struct sc_info *sc = ch->parent;
954         u_int32_t val, sz;
955
956         switch(sc->bufsz) {
957         case 4096:
958                 sz = ADCBS_BUFSIZE_4096;
959                 break;
960
961         case 8192:
962                 sz = ADCBS_BUFSIZE_8192;
963                 break;
964
965         case 16384:
966                 sz = ADCBS_BUFSIZE_16384;
967                 break;
968
969         case 32768:
970                 sz = ADCBS_BUFSIZE_32768;
971                 break;
972
973         case 65536:
974                 sz = ADCBS_BUFSIZE_65536;
975                 break;
976
977         default:
978                 sz = ADCBS_BUFSIZE_4096;
979         }
980
981         snd_mtxlock(sc->lock);
982         switch(go) {
983         case PCMTRIG_START:
984                 ch->run = 1;
985                 emu_wrptr(sc, 0, ch->sizereg, sz);
986                 if (ch->num == 0) {
987                         if (sc->audigy) {
988                                 val = A_ADCCR_LCHANENABLE;
989                                 if (ch->fmt & AFMT_STEREO)
990                                         val |= A_ADCCR_RCHANENABLE;
991                                 val |= audigy_recval(ch->spd);
992                         } else {
993                                 val = ADCCR_LCHANENABLE;
994                                 if (ch->fmt & AFMT_STEREO)
995                                         val |= ADCCR_RCHANENABLE;
996                                 val |= emu_recval(ch->spd);
997                         }
998
999                         emu_wrptr(sc, 0, ch->setupreg, 0);
1000                         emu_wrptr(sc, 0, ch->setupreg, val);
1001                 }
1002                 val = emu_rd(sc, INTE, 4);
1003                 val |= ch->irqmask;
1004                 emu_wr(sc, INTE, val, 4);
1005                 break;
1006
1007         case PCMTRIG_STOP:
1008         case PCMTRIG_ABORT:
1009                 ch->run = 0;
1010                 emu_wrptr(sc, 0, ch->sizereg, 0);
1011                 if (ch->setupreg)
1012                         emu_wrptr(sc, 0, ch->setupreg, 0);
1013                 val = emu_rd(sc, INTE, 4);
1014                 val &= ~ch->irqmask;
1015                 emu_wr(sc, INTE, val, 4);
1016                 break;
1017
1018         case PCMTRIG_EMLDMAWR:
1019         case PCMTRIG_EMLDMARD:
1020         default:
1021                 break;
1022         }
1023         snd_mtxunlock(sc->lock);
1024
1025         return 0;
1026 }
1027
1028 static int
1029 emurchan_getptr(kobj_t obj, void *data)
1030 {
1031         struct sc_rchinfo *ch = data;
1032         struct sc_info *sc = ch->parent;
1033         int r;
1034
1035         snd_mtxlock(sc->lock);
1036         r = emu_rdptr(sc, 0, ch->idxreg) & 0x0000ffff;
1037         snd_mtxunlock(sc->lock);
1038
1039         return r;
1040 }
1041
1042 static struct pcmchan_caps *
1043 emurchan_getcaps(kobj_t obj, void *data)
1044 {
1045         struct sc_rchinfo *ch = data;
1046
1047         return &emu_reccaps[ch->num];
1048 }
1049
1050 static kobj_method_t emurchan_methods[] = {
1051         KOBJMETHOD(channel_init,                emurchan_init),
1052         KOBJMETHOD(channel_setformat,           emurchan_setformat),
1053         KOBJMETHOD(channel_setspeed,            emurchan_setspeed),
1054         KOBJMETHOD(channel_setblocksize,        emurchan_setblocksize),
1055         KOBJMETHOD(channel_trigger,             emurchan_trigger),
1056         KOBJMETHOD(channel_getptr,              emurchan_getptr),
1057         KOBJMETHOD(channel_getcaps,             emurchan_getcaps),
1058         KOBJMETHOD_END
1059 };
1060 CHANNEL_DECLARE(emurchan);
1061
1062 /* -------------------------------------------------------------------- */
1063 /* The interrupt handler */
1064 static void
1065 emu_intr(void *data)
1066 {
1067         struct sc_info *sc = data;
1068         u_int32_t stat, ack, i, x;
1069
1070         snd_mtxlock(sc->lock);
1071         while (1) {
1072                 stat = emu_rd(sc, IPR, 4);
1073                 if (stat == 0)
1074                         break;
1075                 ack = 0;
1076
1077                 /* process irq */
1078                 if (stat & IPR_INTERVALTIMER)
1079                         ack |= IPR_INTERVALTIMER;
1080
1081                 if (stat & (IPR_ADCBUFFULL | IPR_ADCBUFHALFFULL))
1082                         ack |= stat & (IPR_ADCBUFFULL | IPR_ADCBUFHALFFULL);
1083
1084                 if (stat & (IPR_EFXBUFFULL | IPR_EFXBUFHALFFULL))
1085                         ack |= stat & (IPR_EFXBUFFULL | IPR_EFXBUFHALFFULL);
1086
1087                 if (stat & (IPR_MICBUFFULL | IPR_MICBUFHALFFULL))
1088                         ack |= stat & (IPR_MICBUFFULL | IPR_MICBUFHALFFULL);
1089
1090                 if (stat & IPR_PCIERROR) {
1091                         ack |= IPR_PCIERROR;
1092                         device_printf(sc->dev, "pci error\n");
1093                         /* we still get an nmi with ecc ram even if we ack this */
1094                 }
1095                 if (stat & IPR_SAMPLERATETRACKER) {
1096                         ack |= IPR_SAMPLERATETRACKER;
1097 #ifdef EMUDEBUG
1098                         device_printf(sc->dev,
1099                             "sample rate tracker lock status change\n");
1100 #endif
1101                 }
1102
1103                 if (stat & ~ack)
1104                         device_printf(sc->dev, "dodgy irq: %x (harmless)\n",
1105                             stat & ~ack);
1106
1107                 emu_wr(sc, IPR, stat, 4);
1108
1109                 if (ack) {
1110                         snd_mtxunlock(sc->lock);
1111
1112                         if (ack & IPR_INTERVALTIMER) {
1113                                 x = 0;
1114                                 for (i = 0; i < sc->nchans; i++) {
1115                                         if (sc->pch[i].run) {
1116                                                 x = 1;
1117                                                 chn_intr(sc->pch[i].channel);
1118                                         }
1119                                 }
1120                                 if (x == 0)
1121                                         emu_enatimer(sc, 0);
1122                         }
1123
1124
1125                         if (ack & (IPR_ADCBUFFULL | IPR_ADCBUFHALFFULL)) {
1126                                 if (sc->rch[0].channel)
1127                                         chn_intr(sc->rch[0].channel);
1128                         }
1129                         if (ack & (IPR_EFXBUFFULL | IPR_EFXBUFHALFFULL)) {
1130                                 if (sc->rch[1].channel)
1131                                         chn_intr(sc->rch[1].channel);
1132                         }
1133                         if (ack & (IPR_MICBUFFULL | IPR_MICBUFHALFFULL)) {
1134                                 if (sc->rch[2].channel)
1135                                         chn_intr(sc->rch[2].channel);
1136                         }
1137
1138                         snd_mtxlock(sc->lock);
1139                 }
1140         }
1141         snd_mtxunlock(sc->lock);
1142 }
1143
1144 /* -------------------------------------------------------------------- */
1145
1146 static void
1147 emu_setmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
1148 {
1149         bus_addr_t *phys = arg;
1150
1151         *phys = error ? 0 : (bus_addr_t)segs->ds_addr;
1152
1153         if (bootverbose) {
1154                 kprintf("emu: setmap (%lx, %lx), nseg=%d, error=%d\n",
1155                     (unsigned long)segs->ds_addr, (unsigned long)segs->ds_len,
1156                     nseg, error);
1157         }
1158 }
1159
1160 static void *
1161 emu_malloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr)
1162 {
1163         void *buf;
1164         bus_dmamap_t map;
1165
1166         *addr = 0;
1167         if (bus_dmamem_alloc(sc->parent_dmat, &buf, BUS_DMA_NOWAIT, &map))
1168                 return NULL;
1169         if (bus_dmamap_load(sc->parent_dmat, map, buf, sz, emu_setmap, addr, 0)
1170             || !*addr)
1171                 return NULL;
1172         return buf;
1173 }
1174
1175 static void
1176 emu_free(struct sc_info *sc, void *buf)
1177 {
1178         bus_dmamem_free(sc->parent_dmat, buf, NULL);
1179 }
1180
1181 static void *
1182 emu_memalloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr)
1183 {
1184         u_int32_t blksz, start, idx, ofs, tmp, found;
1185         struct emu_mem *mem = &sc->mem;
1186         struct emu_memblk *blk;
1187         void *buf;
1188
1189         blksz = sz / EMUPAGESIZE;
1190         if (sz > (blksz * EMUPAGESIZE))
1191                 blksz++;
1192         /* find a kfree block in the bitmap */
1193         found = 0;
1194         start = 1;
1195         while (!found && start + blksz < EMUMAXPAGES) {
1196                 found = 1;
1197                 for (idx = start; idx < start + blksz; idx++)
1198                         if (mem->bmap[idx >> 3] & (1 << (idx & 7)))
1199                                 found = 0;
1200                 if (!found)
1201                         start++;
1202         }
1203         if (!found)
1204                 return NULL;
1205         blk = kmalloc(sizeof(*blk), M_DEVBUF, M_WAITOK);
1206         buf = emu_malloc(sc, sz, &blk->buf_addr);
1207         *addr = blk->buf_addr;
1208         if (buf == NULL) {
1209                 kfree(blk, M_DEVBUF);
1210                 return NULL;
1211         }
1212         blk->buf = buf;
1213         blk->pte_start = start;
1214         blk->pte_size = blksz;
1215 #ifdef EMUDEBUG
1216         kprintf("buf %p, pte_start %d, pte_size %d\n", blk->buf,
1217             blk->pte_start, blk->pte_size);
1218 #endif
1219         ofs = 0;
1220         for (idx = start; idx < start + blksz; idx++) {
1221                 mem->bmap[idx >> 3] |= 1 << (idx & 7);
1222                 tmp = (u_int32_t)(u_long)((u_int8_t *)blk->buf_addr + ofs);
1223 #ifdef EMUDEBUG
1224                 kprintf("pte[%d] -> %x phys, %x virt\n", idx, tmp,
1225                     ((u_int32_t)buf) + ofs);
1226 #endif
1227                 mem->ptb_pages[idx] = (tmp << 1) | idx;
1228                 ofs += EMUPAGESIZE;
1229         }
1230         SLIST_INSERT_HEAD(&mem->blocks, blk, link);
1231         return buf;
1232 }
1233
1234 static int
1235 emu_memfree(struct sc_info *sc, void *buf)
1236 {
1237         u_int32_t idx, tmp;
1238         struct emu_mem *mem = &sc->mem;
1239         struct emu_memblk *blk, *i;
1240
1241         blk = NULL;
1242         SLIST_FOREACH(i, &mem->blocks, link) {
1243                 if (i->buf == buf)
1244                         blk = i;
1245         }
1246         if (blk == NULL)
1247                 return EINVAL;
1248         SLIST_REMOVE(&mem->blocks, blk, emu_memblk, link);
1249         emu_free(sc, buf);
1250         tmp = (u_int32_t)(sc->mem.silent_page_addr) << 1;
1251         for (idx = blk->pte_start; idx < blk->pte_start + blk->pte_size; idx++) {
1252                 mem->bmap[idx >> 3] &= ~(1 << (idx & 7));
1253                 mem->ptb_pages[idx] = tmp | idx;
1254         }
1255         kfree(blk, M_DEVBUF);
1256         return 0;
1257 }
1258
1259 static int
1260 emu_memstart(struct sc_info *sc, void *buf)
1261 {
1262         struct emu_mem *mem = &sc->mem;
1263         struct emu_memblk *blk, *i;
1264
1265         blk = NULL;
1266         SLIST_FOREACH(i, &mem->blocks, link) {
1267                 if (i->buf == buf)
1268                         blk = i;
1269         }
1270         if (blk == NULL)
1271                 return -EINVAL;
1272         return blk->pte_start;
1273 }
1274
1275 static void
1276 emu_addefxop(struct sc_info *sc, int op, int z, int w, int x, int y,
1277     u_int32_t *pc)
1278 {
1279         emu_wrefx(sc, (*pc) * 2, (x << 10) | y);
1280         emu_wrefx(sc, (*pc) * 2 + 1, (op << 20) | (z << 10) | w);
1281         (*pc)++;
1282 }
1283
1284 static void
1285 audigy_addefxop(struct sc_info *sc, int op, int z, int w, int x, int y,
1286     u_int32_t *pc)
1287 {
1288         emu_wrefx(sc, (*pc) * 2, (x << 12) | y);
1289         emu_wrefx(sc, (*pc) * 2 + 1, (op << 24) | (z << 12) | w);
1290         (*pc)++;
1291 }
1292
1293 static void
1294 audigy_initefx(struct sc_info *sc)
1295 {
1296         int i;
1297         u_int32_t pc = 0;
1298
1299         /* skip 0, 0, -1, 0 - NOPs */
1300         for (i = 0; i < 512; i++)
1301                 audigy_addefxop(sc, 0x0f, 0x0c0, 0x0c0, 0x0cf, 0x0c0, &pc);
1302
1303         for (i = 0; i < 512; i++)
1304                 emu_wrptr(sc, 0, A_FXGPREGBASE + i, 0x0);
1305
1306         pc = 16;
1307
1308         /* stop fx processor */
1309         emu_wrptr(sc, 0, A_DBG, A_DBG_SINGLE_STEP);
1310
1311         /* Audigy 2 (EMU10K2) DSP Registers:
1312            FX Bus
1313                 0x000-0x00f : 16 registers (???)
1314            Input
1315                 0x040/0x041 : AC97 Codec (l/r)
1316                 0x042/0x043 : ADC, S/PDIF (l/r)
1317                 0x044/0x045 : Optical S/PDIF in (l/r)
1318                 0x046/0x047 : ???
1319                 0x048/0x049 : Line/Mic 2 (l/r)
1320                 0x04a/0x04b : RCA S/PDIF (l/r)
1321                 0x04c/0x04d : Aux 2 (l/r)
1322            Output
1323                 0x060/0x061 : Digital Front (l/r)
1324                 0x062/0x063 : Digital Center/LFE
1325                 0x064/0x065 : AudigyDrive Heaphone (l/r)
1326                 0x066/0x067 : Digital Rear (l/r)
1327                 0x068/0x069 : Analog Front (l/r)
1328                 0x06a/0x06b : Analog Center/LFE
1329                 0x06c/0x06d : ???
1330                 0x06e/0x06f : Analog Rear (l/r)
1331                 0x070/0x071 : AC97 Output (l/r)
1332                 0x072/0x073 : ???
1333                 0x074/0x075 : ???
1334                 0x076/0x077 : ADC Recording Buffer (l/r)
1335            Constants
1336                 0x0c0 - 0x0c4 = 0 - 4
1337                 0x0c5 = 0x8, 0x0c6 = 0x10, 0x0c7 = 0x20
1338                 0x0c8 = 0x100, 0x0c9 = 0x10000, 0x0ca = 0x80000
1339                 0x0cb = 0x10000000, 0x0cc = 0x20000000, 0x0cd = 0x40000000
1340                 0x0ce = 0x80000000, 0x0cf = 0x7fffffff, 0x0d0 = 0xffffffff
1341                 0x0d1 = 0xfffffffe, 0x0d2 = 0xc0000000, 0x0d3 = 0x41fbbcdc
1342                 0x0d4 = 0x5a7ef9db, 0x0d5 = 0x00100000, 0x0dc = 0x00000001 (???)
1343            Temporary Values
1344                 0x0d6 : Accumulator (???)
1345                 0x0d7 : Condition Register
1346                 0x0d8 : Noise source
1347                 0x0d9 : Noise source
1348            Tank Memory Data Registers
1349                 0x200 - 0x2ff
1350            Tank Memory Address Registers
1351                 0x300 - 0x3ff
1352            General Purpose Registers
1353                 0x400 - 0x5ff
1354          */
1355
1356         /* AC97Output[l/r] = FXBus PCM[l/r] */
1357         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AC97_L), A_C_00000000,
1358                         A_C_00000000, A_FXBUS(FXBUS_PCM_LEFT), &pc);
1359         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AC97_R), A_C_00000000,
1360                         A_C_00000000, A_FXBUS(FXBUS_PCM_RIGHT), &pc);
1361
1362         /* GPR[0/1] = RCA S/PDIF[l/r] -- Master volume */
1363         audigy_addefxop(sc, iACC3, A_GPR(0), A_C_00000000,
1364                         A_C_00000000, A_EXTIN(EXTIN_COAX_SPDIF_L), &pc);
1365         audigy_addefxop(sc, iACC3, A_GPR(1), A_C_00000000,
1366                         A_C_00000000, A_EXTIN(EXTIN_COAX_SPDIF_R), &pc);
1367
1368         /* GPR[2] = GPR[0] (Left) / 2 + GPR[1] (Right) / 2 -- Central volume */
1369         audigy_addefxop(sc, iINTERP, A_GPR(2), A_GPR(1),
1370                         A_C_40000000, A_GPR(0), &pc);
1371
1372         /* Headphones[l/r] = GPR[0/1] */
1373         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_HEADPHONE_L),
1374                         A_C_00000000, A_C_00000000, A_GPR(0), &pc);
1375         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_HEADPHONE_R),
1376                         A_C_00000000, A_C_00000000, A_GPR(1), &pc);
1377
1378         /* Analog Front[l/r] = GPR[0/1] */
1379         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AFRONT_L), A_C_00000000,
1380                         A_C_00000000, A_GPR(0), &pc);
1381         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AFRONT_R), A_C_00000000,
1382                         A_C_00000000, A_GPR(1), &pc);
1383
1384         /* Digital Front[l/r] = GPR[0/1] */
1385         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L), A_C_00000000,
1386                         A_C_00000000, A_GPR(0), &pc);
1387         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_FRONT_R), A_C_00000000,
1388                         A_C_00000000, A_GPR(1), &pc);
1389
1390         /* Center and Subwoofer configuration */
1391         /* Analog Center = GPR[0] + GPR[2] */
1392         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_ACENTER), A_C_00000000,
1393                         A_GPR(0), A_GPR(2), &pc);
1394         /* Analog Sub = GPR[1] + GPR[2] */
1395         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_ALFE), A_C_00000000,
1396                         A_GPR(1), A_GPR(2), &pc);
1397
1398         /* Digital Center = GPR[0] + GPR[2] */
1399         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_CENTER), A_C_00000000,
1400                         A_GPR(0), A_GPR(2), &pc);
1401         /* Digital Sub = GPR[1] + GPR[2] */
1402         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_LFE), A_C_00000000,
1403                         A_GPR(1), A_GPR(2), &pc);
1404
1405 #if 0
1406         /* Analog Rear[l/r] = (GPR[0/1] * RearVolume[l/r]) >> 31 */
1407         /*   RearVolume = GPR[0x10/0x11] (Will this ever be implemented?) */
1408         audigy_addefxop(sc, iMAC0, A_EXTOUT(A_EXTOUT_AREAR_L), A_C_00000000,
1409                         A_GPR(16), A_GPR(0), &pc);
1410         audigy_addefxop(sc, iMAC0, A_EXTOUT(A_EXTOUT_AREAR_R), A_C_00000000,
1411                         A_GPR(17), A_GPR(1), &pc);
1412
1413         /* Digital Rear[l/r] = (GPR[0/1] * RearVolume[l/r]) >> 31 */
1414         /*   RearVolume = GPR[0x10/0x11] (Will this ever be implemented?) */
1415         audigy_addefxop(sc, iMAC0, A_EXTOUT(A_EXTOUT_REAR_L), A_C_00000000,
1416                         A_GPR(16), A_GPR(0), &pc);
1417         audigy_addefxop(sc, iMAC0, A_EXTOUT(A_EXTOUT_REAR_R), A_C_00000000,
1418                         A_GPR(17), A_GPR(1), &pc);
1419 #else
1420         /* XXX This is just a copy to the channel, since we do not have
1421          *     a patch manager, it is useful for have another output enabled.
1422          */
1423
1424         /* Analog Rear[l/r] = GPR[0/1] */
1425         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AREAR_L), A_C_00000000,
1426                         A_C_00000000, A_GPR(0), &pc);
1427         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AREAR_R), A_C_00000000,
1428                         A_C_00000000, A_GPR(1), &pc);
1429
1430         /* Digital Rear[l/r] = GPR[0/1] */
1431         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_REAR_L), A_C_00000000,
1432                         A_C_00000000, A_GPR(0), &pc);
1433         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_REAR_R), A_C_00000000,
1434                         A_C_00000000, A_GPR(1), &pc);
1435 #endif
1436
1437         /* ADC Recording buffer[l/r] = AC97Input[l/r] */
1438         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_ADC_CAP_L), A_C_00000000,
1439                         A_C_00000000, A_EXTIN(A_EXTIN_AC97_L), &pc);
1440         audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_ADC_CAP_R), A_C_00000000,
1441                         A_C_00000000, A_EXTIN(A_EXTIN_AC97_R), &pc);
1442
1443         /* resume normal operations */
1444         emu_wrptr(sc, 0, A_DBG, 0);
1445 }
1446
1447 static void
1448 emu_initefx(struct sc_info *sc)
1449 {
1450         int i;
1451         u_int32_t pc = 16;
1452
1453         /* acc3 0,0,0,0 - NOPs */
1454         for (i = 0; i < 512; i++) {
1455                 emu_wrefx(sc, i * 2, 0x10040);
1456                 emu_wrefx(sc, i * 2 + 1, 0x610040);
1457         }
1458
1459         for (i = 0; i < 256; i++)
1460                 emu_wrptr(sc, 0, FXGPREGBASE + i, 0);
1461
1462         /* FX-8010 DSP Registers:
1463            FX Bus
1464              0x000-0x00f : 16 registers
1465            Input
1466              0x010/0x011 : AC97 Codec (l/r)
1467              0x012/0x013 : ADC, S/PDIF (l/r)
1468              0x014/0x015 : Mic(left), Zoom (l/r)
1469              0x016/0x017 : TOS link in (l/r)
1470              0x018/0x019 : Line/Mic 1 (l/r)
1471              0x01a/0x01b : COAX S/PDIF (l/r)
1472              0x01c/0x01d : Line/Mic 2 (l/r)
1473            Output
1474              0x020/0x021 : AC97 Output (l/r)
1475              0x022/0x023 : TOS link out (l/r)
1476              0x024/0x025 : Center/LFE
1477              0x026/0x027 : LiveDrive Headphone (l/r)
1478              0x028/0x029 : Rear Channel (l/r)
1479              0x02a/0x02b : ADC Recording Buffer (l/r)
1480              0x02c       : Mic Recording Buffer
1481              0x031/0x032 : Analog Center/LFE
1482            Constants
1483              0x040 - 0x044 = 0 - 4
1484              0x045 = 0x8, 0x046 = 0x10, 0x047 = 0x20
1485              0x048 = 0x100, 0x049 = 0x10000, 0x04a = 0x80000
1486              0x04b = 0x10000000, 0x04c = 0x20000000, 0x04d = 0x40000000
1487              0x04e = 0x80000000, 0x04f = 0x7fffffff, 0x050 = 0xffffffff
1488              0x051 = 0xfffffffe, 0x052 = 0xc0000000, 0x053 = 0x41fbbcdc
1489              0x054 = 0x5a7ef9db, 0x055 = 0x00100000
1490            Temporary Values
1491              0x056 : Accumulator
1492              0x057 : Condition Register
1493              0x058 : Noise source
1494              0x059 : Noise source
1495              0x05a : IRQ Register
1496              0x05b : TRAM Delay Base Address Count
1497            General Purpose Registers
1498              0x100 - 0x1ff
1499            Tank Memory Data Registers
1500              0x200 - 0x2ff
1501            Tank Memory Address Registers
1502              0x300 - 0x3ff
1503              */
1504
1505         /* Routing - this will be configurable in later version */
1506
1507         /* GPR[0/1] = FX * 4 + SPDIF-in */
1508         emu_addefxop(sc, iMACINT0, GPR(0), EXTIN(EXTIN_SPDIF_CD_L),
1509                         FXBUS(FXBUS_PCM_LEFT), C_00000004, &pc);
1510         emu_addefxop(sc, iMACINT0, GPR(1), EXTIN(EXTIN_SPDIF_CD_R),
1511                         FXBUS(FXBUS_PCM_RIGHT), C_00000004, &pc);
1512
1513         /* GPR[0/1] += APS-input */
1514         emu_addefxop(sc, iACC3, GPR(0), GPR(0), C_00000000,
1515                         sc->APS ? EXTIN(EXTIN_TOSLINK_L) : C_00000000, &pc);
1516         emu_addefxop(sc, iACC3, GPR(1), GPR(1), C_00000000,
1517                         sc->APS ? EXTIN(EXTIN_TOSLINK_R) : C_00000000, &pc);
1518
1519         /* FrontOut (AC97) = GPR[0/1] */
1520         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_AC97_L), C_00000000,
1521                         C_00000000, GPR(0), &pc);
1522         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_AC97_R), C_00000000,
1523                         C_00000001, GPR(1), &pc);
1524
1525         /* GPR[2] = GPR[0] (Left) / 2 + GPR[1] (Right) / 2 -- Central volume */
1526         emu_addefxop(sc, iINTERP, GPR(2), GPR(1), C_40000000, GPR(0), &pc);
1527
1528 #if 0
1529         /* RearOut = (GPR[0/1] * RearVolume) >> 31 */
1530         /*   RearVolume = GPR[0x10/0x11] */
1531         emu_addefxop(sc, iMAC0, EXTOUT(EXTOUT_REAR_L), C_00000000,
1532                         GPR(16), GPR(0), &pc);
1533         emu_addefxop(sc, iMAC0, EXTOUT(EXTOUT_REAR_R), C_00000000,
1534                         GPR(17), GPR(1), &pc);
1535 #else
1536         /* XXX This is just a copy to the channel, since we do not have
1537          *     a patch manager, it is useful for have another output enabled.
1538          */
1539
1540         /* Rear[l/r] = GPR[0/1] */
1541         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_REAR_L), C_00000000,
1542                         C_00000000, GPR(0), &pc);
1543         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_REAR_R), C_00000000,
1544                         C_00000000, GPR(1), &pc);
1545 #endif
1546
1547         /* TOS out[l/r] = GPR[0/1] */
1548         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_TOSLINK_L), C_00000000,
1549                         C_00000000, GPR(0), &pc);
1550         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_TOSLINK_R), C_00000000,
1551                         C_00000000, GPR(1), &pc);
1552
1553         /* Center and Subwoofer configuration */
1554         /* Analog Center = GPR[0] + GPR[2] */
1555         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_ACENTER), C_00000000,
1556                         GPR(0), GPR(2), &pc);
1557         /* Analog Sub = GPR[1] + GPR[2] */
1558         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_ALFE), C_00000000,
1559                         GPR(1), GPR(2), &pc);
1560         /* Digital Center = GPR[0] + GPR[2] */
1561         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_CENTER), C_00000000,
1562                         GPR(0), GPR(2), &pc);
1563         /* Digital Sub = GPR[1] + GPR[2] */
1564         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_LFE), C_00000000,
1565                         GPR(1), GPR(2), &pc);
1566
1567         /* Headphones[l/r] = GPR[0/1] */
1568         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_HEADPHONE_L), C_00000000,
1569                         C_00000000, GPR(0), &pc);
1570         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_HEADPHONE_R), C_00000000,
1571                         C_00000000, GPR(1), &pc);
1572
1573         /* ADC Recording buffer[l/r] = AC97Input[l/r] */
1574         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_ADC_CAP_L), C_00000000,
1575                         C_00000000, EXTIN(EXTIN_AC97_L), &pc);
1576         emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_ADC_CAP_R), C_00000000,
1577                         C_00000000, EXTIN(EXTIN_AC97_R), &pc);
1578
1579         /* resume normal operations */
1580         emu_wrptr(sc, 0, DBG, 0);
1581 }
1582
1583 /* Probe and attach the card */
1584 static int
1585 emu_init(struct sc_info *sc)
1586 {
1587         u_int32_t spcs, ch, tmp, i;
1588
1589         if (sc->audigy) {
1590                 /* enable additional AC97 slots */
1591                 emu_wrptr(sc, 0, AC97SLOT, AC97SLOT_CNTR | AC97SLOT_LFE);
1592         }
1593
1594         /* disable audio and lock cache */
1595         emu_wr(sc, HCFG,
1596             HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE,
1597             4);
1598
1599         /* reset recording buffers */
1600         emu_wrptr(sc, 0, MICBS, ADCBS_BUFSIZE_NONE);
1601         emu_wrptr(sc, 0, MICBA, 0);
1602         emu_wrptr(sc, 0, FXBS, ADCBS_BUFSIZE_NONE);
1603         emu_wrptr(sc, 0, FXBA, 0);
1604         emu_wrptr(sc, 0, ADCBS, ADCBS_BUFSIZE_NONE);
1605         emu_wrptr(sc, 0, ADCBA, 0);
1606
1607         /* disable channel interrupt */
1608         emu_wr(sc, INTE,
1609             INTE_INTERVALTIMERENB | INTE_SAMPLERATETRACKER | INTE_PCIERRORENABLE,
1610             4);
1611         emu_wrptr(sc, 0, CLIEL, 0);
1612         emu_wrptr(sc, 0, CLIEH, 0);
1613         emu_wrptr(sc, 0, SOLEL, 0);
1614         emu_wrptr(sc, 0, SOLEH, 0);
1615
1616         /* wonder what these do... */
1617         if (sc->audigy) {
1618                 emu_wrptr(sc, 0, SPBYPASS, 0xf00);
1619                 emu_wrptr(sc, 0, AC97SLOT, 0x3);
1620         }
1621
1622         /* init envelope engine */
1623         for (ch = 0; ch < NUM_G; ch++) {
1624                 emu_wrptr(sc, ch, DCYSUSV, ENV_OFF);
1625                 emu_wrptr(sc, ch, IP, 0);
1626                 emu_wrptr(sc, ch, VTFT, 0xffff);
1627                 emu_wrptr(sc, ch, CVCF, 0xffff);
1628                 emu_wrptr(sc, ch, PTRX, 0);
1629                 emu_wrptr(sc, ch, CPF, 0);
1630                 emu_wrptr(sc, ch, CCR, 0);
1631
1632                 emu_wrptr(sc, ch, PSST, 0);
1633                 emu_wrptr(sc, ch, DSL, 0x10);
1634                 emu_wrptr(sc, ch, CCCA, 0);
1635                 emu_wrptr(sc, ch, Z1, 0);
1636                 emu_wrptr(sc, ch, Z2, 0);
1637                 emu_wrptr(sc, ch, FXRT, 0xd01c0000);
1638
1639                 emu_wrptr(sc, ch, ATKHLDM, 0);
1640                 emu_wrptr(sc, ch, DCYSUSM, 0);
1641                 emu_wrptr(sc, ch, IFATN, 0xffff);
1642                 emu_wrptr(sc, ch, PEFE, 0);
1643                 emu_wrptr(sc, ch, FMMOD, 0);
1644                 emu_wrptr(sc, ch, TREMFRQ, 24); /* 1 Hz */
1645                 emu_wrptr(sc, ch, FM2FRQ2, 24); /* 1 Hz */
1646                 emu_wrptr(sc, ch, TEMPENV, 0);
1647
1648                 /*** these are last so OFF prevents writing ***/
1649                 emu_wrptr(sc, ch, LFOVAL2, 0);
1650                 emu_wrptr(sc, ch, LFOVAL1, 0);
1651                 emu_wrptr(sc, ch, ATKHLDV, 0);
1652                 emu_wrptr(sc, ch, ENVVOL, 0);
1653                 emu_wrptr(sc, ch, ENVVAL, 0);
1654
1655                 if (sc->audigy) {
1656                         /* audigy cards need this to initialize correctly */
1657                         emu_wrptr(sc, ch, 0x4c, 0);
1658                         emu_wrptr(sc, ch, 0x4d, 0);
1659                         emu_wrptr(sc, ch, 0x4e, 0);
1660                         emu_wrptr(sc, ch, 0x4f, 0);
1661                         /* set default routing */
1662                         emu_wrptr(sc, ch, A_FXRT1, 0x03020100);
1663                         emu_wrptr(sc, ch, A_FXRT2, 0x3f3f3f3f);
1664                         emu_wrptr(sc, ch, A_SENDAMOUNTS, 0);
1665                 }
1666
1667                 sc->voice[ch].vnum = ch;
1668                 sc->voice[ch].slave = NULL;
1669                 sc->voice[ch].busy = 0;
1670                 sc->voice[ch].ismaster = 0;
1671                 sc->voice[ch].running = 0;
1672                 sc->voice[ch].b16 = 0;
1673                 sc->voice[ch].stereo = 0;
1674                 sc->voice[ch].speed = 0;
1675                 sc->voice[ch].start = 0;
1676                 sc->voice[ch].end = 0;
1677                 sc->voice[ch].channel = NULL;
1678         }
1679         sc->pnum = sc->rnum = 0;
1680
1681         /*
1682          *  Init to 0x02109204 :
1683          *  Clock accuracy    = 0     (1000ppm)
1684          *  Sample Rate       = 2     (48kHz)
1685          *  Audio Channel     = 1     (Left of 2)
1686          *  Source Number     = 0     (Unspecified)
1687          *  Generation Status = 1     (Original for Cat Code 12)
1688          *  Cat Code          = 12    (Digital Signal Mixer)
1689          *  Mode              = 0     (Mode 0)
1690          *  Emphasis          = 0     (None)
1691          *  CP                = 1     (Copyright unasserted)
1692          *  AN                = 0     (Audio data)
1693          *  P                 = 0     (Consumer)
1694          */
1695         spcs = SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
1696             SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC |
1697             SPCS_GENERATIONSTATUS | 0x00001200 | 0x00000000 |
1698             SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT;
1699         emu_wrptr(sc, 0, SPCS0, spcs);
1700         emu_wrptr(sc, 0, SPCS1, spcs);
1701         emu_wrptr(sc, 0, SPCS2, spcs);
1702
1703         if (!sc->audigy)
1704                 emu_initefx(sc);
1705         else if (sc->audigy2) { /* Audigy 2 */
1706                 /* from ALSA initialization code: */
1707
1708                 /* Hack for Alice3 to work independent of haP16V driver */
1709                 u_int32_t tmp;
1710
1711                 /* Setup SRCMulti_I2S SamplingRate */
1712                 tmp = emu_rdptr(sc, 0, A_SPDIF_SAMPLERATE) & 0xfffff1ff;
1713                 emu_wrptr(sc, 0, A_SPDIF_SAMPLERATE, tmp | 0x400);
1714
1715                 /* Setup SRCSel (Enable SPDIF, I2S SRCMulti) */
1716                 emu_wr(sc, 0x20, 0x00600000, 4);
1717                 emu_wr(sc, 0x24, 0x00000014, 4);
1718
1719                 /* Setup SRCMulti Input Audio Enable */
1720                 emu_wr(sc, 0x20, 0x006e0000, 4);
1721                 emu_wr(sc, 0x24, 0xff00ff00, 4);
1722         }
1723
1724         SLIST_INIT(&sc->mem.blocks);
1725         sc->mem.ptb_pages = emu_malloc(sc, EMUMAXPAGES * sizeof(u_int32_t),
1726             &sc->mem.ptb_pages_addr);
1727         if (sc->mem.ptb_pages == NULL)
1728                 return -1;
1729
1730         sc->mem.silent_page = emu_malloc(sc, EMUPAGESIZE,
1731             &sc->mem.silent_page_addr);
1732         if (sc->mem.silent_page == NULL) {
1733                 emu_free(sc, sc->mem.ptb_pages);
1734                 return -1;
1735         }
1736         /* Clear page with silence & setup all pointers to this page */
1737         bzero(sc->mem.silent_page, EMUPAGESIZE);
1738         tmp = (u_int32_t)(sc->mem.silent_page_addr) << 1;
1739         for (i = 0; i < EMUMAXPAGES; i++)
1740                 sc->mem.ptb_pages[i] = tmp | i;
1741
1742         emu_wrptr(sc, 0, PTB, (sc->mem.ptb_pages_addr));
1743         emu_wrptr(sc, 0, TCB, 0);       /* taken from original driver */
1744         emu_wrptr(sc, 0, TCBS, 0);      /* taken from original driver */
1745
1746         for (ch = 0; ch < NUM_G; ch++) {
1747                 emu_wrptr(sc, ch, MAPA, tmp | MAP_PTI_MASK);
1748                 emu_wrptr(sc, ch, MAPB, tmp | MAP_PTI_MASK);
1749         }
1750
1751         /* emu_memalloc(sc, EMUPAGESIZE); */
1752         /*
1753          *  Hokay, now enable the AUD bit
1754          *
1755          *  Audigy
1756          *   Enable Audio = 0 (enabled after fx processor initialization)
1757          *   Mute Disable Audio = 0
1758          *   Joystick = 1
1759          *
1760          *  Audigy 2
1761          *   Enable Audio = 1
1762          *   Mute Disable Audio = 0
1763          *   Joystick = 1
1764          *   GP S/PDIF AC3 Enable = 1
1765          *   CD S/PDIF AC3 Enable = 1
1766          *
1767          *  EMU10K1
1768          *   Enable Audio = 1
1769          *   Mute Disable Audio = 0
1770          *   Lock Tank Memory = 1
1771          *   Lock Sound Memory = 0
1772          *   Auto Mute = 1
1773          */
1774
1775         if (sc->audigy) {
1776                 tmp = HCFG_AUTOMUTE | HCFG_JOYENABLE;
1777                 if (sc->audigy2)        /* Audigy 2 */
1778                         tmp = HCFG_AUDIOENABLE | HCFG_AC3ENABLE_CDSPDIF |
1779                             HCFG_AC3ENABLE_GPSPDIF;
1780                 emu_wr(sc, HCFG, tmp, 4);
1781
1782                 audigy_initefx(sc);
1783
1784                 /* from ALSA initialization code: */
1785
1786                 /* enable audio and disable both audio/digital outputs */
1787                 emu_wr(sc, HCFG, emu_rd(sc, HCFG, 4) | HCFG_AUDIOENABLE, 4);
1788                 emu_wr(sc, A_IOCFG, emu_rd(sc, A_IOCFG, 4) & ~A_IOCFG_GPOUT_AD,
1789                     4);
1790                 if (sc->audigy2) {      /* Audigy 2 */
1791                         /* Unmute Analog.
1792                          * Set GPO6 to 1 for Apollo. This has to be done after
1793                          * init Alice3 I2SOut beyond 48kHz.
1794                          * So, sequence is important.
1795                          */
1796                         emu_wr(sc, A_IOCFG,
1797                             emu_rd(sc, A_IOCFG, 4) | A_IOCFG_GPOUT_A, 4);
1798                 }
1799         } else {
1800                 /* EMU10K1 initialization code */
1801                 tmp = HCFG_AUDIOENABLE | HCFG_LOCKTANKCACHE_MASK 
1802                     | HCFG_AUTOMUTE;
1803                 if (sc->rev >= 6)
1804                         tmp |= HCFG_JOYENABLE;
1805
1806                 emu_wr(sc, HCFG, tmp, 4);
1807
1808                 /* TOSLink detection */
1809                 sc->tos_link = 0;
1810                 tmp = emu_rd(sc, HCFG, 4);
1811                 if (tmp & (HCFG_GPINPUT0 | HCFG_GPINPUT1)) {
1812                         emu_wr(sc, HCFG, tmp | HCFG_GPOUT1, 4);
1813                         DELAY(50);
1814                         if (tmp != (emu_rd(sc, HCFG, 4) & ~HCFG_GPOUT1)) {
1815                                 sc->tos_link = 1;
1816                                 emu_wr(sc, HCFG, tmp, 4);
1817                         }
1818                 }
1819         }
1820
1821         return 0;
1822 }
1823
1824 static int
1825 emu_uninit(struct sc_info *sc)
1826 {
1827         u_int32_t ch;
1828
1829         emu_wr(sc, INTE, 0, 4);
1830         for (ch = 0; ch < NUM_G; ch++)
1831                 emu_wrptr(sc, ch, DCYSUSV, ENV_OFF);
1832         for (ch = 0; ch < NUM_G; ch++) {
1833                 emu_wrptr(sc, ch, VTFT, 0);
1834                 emu_wrptr(sc, ch, CVCF, 0);
1835                 emu_wrptr(sc, ch, PTRX, 0);
1836                 emu_wrptr(sc, ch, CPF, 0);
1837         }
1838
1839         if (sc->audigy) {       /* stop fx processor */
1840                 emu_wrptr(sc, 0, A_DBG, A_DBG_SINGLE_STEP);
1841         }
1842
1843         /* disable audio and lock cache */
1844         emu_wr(sc, HCFG,
1845             HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE,
1846             4);
1847
1848         emu_wrptr(sc, 0, PTB, 0);
1849         /* reset recording buffers */
1850         emu_wrptr(sc, 0, MICBS, ADCBS_BUFSIZE_NONE);
1851         emu_wrptr(sc, 0, MICBA, 0);
1852         emu_wrptr(sc, 0, FXBS, ADCBS_BUFSIZE_NONE);
1853         emu_wrptr(sc, 0, FXBA, 0);
1854         emu_wrptr(sc, 0, FXWC, 0);
1855         emu_wrptr(sc, 0, ADCBS, ADCBS_BUFSIZE_NONE);
1856         emu_wrptr(sc, 0, ADCBA, 0);
1857         emu_wrptr(sc, 0, TCB, 0);
1858         emu_wrptr(sc, 0, TCBS, 0);
1859
1860         /* disable channel interrupt */
1861         emu_wrptr(sc, 0, CLIEL, 0);
1862         emu_wrptr(sc, 0, CLIEH, 0);
1863         emu_wrptr(sc, 0, SOLEL, 0);
1864         emu_wrptr(sc, 0, SOLEH, 0);
1865
1866         /* init envelope engine */
1867         if (!SLIST_EMPTY(&sc->mem.blocks))
1868                 device_printf(sc->dev, "warning: memblock list not empty\n");
1869         emu_free(sc, sc->mem.ptb_pages);
1870         emu_free(sc, sc->mem.silent_page);
1871
1872         return 0;
1873 }
1874
1875 static int
1876 emu_pci_probe(device_t dev)
1877 {
1878         char *s = NULL;
1879
1880         switch (pci_get_devid(dev)) {
1881         case EMU10K1_PCI_ID:
1882                 s = "Creative EMU10K1";
1883                 break;
1884
1885         case EMU10K2_PCI_ID:
1886                 if (pci_get_revid(dev) == 0x04)
1887                         s = "Creative Audigy 2 (EMU10K2)";
1888                 else
1889                         s = "Creative Audigy (EMU10K2)";
1890                 break;
1891
1892         case EMU10K3_PCI_ID:
1893                 s = "Creative Audigy 2 (EMU10K3)";
1894                 break;
1895
1896         default:
1897                 return ENXIO;
1898         }
1899
1900         device_set_desc(dev, s);
1901         return BUS_PROBE_DEFAULT;
1902 }
1903
1904 static int
1905 emu_pci_attach(device_t dev)
1906 {
1907         struct ac97_info *codec = NULL;
1908         struct sc_info *sc;
1909         u_int32_t data;
1910         int i, gotmic;
1911         char status[SND_STATUSLEN];
1912
1913         sc = kmalloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
1914
1915         sc->lock = snd_mtxcreate(device_get_nameunit(dev), "sound softc");
1916         sc->dev = dev;
1917         sc->type = pci_get_devid(dev);
1918         sc->rev = pci_get_revid(dev);
1919         sc->audigy = sc->type == EMU10K2_PCI_ID || sc->type == EMU10K3_PCI_ID;
1920         sc->audigy2 = (sc->audigy && sc->rev == 0x04);
1921         sc->nchans = sc->audigy ? 8 : 4;
1922         sc->addrmask = sc->audigy ? A_PTR_ADDRESS_MASK : PTR_ADDRESS_MASK;
1923
1924         data = pci_read_config(dev, PCIR_COMMAND, 2);
1925         data |= (PCIM_CMD_PORTEN | PCIM_CMD_BUSMASTEREN);
1926         pci_write_config(dev, PCIR_COMMAND, data, 2);
1927         data = pci_read_config(dev, PCIR_COMMAND, 2);
1928
1929         i = PCIR_BAR(0);
1930         sc->reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &i, RF_ACTIVE);
1931         if (sc->reg == NULL) {
1932                 device_printf(dev, "unable to map register space\n");
1933                 goto bad;
1934         }
1935         sc->st = rman_get_bustag(sc->reg);
1936         sc->sh = rman_get_bushandle(sc->reg);
1937
1938         sc->bufsz = pcm_getbuffersize(dev, 4096, EMU_DEFAULT_BUFSZ, 65536);
1939
1940         if (bus_dma_tag_create(/*parent*/NULL, /*alignment*/2, /*boundary*/0,
1941                 /*lowaddr*/1 << 31, /* can only access 0-2gb */
1942                 /*highaddr*/BUS_SPACE_MAXADDR,
1943                 /*filter*/NULL, /*filterarg*/NULL,
1944                 /*maxsize*/sc->bufsz, /*nsegments*/1, /*maxsegz*/0x3ffff,
1945                 /*flags*/0,
1946                 &sc->parent_dmat) != 0) {
1947                 device_printf(dev, "unable to create dma tag\n");
1948                 goto bad;
1949         }
1950
1951         if (emu_init(sc) == -1) {
1952                 device_printf(dev, "unable to initialize the card\n");
1953                 goto bad;
1954         }
1955
1956         codec = AC97_CREATE(dev, sc, emu_ac97);
1957         if (codec == NULL) goto bad;
1958         gotmic = (ac97_getcaps(codec) & AC97_CAP_MICCHANNEL) ? 1 : 0;
1959         if (mixer_init(dev, ac97_getmixerclass(), codec) == -1) goto bad;
1960
1961         i = 0;
1962         sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &i,
1963             RF_ACTIVE | RF_SHAREABLE);
1964         if (!sc->irq ||
1965             snd_setup_intr(dev, sc->irq, INTR_MPSAFE, emu_intr, sc, &sc->ih)) {
1966                 device_printf(dev, "unable to map interrupt\n");
1967                 goto bad;
1968         }
1969
1970         ksnprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld %s",
1971             rman_get_start(sc->reg), rman_get_start(sc->irq),
1972             PCM_KLDSTRING(snd_emu10k1));
1973
1974         if (pcm_register(dev, sc, sc->nchans, gotmic ? 3 : 2)) goto bad;
1975         for (i = 0; i < sc->nchans; i++)
1976                 pcm_addchan(dev, PCMDIR_PLAY, &emupchan_class, sc);
1977         for (i = 0; i < (gotmic ? 3 : 2); i++)
1978                 pcm_addchan(dev, PCMDIR_REC, &emurchan_class, sc);
1979
1980         pcm_setstatus(dev, status);
1981
1982         return 0;
1983
1984 bad:
1985         if (codec) ac97_destroy(codec);
1986         if (sc->reg) bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0), sc->reg);
1987         if (sc->ih) bus_teardown_intr(dev, sc->irq, sc->ih);
1988         if (sc->irq) bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
1989         if (sc->parent_dmat) bus_dma_tag_destroy(sc->parent_dmat);
1990         if (sc->lock) snd_mtxfree(sc->lock);
1991         kfree(sc, M_DEVBUF);
1992         return ENXIO;
1993 }
1994
1995 static int
1996 emu_pci_detach(device_t dev)
1997 {
1998         int r;
1999         struct sc_info *sc;
2000
2001         r = pcm_unregister(dev);
2002         if (r)
2003                 return r;
2004
2005         sc = pcm_getdevinfo(dev);
2006         /* shutdown chip */
2007         emu_uninit(sc);
2008
2009         bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0), sc->reg);
2010         bus_teardown_intr(dev, sc->irq, sc->ih);
2011         bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
2012         bus_dma_tag_destroy(sc->parent_dmat);
2013         snd_mtxfree(sc->lock);
2014         kfree(sc, M_DEVBUF);
2015
2016         return 0;
2017 }
2018
2019 /* add suspend, resume */
2020 static device_method_t emu_methods[] = {
2021         /* Device interface */
2022         DEVMETHOD(device_probe,         emu_pci_probe),
2023         DEVMETHOD(device_attach,        emu_pci_attach),
2024         DEVMETHOD(device_detach,        emu_pci_detach),
2025
2026         { 0, 0 }
2027 };
2028
2029 static driver_t emu_driver = {
2030         "pcm",
2031         emu_methods,
2032         PCM_SOFTC_SIZE,
2033 };
2034
2035 DRIVER_MODULE(snd_emu10k1, pci, emu_driver, pcm_devclass, NULL, NULL);
2036 DRIVER_MODULE(snd_emu10k1, cardbus, emu_driver, pcm_devclass, NULL, NULL);
2037 MODULE_DEPEND(snd_emu10k1, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER);
2038 MODULE_VERSION(snd_emu10k1, 1);
2039
2040 /* dummy driver to silence the joystick device */
2041 static int
2042 emujoy_pci_probe(device_t dev)
2043 {
2044         char *s = NULL;
2045
2046         switch (pci_get_devid(dev)) {
2047         case 0x70021102:
2048                 s = "Creative EMU10K1 Joystick";
2049                 device_quiet(dev);
2050                 break;
2051         case 0x70031102:
2052                 s = "Creative EMU10K2 Joystick";
2053                 device_quiet(dev);
2054                 break;
2055         }
2056
2057         if (s) device_set_desc(dev, s);
2058         return s ? -1000 : ENXIO;
2059 }
2060
2061 static int
2062 emujoy_pci_attach(device_t dev)
2063 {
2064         return 0;
2065 }
2066
2067 static int
2068 emujoy_pci_detach(device_t dev)
2069 {
2070         return 0;
2071 }
2072
2073 static device_method_t emujoy_methods[] = {
2074         DEVMETHOD(device_probe,         emujoy_pci_probe),
2075         DEVMETHOD(device_attach,        emujoy_pci_attach),
2076         DEVMETHOD(device_detach,        emujoy_pci_detach),
2077
2078         { 0, 0 }
2079 };
2080
2081 static driver_t emujoy_driver = {
2082         "emujoy",
2083         emujoy_methods,
2084         8,
2085 };
2086
2087 static devclass_t emujoy_devclass;
2088
2089 DRIVER_MODULE(emujoy, pci, emujoy_driver, emujoy_devclass, NULL, NULL);
2090