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