xref: /freebsd/sys/dev/sound/pci/emu10kx.c (revision b1f9167f94059fd55c630891d359bcff987bd7eb)
1 /*-
2  * Copyright (c) 1999 Cameron Grant <cg@freebsd.org>
3  * Copyright (c) 2003-2007 Yuriy Tsibizov <yuriy.tsibizov@gfk.ru>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHERIN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  * $FreeBSD$
28  */
29 
30 #include <sys/param.h>
31 #include <sys/types.h>
32 #include <sys/bus.h>
33 #include <machine/bus.h>
34 #include <sys/rman.h>
35 #include <sys/systm.h>
36 #include <sys/sbuf.h>
37 #include <sys/queue.h>
38 #include <sys/lock.h>
39 #include <sys/mutex.h>
40 #include <sys/sysctl.h>
41 #include <sys/kdb.h>
42 
43 #include <dev/pci/pcireg.h>
44 #include <dev/pci/pcivar.h>
45 
46 #include <machine/clock.h>	/* for DELAY */
47 
48 #ifdef HAVE_KERNEL_OPTION_HEADERS
49 #include "opt_snd.h"
50 #endif
51 
52 #include <dev/sound/chip.h>
53 #include <dev/sound/pcm/sound.h>
54 #include <dev/sound/pcm/ac97.h>
55 
56 #include <dev/sound/pci/emuxkireg.h>
57 #include <dev/sound/pci/emu10kx.h>
58 
59 /* hw flags */
60 #define	HAS_51		0x0001
61 #define	HAS_71		0x0002
62 #define	HAS_AC97	0x0004
63 
64 #define	IS_EMU10K1	0x0008
65 #define	IS_EMU10K2	0x0010
66 #define	IS_CA0102	0x0020
67 #define	IS_CA0108	0x0040
68 #define	IS_UNKNOWN	0x0080
69 
70 #define	BROKEN_DIGITAL	0x0100
71 #define	DIGITAL_ONLY	0x0200
72 
73 #define	IS_CARDBUS	0x0400
74 
75 #define	MODE_ANALOG	1
76 #define	MODE_DIGITAL	2
77 #define	SPDIF_MODE_PCM	1
78 #define	SPDIF_MODE_AC3	2
79 
80 #define	MACS	0x0
81 #define	MACS1	0x1
82 #define	MACW	0x2
83 #define	MACW1	0x3
84 #define	MACINTS	0x4
85 #define	MACINTW	0x5
86 #define	ACC3	0x6
87 #define	MACMV	0x7
88 #define	ANDXOR	0x8
89 #define	TSTNEG	0x9
90 #define	LIMIT	0xA
91 #define	LIMIT1	0xB
92 #define	LOG	0xC
93 #define	EXP	0xD
94 #define	INTERP	0xE
95 #define	SKIP	0xF
96 
97 #define	GPR(i)	(sc->gpr_base+(i))
98 #define	INP(i)	(sc->input_base+(i))
99 #define	OUTP(i)	(sc->output_base+(i))
100 #define	FX(i)	(i)
101 #define	FX2(i)	(sc->efxc_base+(i))
102 #define	DSP_CONST(i) (sc->dsp_zero+(i))
103 
104 #define	COND_NORMALIZED	DSP_CONST(0x1)
105 #define	COND_BORROW	DSP_CONST(0x2)
106 #define	COND_MINUS	DSP_CONST(0x3)
107 #define	COND_LESS_ZERO	DSP_CONST(0x4)
108 #define	COND_EQ_ZERO	DSP_CONST(0x5)
109 #define	COND_SATURATION	DSP_CONST(0x6)
110 #define	COND_NEQ_ZERO	DSP_CONST(0x8)
111 
112 #define	DSP_ACCUM	DSP_CONST(0x16)
113 #define	DSP_CCR		DSP_CONST(0x17)
114 
115 /* Live! Inputs */
116 #define	IN_AC97_L 	0x00
117 #define	IN_AC97_R 	0x01
118 #define	IN_AC97		IN_AC97_L
119 #define	IN_SPDIF_CD_L	0x02
120 #define	IN_SPDIF_CD_R	0x03
121 #define	IN_SPDIF_CD	IN_SPDIF_CD_L
122 #define	IN_ZOOM_L 	0x04
123 #define	IN_ZOOM_R 	0x05
124 #define	IN_ZOOM		IN_ZOOM_L
125 #define	IN_TOSLINK_L	0x06
126 #define	IN_TOSLINK_R	0x07
127 #define	IN_TOSLINK	IN_TOSLINK_L
128 #define	IN_LINE1_L	0x08
129 #define	IN_LINE1_R	0x09
130 #define	IN_LINE1	IN_LINE1_L
131 #define	IN_COAX_SPDIF_L	0x0a
132 #define	IN_COAX_SPDIF_R	0x0b
133 #define	IN_COAX_SPDIF	IN_COAX_SPDIF_L
134 #define	IN_LINE2_L	0x0c
135 #define	IN_LINE2_R	0x0d
136 #define	IN_LINE2	IN_LINE2_L
137 #define	IN_0E		0x0e
138 #define	IN_0F		0x0f
139 
140 /* Outputs */
141 #define	OUT_AC97_L	0x00
142 #define	OUT_AC97_R	0x01
143 #define	OUT_AC97	OUT_AC97_L
144 #define	OUT_A_FRONT	OUT_AC97
145 #define	OUT_TOSLINK_L 	0x02
146 #define	OUT_TOSLINK_R 	0x03
147 #define	OUT_TOSLINK	OUT_TOSLINK_L
148 #define	OUT_D_CENTER	0x04
149 #define	OUT_D_SUB	0x05
150 #define	OUT_HEADPHONE_L	0x06
151 #define	OUT_HEADPHONE_R	0x07
152 #define	OUT_HEADPHONE	OUT_HEADPHONE_L
153 #define	OUT_REAR_L	0x08
154 #define	OUT_REAR_R	0x09
155 #define	OUT_REAR	OUT_REAR_L
156 #define	OUT_ADC_REC_L 	0x0a
157 #define	OUT_ADC_REC_R	0x0b
158 #define	OUT_ADC_REC	OUT_ADC_REC_L
159 #define	OUT_MIC_CAP	0x0c
160 
161 /* Live! 5.1 Digital, non-standard 5.1 (center & sub) outputs */
162 #define	OUT_A_CENTER	0x11
163 #define	OUT_A_SUB	0x12
164 
165 /* Audigy Inputs */
166 #define	A_IN_AC97_L	0x00
167 #define	A_IN_AC97_R	0x01
168 #define	A_IN_AC97	A_IN_AC97_L
169 #define	A_IN_SPDIF_CD_L	0x02
170 #define	A_IN_SPDIF_CD_R	0x03
171 #define	A_IN_SPDIF_CD	A_IN_SPDIF_CD_L
172 #define	A_IN_O_SPDIF_L	0x04
173 #define	A_IN_O_SPDIF_R	0x05
174 #define	A_IN_O_SPDIF	A_IN_O_SPDIF_L
175 #define	A_IN_LINE2_L	0x08
176 #define	A_IN_LINE2_R	0x09
177 #define	A_IN_LINE2	A_IN_LINE2_L
178 #define	A_IN_R_SPDIF_L	0x0a
179 #define	A_IN_R_SPDIF_R	0x0b
180 #define	A_IN_R_SPDIF	A_IN_R_SPDIF_L
181 #define	A_IN_AUX2_L	0x0c
182 #define	A_IN_AUX2_R	0x0d
183 #define	A_IN_AUX2	A_IN_AUX2_L
184 
185 /* Audigy Outputs */
186 #define	A_OUT_D_FRONT_L	0x00
187 #define	A_OUT_D_FRONT_R	0x01
188 #define	A_OUT_D_FRONT	A_OUT_D_FRONT_L
189 #define	A_OUT_D_CENTER	0x02
190 #define	A_OUT_D_SUB	0x03
191 #define	A_OUT_D_SIDE_L	0x04
192 #define	A_OUT_D_SIDE_R	0x05
193 #define	A_OUT_D_SIDE	A_OUT_D_SIDE_L
194 #define	A_OUT_D_REAR_L	0x06
195 #define	A_OUT_D_REAR_R	0x07
196 #define	A_OUT_D_REAR	A_OUT_D_REAR_L
197 
198 /* on Audigy Platinum only */
199 #define	A_OUT_HPHONE_L	0x04
200 #define	A_OUT_HPHONE_R	0x05
201 #define	A_OUT_HPHONE	A_OUT_HPHONE_L
202 
203 #define	A_OUT_A_FRONT_L	0x08
204 #define	A_OUT_A_FRONT_R	0x09
205 #define	A_OUT_A_FRONT	A_OUT_A_FRONT_L
206 #define	A_OUT_A_CENTER	0x0a
207 #define	A_OUT_A_SUB	0x0b
208 #define	A_OUT_A_SIDE_L	0x0c
209 #define	A_OUT_A_SIDE_R	0x0d
210 #define	A_OUT_A_SIDE	A_OUT_A_SIDE_L
211 #define	A_OUT_A_REAR_L	0x0e
212 #define	A_OUT_A_REAR_R	0x0f
213 #define	A_OUT_A_REAR	A_OUT_A_REAR_L
214 #define	A_OUT_AC97_L	0x10
215 #define	A_OUT_AC97_R	0x11
216 #define	A_OUT_AC97	A_OUT_AC97_L
217 #define	A_OUT_ADC_REC_L	0x16
218 #define	A_OUT_ADC_REC_R	0x17
219 #define	A_OUT_ADC_REC	A_OUT_ADC_REC_L
220 
221 #define EMU_DATA2	0x24
222 #define EMU_IPR2	0x28
223 #define EMU_INTE2	0x2c
224 #define EMU_IPR3	0x38
225 #define EMU_INTE3	0x3c
226 
227 #define EMU_A2_SRCSel		0x60
228 #define EMU_A2_SRCMULTI_ENABLE	0x6e
229 
230 #define EMU_A_I2S_CAPTURE_96000	0x00000400
231 
232 #define EMU_A2_MIXER_I2S_ENABLE           0x7B
233 #define EMU_A2_MIXER_SPDIF_ENABLE         0x7A
234 
235 #define	C_FRONT_L	0
236 #define	C_FRONT_R	1
237 #define	C_REC_L		2
238 #define	C_REC_R		3
239 #define	C_REAR_L	4
240 #define	C_REAR_R	5
241 #define	C_CENTER	6
242 #define	C_SUB		7
243 #define	C_SIDE_L	8
244 #define	C_SIDE_R	9
245 #define	NUM_CACHES	10
246 
247 #define	CDSPDIFMUTE	0
248 #define	ANALOGMUTE	1
249 #define	NUM_MUTE	2
250 
251 #define	EMU_MAX_GPR	512
252 #define	EMU_MAX_IRQ_CONSUMERS 32
253 
254 struct emu_voice {
255 	int	vnum;
256 	unsigned int	b16:1, stereo:1, busy:1, running:1, ismaster:1;
257 	int	speed;
258 	int	start;
259 	int	end;
260 	int	vol;
261 	uint32_t buf;
262 	void	*vbuf;
263 	struct emu_voice *slave;
264 	uint32_t sa;
265 	uint32_t ea;
266 	uint32_t routing[8];
267 	uint32_t amounts[8];
268 };
269 
270 struct emu_memblk {
271 	SLIST_ENTRY(emu_memblk)	link;
272 	void		*buf;
273 	char		owner[16];
274 	bus_addr_t	buf_addr;
275 	uint32_t	pte_start, pte_size;
276 	bus_dmamap_t	buf_map;
277 };
278 
279 struct emu_mem {
280 	uint8_t		bmap[EMU_MAXPAGES / 8];
281 	uint32_t	*ptb_pages;
282 	void		*silent_page;
283 	bus_addr_t	ptb_pages_addr;
284 	bus_addr_t	silent_page_addr;
285 	bus_dmamap_t	ptb_map;
286 	bus_dmamap_t	silent_map;
287 	bus_dma_tag_t	dmat;
288 	struct emu_sc_info *card;
289 	SLIST_HEAD(, emu_memblk) blocks;
290 };
291 
292 /* rm */
293 struct emu_rm {
294 	struct emu_sc_info *card;
295 	struct mtx	gpr_lock;
296 	signed int	allocmap[EMU_MAX_GPR];
297 	int		num_gprs;
298 	int		last_free_gpr;
299 	int 		num_used;
300 };
301 
302 struct emu_intr_handler {
303 	void*		softc;
304 	uint32_t	intr_mask;
305 	uint32_t	inte_mask;
306 	uint32_t(*irq_func) (void *softc, uint32_t irq);
307 };
308 
309 struct emu_sc_info {
310 	struct mtx	lock;
311 	struct mtx	rw;		/* Hardware exclusive access lock */
312 
313 	/* Hardware and subdevices */
314 	device_t	dev;
315 	device_t	pcm[RT_COUNT];
316 	device_t	midi[2];
317 	uint32_t	type;
318 	uint32_t	rev;
319 
320 	bus_space_tag_t	st;
321 	bus_space_handle_t sh;
322 
323 	struct cdev	*cdev;		/* /dev/emu10k character device */
324 	struct mtx	emu10kx_lock;
325 	int		emu10kx_isopen;
326 	struct sbuf	emu10kx_sbuf;
327 	int		emu10kx_bufptr;
328 
329 
330 	/* Resources */
331 	struct resource	*reg;
332 	struct resource	*irq;
333 	void 		*ih;
334 
335 	/* IRQ handlers */
336 	struct emu_intr_handler ihandler[EMU_MAX_IRQ_CONSUMERS];
337 
338 	/* Card HW configuration */
339 	unsigned int	mode;	/* analog / digital */
340 	unsigned int	mchannel_fx;
341 	unsigned int	dsp_zero;
342 	unsigned int	code_base;
343 	unsigned int	code_size;
344 	unsigned int	gpr_base;
345 	unsigned int	num_gprs;
346 	unsigned int	input_base;
347 	unsigned int	output_base;
348 	unsigned int	efxc_base;
349 	unsigned int	opcode_shift;
350 	unsigned int	high_operand_shift;
351 	unsigned int	address_mask;
352 	uint32_t 	is_emu10k1:1, is_emu10k2, is_ca0102, is_ca0108:1,
353 			has_ac97:1, has_51:1, has_71:1,
354 			enable_ir:1,
355 			broken_digital:1, is_cardbus:1;
356 
357 	signed int	mch_disabled, mch_rec, dbg_level;
358 	signed int 	num_inputs;
359 	unsigned int 	num_outputs;
360 	unsigned int 	num_fxbuses;
361 	unsigned int 	routing_code_start;
362 	unsigned int	routing_code_end;
363 
364 	/* HW resources */
365 	struct emu_voice voice[NUM_G];			/* Hardware voices */
366 	uint32_t	irq_mask[EMU_MAX_IRQ_CONSUMERS]; /* IRQ manager data */
367 	int 		timer[EMU_MAX_IRQ_CONSUMERS];	/* timer */
368 	int		timerinterval;
369 	struct		emu_rm *rm;
370 	struct		emu_mem mem;			/* memory */
371 
372 	/* Mixer */
373 	int		mixer_gpr[NUM_MIXERS];
374 	int		mixer_volcache[NUM_MIXERS];
375 	int		cache_gpr[NUM_CACHES];
376 	int		dummy_gpr;
377 	int		mute_gpr[NUM_MUTE];
378 	struct sysctl_ctx_list	*ctx;
379 	struct sysctl_oid	*root;
380 };
381 
382 static void	emu_setmap(void *arg, bus_dma_segment_t * segs, int nseg, int error);
383 static void*	emu_malloc(struct emu_mem *mem, uint32_t sz, bus_addr_t * addr, bus_dmamap_t *map);
384 static void	emu_free(struct emu_mem *mem, void *dmabuf, bus_dmamap_t map);
385 static void*	emu_memalloc(struct emu_mem *mem, uint32_t sz, bus_addr_t * addr, const char * owner);
386 static int	emu_memfree(struct emu_mem *mem, void *membuf);
387 static int	emu_memstart(struct emu_mem *mem, void *membuf);
388 
389 /* /dev */
390 static int	emu10kx_dev_init(struct emu_sc_info *sc);
391 static int	emu10kx_dev_uninit(struct emu_sc_info *sc);
392 static int	emu10kx_prepare(struct emu_sc_info *sc, struct sbuf *s);
393 
394 static void	emumix_set_mode(struct emu_sc_info *sc, int mode);
395 static void	emumix_set_spdif_mode(struct emu_sc_info *sc, int mode);
396 static void	emumix_set_fxvol(struct emu_sc_info *sc, unsigned gpr, int32_t vol);
397 static void	emumix_set_gpr(struct emu_sc_info *sc, unsigned gpr, int32_t val);
398 static int	sysctl_emu_mixer_control(SYSCTL_HANDLER_ARGS);
399 
400 static int	emu_rm_init(struct emu_sc_info *sc);
401 static int	emu_rm_uninit(struct emu_sc_info *sc);
402 static int	emu_rm_gpr_alloc(struct emu_rm *rm, int count);
403 
404 static unsigned int emu_getcard(device_t dev);
405 static uint32_t	emu_rd_nolock(struct emu_sc_info *sc, unsigned int regno, unsigned int size);
406 static void	emu_wr_nolock(struct emu_sc_info *sc, unsigned int regno, uint32_t data, unsigned int size);
407 static void	emu_wr_cbptr(struct emu_sc_info *sc, uint32_t data);
408 
409 static void	emu_vstop(struct emu_sc_info *sc, char channel, int enable);
410 
411 static void	emu_intr(void *p);
412 static void	emu_wrefx(struct emu_sc_info *sc, unsigned int pc, unsigned int data);
413 static void	emu_addefxop(struct emu_sc_info *sc, unsigned int op, unsigned int z, unsigned int w, unsigned int x, unsigned int y, uint32_t * pc);
414 static void	emu_initefx(struct emu_sc_info *sc);
415 
416 static int	emu_cardbus_init(struct emu_sc_info *sc);
417 static int	emu_init(struct emu_sc_info *sc);
418 static int	emu_uninit(struct emu_sc_info *sc);
419 
420 static int	emu_read_ivar(device_t bus __unused, device_t dev, int ivar_index, uintptr_t * result);
421 static int	emu_write_ivar(device_t bus __unused, device_t dev __unused,
422     int ivar_index, uintptr_t value __unused);
423 
424 static int	emu_pci_probe(device_t dev);
425 static int	emu_pci_attach(device_t dev);
426 static int	emu_pci_detach(device_t dev);
427 static int	emu_modevent(module_t mod __unused, int cmd, void *data __unused);
428 
429 #ifdef	SND_EMU10KX_DEBUG
430 
431 #define EMU_MTX_DEBUG() do { 						\
432 		if (mtx_owned(&sc->rw)) {				\
433 		printf("RW owned in %s line %d for %s\n", __func__,	\
434 			__LINE__ , device_get_nameunit(sc->dev));	\
435 		printf("rw lock owned: %d\n", mtx_owned(&sc->rw));	\
436 		printf("rw lock: value %x thread %x\n",			\
437 			((&sc->rw)->mtx_lock & ~MTX_FLAGMASK), 		\
438 			(uintptr_t)curthread);				\
439 		printf("rw lock: recursed %d\n", mtx_recursed(&sc->rw));\
440 		db_show_mtx(&sc->rw);					\
441 		}							\
442 	} while (0)
443 #else
444 #define EMU_MTX_DEBUG() do { 						\
445 	} while (0)
446 #endif
447 
448 #define EMU_RWLOCK() do {		\
449 	EMU_MTX_DEBUG();		\
450 	mtx_lock(&(sc->rw));		\
451 	} while (0)
452 
453 #define EMU_RWUNLOCK() do {		\
454 	mtx_unlock(&(sc->rw));		\
455 	EMU_MTX_DEBUG();		\
456 	} while (0)
457 
458 /* Supported cards */
459 struct emu_hwinfo {
460 	uint16_t	vendor;
461 	uint16_t	device;
462 	uint16_t	subvendor;
463 	uint16_t	subdevice;
464 	char		SBcode[8];
465 	char		desc[32];
466 	int		flags;
467 };
468 
469 static struct emu_hwinfo emu_cards[] = {
470 	{0xffff, 0xffff, 0xffff, 0xffff, "BADCRD", "Not a compatible card", 0},
471 	/* 0x0020..0x002f 4.0 EMU10K1 cards */
472 	{0x1102, 0x0002, 0x1102, 0x0020, "CT4850", "SBLive! Value", HAS_AC97 | IS_EMU10K1},
473 	{0x1102, 0x0002, 0x1102, 0x0021, "CT4620", "SBLive!", HAS_AC97 | IS_EMU10K1},
474 	{0x1102, 0x0002, 0x1102, 0x002f, "CT????", "SBLive! mainboard implementation", HAS_AC97 | IS_EMU10K1},
475 
476 	/* (range unknown) 5.1 EMU10K1 cards */
477 	{0x1102, 0x0002, 0x1102, 0x100a, "CT????", "SBLive! 5.1", HAS_AC97 | HAS_51 | IS_EMU10K1},
478 
479 	/* 0x80??..0x805? 4.0 EMU10K1 cards */
480 	{0x1102, 0x0002, 0x1102, 0x8022, "CT4780", "SBLive! Value", HAS_AC97 | IS_EMU10K1},
481 	{0x1102, 0x0002, 0x1102, 0x8023, "CT4790", "SB PCI512", HAS_AC97 | IS_EMU10K1},
482 	{0x1102, 0x0002, 0x1102, 0x8024, "CT4760", "SBLive!", HAS_AC97 | IS_EMU10K1},
483 	{0x1102, 0x0002, 0x1102, 0x8025, "CT????", "SBLive! Mainboard Implementation", HAS_AC97 | IS_EMU10K1},
484 	{0x1102, 0x0002, 0x1102, 0x8026, "CT4830", "SBLive! Value", HAS_AC97 | IS_EMU10K1},
485 	{0x1102, 0x0002, 0x1102, 0x8027, "CT4832", "SBLive! Value", HAS_AC97 | IS_EMU10K1},
486 	{0x1102, 0x0002, 0x1102, 0x8028, "CT4760", "SBLive! OEM version", HAS_AC97 | IS_EMU10K1},
487 	{0x1102, 0x0002, 0x1102, 0x8031, "CT4831", "SBLive! Value", HAS_AC97 | IS_EMU10K1},
488 	{0x1102, 0x0002, 0x1102, 0x8040, "CT4760", "SBLive!", HAS_AC97 | IS_EMU10K1},
489 	{0x1102, 0x0002, 0x1102, 0x8051, "CT4850", "SBLive! Value", HAS_AC97 | IS_EMU10K1},
490 
491 	/* 0x8061..0x???? 5.1 EMU10K1  cards */
492 	{0x1102, 0x0002, 0x1102, 0x8061, "SB????", "SBLive! Player 5.1", HAS_AC97 | HAS_51 | IS_EMU10K1},
493 	{0x1102, 0x0002, 0x1102, 0x8062, "CT4830", "SBLive! 1024", HAS_AC97 | HAS_51 | IS_EMU10K1},
494 	{0x1102, 0x0002, 0x1102, 0x8064, "SB????", "SBLive! 5.1", HAS_AC97 | HAS_51 | IS_EMU10K1},
495 	{0x1102, 0x0002, 0x1102, 0x8065, "SB0220", "SBLive! 5.1 Digital", HAS_AC97 | HAS_51 | IS_EMU10K1},
496 	{0x1102, 0x0002, 0x1102, 0x8066, "CT4780", "SBLive! 5.1 Digital", HAS_AC97 | HAS_51 | IS_EMU10K1},
497 	{0x1102, 0x0002, 0x1102, 0x8067, "SB????", "SBLive!", HAS_AC97 | HAS_51 | IS_EMU10K1},
498 
499 	/* Generic SB Live! */
500 	{0x1102, 0x0002, 0x1102, 0x0000, "SB????", "SBLive! (Unknown model)", HAS_AC97 | IS_EMU10K1},
501 
502 	/* 0x0041..0x0043 EMU10K2 (some kind of Audigy) cards */
503 
504 	/* 0x0051..0x0051 5.1 CA0100-IAF cards */
505 	{0x1102, 0x0004, 0x1102, 0x0051, "SB0090", "Audigy", HAS_AC97 | HAS_51 | IS_EMU10K2},
506 	/* ES is CA0100-IDF chip that don't work in digital mode */
507 	{0x1102, 0x0004, 0x1102, 0x0052, "SB0160", "Audigy ES", HAS_AC97 | HAS_71 | IS_EMU10K2 | BROKEN_DIGITAL},
508 	/* 0x0053..0x005C 5.1 CA0101-NAF cards */
509 	{0x1102, 0x0004, 0x1102, 0x0053, "SB0090", "Audigy Player/OEM", HAS_AC97 | HAS_51 | IS_EMU10K2},
510 	{0x1102, 0x0004, 0x1102, 0x0058, "SB0090", "Audigy Player/OEM", HAS_AC97 | HAS_51 | IS_EMU10K2},
511 
512 	/* 0x1002..0x1009 5.1 CA0102-IAT cards */
513 	{0x1102, 0x0004, 0x1102, 0x1002, "SB????", "Audigy 2 Platinum", HAS_51 | IS_CA0102},
514 	{0x1102, 0x0004, 0x1102, 0x1005, "SB????", "Audigy 2 Platinum EX", HAS_51 | IS_CA0102},
515 	{0x1102, 0x0004, 0x1102, 0x1007, "SB0240", "Audigy 2", HAS_AC97 | HAS_51 | IS_CA0102},
516 
517 	/* 0x2001..0x2003 7.1 CA0102-ICT cards */
518 	{0x1102, 0x0004, 0x1102, 0x2001, "SB0350", "Audigy 2 ZS", HAS_AC97 | HAS_71 | IS_CA0102},
519 	{0x1102, 0x0004, 0x1102, 0x2002, "SB0350", "Audigy 2 ZS", HAS_AC97 | HAS_71 | IS_CA0102},
520 	/* XXX No reports about 0x2003 & 0x2004 cards */
521 	{0x1102, 0x0004, 0x1102, 0x2003, "SB0350", "Audigy 2 ZS", HAS_AC97 | HAS_71 | IS_CA0102},
522 	{0x1102, 0x0004, 0x1102, 0x2004, "SB0350", "Audigy 2 ZS", HAS_AC97 | HAS_71 | IS_CA0102},
523 	{0x1102, 0x0004, 0x1102, 0x2005, "SB0350", "Audigy 2 ZS", HAS_AC97 | HAS_71 | IS_CA0102},
524 
525 	/* (range unknown) 7.1 CA0102-xxx Audigy 4 cards */
526 	{0x1102, 0x0004, 0x1102, 0x2007, "SB0380", "Audigy 4 Pro", HAS_AC97 | HAS_71 | IS_CA0102},
527 
528 	/* Generic Audigy or Audigy 2 */
529 	{0x1102, 0x0004, 0x1102, 0x0000, "SB????", "Audigy (Unknown model)", HAS_AC97 | HAS_51 | IS_EMU10K2},
530 
531 	/* We don't support CA0103-DAT (Audigy LS) cards */
532 	/* There is NO CA0104-xxx cards */
533 	/* There is NO CA0105-xxx cards */
534 	/* We don't support CA0106-DAT (SB Live! 24 bit) cards */
535 	/* There is NO CA0107-xxx cards */
536 
537 	/* 0x1000..0x1001 7.1 CA0108-IAT cards */
538 	{0x1102, 0x0008, 0x1102, 0x1000, "SB????", "Audigy 2 LS", HAS_AC97 | HAS_51 | IS_CA0108 | DIGITAL_ONLY},
539 	{0x1102, 0x0008, 0x1102, 0x1001, "SB0400", "Audigy 2 Value", HAS_AC97 | HAS_71 | IS_CA0108 | DIGITAL_ONLY},
540 	{0x1102, 0x0008, 0x1102, 0x1021, "SB0610", "Audigy 4", HAS_AC97 | HAS_71 | IS_CA0108 | DIGITAL_ONLY},
541 
542 	{0x1102, 0x0008, 0x1102, 0x2001, "SB0530", "Audigy 2 ZS CardBus", HAS_AC97 | HAS_71 | IS_CA0108 | IS_CARDBUS},
543 
544 	{0x1102, 0x0008, 0x0000, 0x0000, "SB????", "Audigy 2 Value (Unknown model)", HAS_AC97 | HAS_51 | IS_CA0108},
545 };
546 /* Unsupported cards */
547 
548 static struct emu_hwinfo emu_bad_cards[] = {
549 	/* APS cards should be possible to support */
550 	{0x1102, 0x0002, 0x1102, 0x4001, "EMUAPS", "E-mu APS", 0},
551 	{0x1102, 0x0002, 0x1102, 0x4002, "EMUAPS", "E-mu APS", 0},
552 	{0x1102, 0x0004, 0x1102, 0x4001, "EMU???", "E-mu 1212m [4001]", 0},
553 	/* Similar-named ("Live!" or "Audigy") cards on different chipsets */
554 	{0x1102, 0x8064, 0x0000, 0x0000, "SB0100", "SBLive! 5.1 OEM", 0},
555 	{0x1102, 0x0006, 0x0000, 0x0000, "SB0200", "DELL OEM SBLive! Value", 0},
556 	{0x1102, 0x0007, 0x0000, 0x0000, "SB0310", "Audigy LS", 0},
557 };
558 
559 /*
560  * Get best known information about device.
561  */
562 static unsigned int
563 emu_getcard(device_t dev)
564 {
565 	uint16_t device;
566 	uint16_t subdevice;
567 	int n_cards;
568 	unsigned int thiscard;
569 	int i;
570 
571 	device = pci_read_config(dev, PCIR_DEVICE, /* bytes */ 2);
572 	subdevice = pci_read_config(dev, PCIR_SUBDEV_0, /* bytes */ 2);
573 
574 	n_cards = sizeof(emu_cards) / sizeof(struct emu_hwinfo);
575 	thiscard = 0;
576 	for (i = 1; i < n_cards; i++) {
577 		if (device == emu_cards[i].device) {
578 			if (subdevice == emu_cards[i].subdevice) {
579 				thiscard = i;
580 				break;
581 			}
582 			if (0x0000 == emu_cards[i].subdevice) {
583 				thiscard = i;
584 				/*
585 				 * don't break, we can get more specific card
586 				 * later in the list.
587 				 */
588 			}
589 		}
590 	}
591 
592 	n_cards = sizeof(emu_bad_cards) / sizeof(struct emu_hwinfo);
593 	for (i = 0; i < n_cards; i++) {
594 		if (device == emu_bad_cards[i].device) {
595 			if (subdevice == emu_bad_cards[i].subdevice) {
596 				thiscard = 0;
597 				break;
598 			}
599 			if (0x0000 == emu_bad_cards[i].subdevice) {
600 				thiscard = 0;
601 				break;	/* we avoid all this cards */
602 			}
603 		}
604 	}
605 	return (thiscard);
606 }
607 
608 
609 /*
610  * Base hardware interface are 32 (Audigy) or 64 (Audigy2) registers.
611  * Some of them are used directly, some of them provide pointer / data pairs.
612  */
613 static uint32_t
614 emu_rd_nolock(struct emu_sc_info *sc, unsigned int regno, unsigned int size)
615 {
616 
617 	KASSERT(sc != NULL, ("emu_rd: NULL sc"));
618 	switch (size) {
619 	case 1:
620 		return (bus_space_read_1(sc->st, sc->sh, regno));
621 	case 2:
622 		return (bus_space_read_2(sc->st, sc->sh, regno));
623 	case 4:
624 		return (bus_space_read_4(sc->st, sc->sh, regno));
625 	}
626 	return (0xffffffff);
627 }
628 
629 static void
630 emu_wr_nolock(struct emu_sc_info *sc, unsigned int regno, uint32_t data, unsigned int size)
631 {
632 
633 	KASSERT(sc != NULL, ("emu_rd: NULL sc"));
634 	switch (size) {
635 	case 1:
636 		bus_space_write_1(sc->st, sc->sh, regno, data);
637 		break;
638 	case 2:
639 		bus_space_write_2(sc->st, sc->sh, regno, data);
640 		break;
641 	case 4:
642 		bus_space_write_4(sc->st, sc->sh, regno, data);
643 		break;
644 	}
645 }
646 /*
647  * EMU_PTR / EMU_DATA interface. Access to EMU10Kx is made
648  * via (channel, register) pair. Some registers are channel-specific,
649  * some not.
650  */
651 uint32_t
652 emu_rdptr(struct emu_sc_info *sc, unsigned int chn, unsigned int reg)
653 {
654 	uint32_t ptr, val, mask, size, offset;
655 
656 	ptr = ((reg << 16) & sc->address_mask) | (chn & EMU_PTR_CHNO_MASK);
657 
658 	EMU_RWLOCK();
659 	emu_wr_nolock(sc, EMU_PTR, ptr, 4);
660 	val = emu_rd_nolock(sc, EMU_DATA, 4);
661 	EMU_RWUNLOCK();
662 
663 	/*
664 	 * XXX Some register numbers has data size and offset encoded in
665 	 * it to get only part of 32bit register. This use is not described
666 	 * in register name, be careful!
667 	 */
668 	if (reg & 0xff000000) {
669 		size = (reg >> 24) & 0x3f;
670 		offset = (reg >> 16) & 0x1f;
671 		mask = ((1 << size) - 1) << offset;
672 		val &= mask;
673 		val >>= offset;
674 	}
675 	return (val);
676 }
677 
678 void
679 emu_wrptr(struct emu_sc_info *sc, unsigned int chn, unsigned int reg, uint32_t data)
680 {
681 	uint32_t ptr, mask, size, offset;
682 
683 	ptr = ((reg << 16) & sc->address_mask) | (chn & EMU_PTR_CHNO_MASK);
684 
685 	EMU_RWLOCK();
686 	emu_wr_nolock(sc, EMU_PTR, ptr, 4);
687 	/*
688 	 * XXX Another kind of magic encoding in register number. This can
689 	 * give you side effect - it will read previous data from register
690 	 * and change only required bits.
691 	 */
692 	if (reg & 0xff000000) {
693 		size = (reg >> 24) & 0x3f;
694 		offset = (reg >> 16) & 0x1f;
695 		mask = ((1 << size) - 1) << offset;
696 		data <<= offset;
697 		data &= mask;
698 		data |= emu_rd_nolock(sc, EMU_DATA, 4) & ~mask;
699 	}
700 	emu_wr_nolock(sc, EMU_DATA, data, 4);
701 	EMU_RWUNLOCK();
702 }
703 /*
704  * EMU_A2_PTR / EMU_DATA2 interface. Access to P16v is made
705  * via (channel, register) pair. Some registers are channel-specific,
706  * some not. This interface is supported by CA0102 and CA0108 chips only.
707  */
708 uint32_t
709 emu_rd_p16vptr(struct emu_sc_info *sc, uint16_t chn, uint16_t reg)
710 {
711 	uint32_t val;
712 
713 	/* XXX separate lock? */
714 	EMU_RWLOCK();
715 	emu_wr_nolock(sc, EMU_A2_PTR, (reg << 16) | chn, 4);
716 	val = emu_rd_nolock(sc, EMU_DATA2, 4);
717 
718 	EMU_RWUNLOCK();
719 
720 	return (val);
721 }
722 
723 void
724 emu_wr_p16vptr(struct emu_sc_info *sc, uint16_t chn, uint16_t reg, uint32_t data)
725 {
726 
727 	EMU_RWLOCK();
728 	emu_wr_nolock(sc, EMU_A2_PTR, (reg << 16) | chn, 4);
729 	emu_wr_nolock(sc, EMU_DATA2, data, 4);
730 	EMU_RWUNLOCK();
731 }
732 /*
733  * XXX CardBus interface. Not tested on any real hardware.
734  */
735 static void
736 emu_wr_cbptr(struct emu_sc_info *sc, uint32_t data)
737 {
738 	uint32_t val;
739 
740 	/*
741 	 * 0x38 is IPE3 (CD S/PDIF interrupt pending register) on CA0102. Seems
742 	 * to be some reg/value accessible kind of config register on CardBus
743 	 * CA0108, with value(?) in top 16 bit, address(?) in low 16
744 	 */
745 
746 	val = emu_rd_nolock(sc, 0x38, 4);
747 	emu_wr_nolock(sc, 0x38, data, 4);
748 	val = emu_rd_nolock(sc, 0x38, 4);
749 
750 }
751 
752 /*
753  * Direct hardware register access
754  * Assume that it is never used to access EMU_PTR-based registers and can run unlocked.
755  */
756 void
757 emu_wr(struct emu_sc_info *sc, unsigned int regno, uint32_t data, unsigned int size)
758 {
759 	KASSERT(regno != EMU_PTR, ("emu_wr: attempt to write to EMU_PTR"));
760 	KASSERT(regno != EMU_A2_PTR, ("emu_wr: attempt to write to EMU_A2_PTR"));
761 
762 	emu_wr_nolock(sc, regno, data, size);
763 }
764 
765 uint32_t
766 emu_rd(struct emu_sc_info *sc, unsigned int regno, unsigned int size)
767 {
768 	uint32_t rd;
769 
770 	KASSERT(regno != EMU_DATA, ("emu_rd: attempt to read DATA"));
771 	KASSERT(regno != EMU_DATA2, ("emu_rd: attempt to read DATA2"));
772 
773 	rd = emu_rd_nolock(sc, regno, size);
774 	return (rd);
775 }
776 
777 /*
778  * Enabling IR MIDI messages is another kind of black magic. It just
779  * has to be made this way. It really do it.
780  */
781 void
782 emu_enable_ir(struct emu_sc_info *sc)
783 {
784 	uint32_t iocfg;
785 
786 	if (sc->is_emu10k2 || sc->is_ca0102) {
787 		iocfg = emu_rd_nolock(sc, EMU_A_IOCFG, 2);
788 		emu_wr_nolock(sc, EMU_A_IOCFG, iocfg | EMU_A_IOCFG_GPOUT2, 2);
789 		DELAY(500);
790 		emu_wr_nolock(sc, EMU_A_IOCFG, iocfg | EMU_A_IOCFG_GPOUT1 | EMU_A_IOCFG_GPOUT2, 2);
791 		DELAY(500);
792 		emu_wr_nolock(sc, EMU_A_IOCFG, iocfg | EMU_A_IOCFG_GPOUT1, 2);
793 		DELAY(100);
794 		emu_wr_nolock(sc, EMU_A_IOCFG, iocfg, 2);
795 		device_printf(sc->dev, "Audigy IR MIDI events enabled.\n");
796 		sc->enable_ir = 1;
797 	}
798 	if (sc->is_emu10k1) {
799 		iocfg = emu_rd_nolock(sc, EMU_HCFG, 4);
800 		emu_wr_nolock(sc, EMU_HCFG, iocfg | EMU_HCFG_GPOUT2, 4);
801 		DELAY(500);
802 		emu_wr_nolock(sc, EMU_HCFG, iocfg | EMU_HCFG_GPOUT1 | EMU_HCFG_GPOUT2, 4);
803 		DELAY(100);
804 		emu_wr_nolock(sc, EMU_HCFG, iocfg, 4);
805 		device_printf(sc->dev, "SB Live! IR MIDI events enabled.\n");
806 		sc->enable_ir = 1;
807 	}
808 }
809 
810 
811 /*
812  * emu_timer_ - HW timer management
813  */
814 int
815 emu_timer_create(struct emu_sc_info *sc)
816 {
817 	int i, timer;
818 
819 	timer = -1;
820 
821 	mtx_lock(&sc->lock);
822 	for (i = 0; i < EMU_MAX_IRQ_CONSUMERS; i++)
823 		if (sc->timer[i] == 0) {
824 			sc->timer[i] = -1;	/* disable it */
825 			timer = i;
826 			mtx_unlock(&sc->lock);
827 			return (timer);
828 		}
829 	mtx_unlock(&sc->lock);
830 
831 	return (-1);
832 }
833 
834 int
835 emu_timer_set(struct emu_sc_info *sc, int timer, int delay)
836 {
837 	int i;
838 
839 	if (timer < 0)
840 		return (-1);
841 
842 	RANGE(delay, 16, 1024);
843 	RANGE(timer, 0, EMU_MAX_IRQ_CONSUMERS-1);
844 
845 	mtx_lock(&sc->lock);
846 	sc->timer[timer] = delay;
847 	for (i = 0; i < EMU_MAX_IRQ_CONSUMERS; i++)
848 		if (sc->timerinterval > sc->timer[i])
849 			sc->timerinterval = sc->timer[i];
850 
851 	/* XXX */
852 	emu_wr(sc, EMU_TIMER, sc->timerinterval & 0x03ff, 2);
853 	mtx_unlock(&sc->lock);
854 
855 	return (timer);
856 }
857 
858 int
859 emu_timer_enable(struct emu_sc_info *sc, int timer, int go)
860 {
861 	uint32_t x;
862 	int ena_int;
863 	int i;
864 
865 	if (timer < 0)
866 		return (-1);
867 
868 	RANGE(timer, 0, EMU_MAX_IRQ_CONSUMERS-1);
869 
870 	mtx_lock(&sc->lock);
871 
872 	if ((go == 1) && (sc->timer[timer] < 0))
873 		sc->timer[timer] = -sc->timer[timer];
874 	if ((go == 0) && (sc->timer[timer] > 0))
875 		sc->timer[timer] = -sc->timer[timer];
876 
877 	ena_int = 0;
878 	for (i = 0; i < EMU_MAX_IRQ_CONSUMERS; i++) {
879 		if (sc->timerinterval > sc->timer[i])
880 			sc->timerinterval = sc->timer[i];
881 		if (sc->timer[i] > 0)
882 			ena_int = 1;
883 	}
884 
885 	emu_wr(sc, EMU_TIMER, sc->timerinterval & 0x03ff, 2);
886 
887 	if (ena_int == 1) {
888 		x = emu_rd(sc, EMU_INTE, 4);
889 		x |= EMU_INTE_INTERTIMERENB;
890 		emu_wr(sc, EMU_INTE, x, 4);
891 	} else {
892 		x = emu_rd(sc, EMU_INTE, 4);
893 		x &= ~EMU_INTE_INTERTIMERENB;
894 		emu_wr(sc, EMU_INTE, x, 4);
895 	}
896 	mtx_unlock(&sc->lock);
897 	return (0);
898 }
899 
900 int
901 emu_timer_clear(struct emu_sc_info *sc, int timer)
902 {
903 	if (timer < 0)
904 		return (-1);
905 
906 	RANGE(timer, 0, EMU_MAX_IRQ_CONSUMERS-1);
907 
908 	emu_timer_enable(sc, timer, 0);
909 
910 	mtx_lock(&sc->lock);
911 	if (sc->timer[timer] != 0)
912 		sc->timer[timer] = 0;
913 	mtx_unlock(&sc->lock);
914 
915 	return (timer);
916 }
917 
918 /*
919  * emu_intr_ - HW interrupt handler management
920  */
921 int
922 emu_intr_register(struct emu_sc_info *sc, uint32_t inte_mask, uint32_t intr_mask, uint32_t(*func) (void *softc, uint32_t irq), void *isc)
923 {
924 	int i;
925 	uint32_t x;
926 
927 	mtx_lock(&sc->lock);
928 	for (i = 0; i < EMU_MAX_IRQ_CONSUMERS; i++)
929 		if (sc->ihandler[i].inte_mask == 0) {
930 			sc->ihandler[i].inte_mask = inte_mask;
931 			sc->ihandler[i].intr_mask = intr_mask;
932 			sc->ihandler[i].softc = isc;
933 			sc->ihandler[i].irq_func = func;
934 			x = emu_rd(sc, EMU_INTE, 4);
935 			x |= inte_mask;
936 			emu_wr(sc, EMU_INTE, x, 4);
937 			mtx_unlock(&sc->lock);
938 			if (sc->dbg_level > 1)
939 				device_printf(sc->dev, "ihandle %d registered\n", i);
940 
941 			return (i);
942 		}
943 	mtx_unlock(&sc->lock);
944 	if (sc->dbg_level > 1)
945 		device_printf(sc->dev, "ihandle not registered\n");
946 
947 	return (-1);
948 }
949 
950 int
951 emu_intr_unregister(struct emu_sc_info *sc, int hnumber)
952 {
953 	uint32_t x;
954 	int i;
955 
956 	mtx_lock(&sc->lock);
957 
958 	if (sc->ihandler[hnumber].inte_mask == 0) {
959 		mtx_unlock(&sc->lock);
960 		return (-1);
961 	}
962 
963 	x = emu_rd(sc, EMU_INTE, 4);
964 	x &= ~sc->ihandler[hnumber].inte_mask;
965 
966 	sc->ihandler[hnumber].inte_mask = 0;
967 	sc->ihandler[hnumber].intr_mask = 0;
968 	sc->ihandler[hnumber].softc = NULL;
969 	sc->ihandler[hnumber].irq_func = NULL;
970 
971 	/* other interrupt handlers may use this EMU_INTE value */
972 	for (i = 0; i < EMU_MAX_IRQ_CONSUMERS; i++)
973 		if (sc->ihandler[i].inte_mask != 0)
974 			x |= sc->ihandler[i].inte_mask;
975 
976 	emu_wr(sc, EMU_INTE, x, 4);
977 
978 	mtx_unlock(&sc->lock);
979 	return (hnumber);
980 }
981 
982 static void
983 emu_intr(void *p)
984 {
985 	struct emu_sc_info *sc = (struct emu_sc_info *)p;
986 	uint32_t stat, ack;
987 	int i;
988 
989 	for (;;) {
990 		stat = emu_rd(sc, EMU_IPR, 4);
991 		ack = 0;
992 		if (stat == 0)
993 			break;
994 		emu_wr(sc, EMU_IPR, stat, 4);
995 		for (i = 0; i < EMU_MAX_IRQ_CONSUMERS; i++) {
996 			if ((((sc->ihandler[i].intr_mask) & stat) != 0) &&
997 			    (((void *)sc->ihandler[i].irq_func) != NULL)) {
998 				ack |= sc->ihandler[i].irq_func(sc->ihandler[i].softc,
999 				    (sc->ihandler[i].intr_mask) & stat);
1000 			}
1001 		}
1002 	if (sc->dbg_level > 1)
1003 		if (stat & (~ack))
1004 			device_printf(sc->dev, "Unhandled interrupt: %08x\n", stat & (~ack));
1005 
1006 	}
1007 
1008 	if ((sc->is_ca0102) || (sc->is_ca0108))
1009 		for (;;) {
1010 			stat = emu_rd(sc, EMU_IPR2, 4);
1011 			ack = 0;
1012 			if (stat == 0)
1013 				break;
1014 			emu_wr(sc, EMU_IPR2, stat, 4);
1015 			if (sc->dbg_level > 1)
1016 				device_printf(sc->dev, "EMU_IPR2: %08x\n", stat);
1017 
1018 			break;	/* to avoid infinite loop. should be removed
1019 				 * after completion of P16V interface. */
1020 		}
1021 
1022 	if (sc->is_ca0102)
1023 		for (;;) {
1024 			stat = emu_rd(sc, EMU_IPR3, 4);
1025 			ack = 0;
1026 			if (stat == 0)
1027 				break;
1028 			emu_wr(sc, EMU_IPR3, stat, 4);
1029 			if (sc->dbg_level > 1)
1030 				device_printf(sc->dev, "EMU_IPR3: %08x\n", stat);
1031 
1032 			break;	/* to avoid infinite loop. should be removed
1033 				 * after completion of S/PDIF interface */
1034 		}
1035 }
1036 
1037 
1038 /*
1039  * Get data from private emu10kx structure for PCM buffer allocation.
1040  * Used by PCM code only.
1041  */
1042 bus_dma_tag_t
1043 emu_gettag(struct emu_sc_info *sc)
1044 {
1045 	return (sc->mem.dmat);
1046 }
1047 
1048 static void
1049 emu_setmap(void *arg, bus_dma_segment_t * segs, int nseg, int error)
1050 {
1051 	bus_addr_t *phys = (bus_addr_t *) arg;
1052 
1053 	*phys = error ? 0 : (bus_addr_t) segs->ds_addr;
1054 
1055 	if (bootverbose) {
1056 		printf("emu10kx: setmap (%lx, %lx), nseg=%d, error=%d\n",
1057 		    (unsigned long)segs->ds_addr, (unsigned long)segs->ds_len,
1058 		    nseg, error);
1059 	}
1060 }
1061 
1062 static void *
1063 emu_malloc(struct emu_mem *mem, uint32_t sz, bus_addr_t * addr,
1064     bus_dmamap_t *map)
1065 {
1066 	void *dmabuf;
1067 	int error;
1068 
1069 	*addr = 0;
1070 	if ((error = bus_dmamem_alloc(mem->dmat, &dmabuf, BUS_DMA_NOWAIT, map))) {
1071 		if (mem->card->dbg_level > 2)
1072 			device_printf(mem->card->dev, "emu_malloc: failed to alloc DMA map: %d\n", error);
1073 		return (NULL);
1074 		}
1075 	if ((error = bus_dmamap_load(mem->dmat, *map, dmabuf, sz, emu_setmap, addr, 0)) || !*addr) {
1076 		if (mem->card->dbg_level > 2)
1077 			device_printf(mem->card->dev, "emu_malloc: failed to load DMA memory: %d\n", error);
1078 		bus_dmamem_free(mem->dmat, dmabuf, *map);
1079 		return (NULL);
1080 		}
1081 	return (dmabuf);
1082 }
1083 
1084 static void
1085 emu_free(struct emu_mem *mem, void *dmabuf, bus_dmamap_t map)
1086 {
1087 	bus_dmamap_unload(mem->dmat, map);
1088 	bus_dmamem_free(mem->dmat, dmabuf, map);
1089 }
1090 
1091 static void *
1092 emu_memalloc(struct emu_mem *mem, uint32_t sz, bus_addr_t * addr, const char *owner)
1093 {
1094 	uint32_t blksz, start, idx, ofs, tmp, found;
1095 	struct emu_memblk *blk;
1096 	void *membuf;
1097 
1098 	blksz = sz / EMUPAGESIZE;
1099 	if (sz > (blksz * EMUPAGESIZE))
1100 		blksz++;
1101 	if (blksz > EMU_MAX_BUFSZ / EMUPAGESIZE) {
1102 		if (mem->card->dbg_level > 2)
1103 			device_printf(mem->card->dev, "emu_memalloc: memory request tool large\n");
1104 		return (NULL);
1105 		}
1106 	/* find a free block in the bitmap */
1107 	found = 0;
1108 	start = 1;
1109 	while (!found && start + blksz < EMU_MAXPAGES) {
1110 		found = 1;
1111 		for (idx = start; idx < start + blksz; idx++)
1112 			if (mem->bmap[idx >> 3] & (1 << (idx & 7)))
1113 				found = 0;
1114 		if (!found)
1115 			start++;
1116 	}
1117 	if (!found) {
1118 		if (mem->card->dbg_level > 2)
1119 			device_printf(mem->card->dev, "emu_memalloc: no free space in bitmap\n");
1120 		return (NULL);
1121 		}
1122 	blk = malloc(sizeof(*blk), M_DEVBUF, M_NOWAIT);
1123 	if (blk == NULL) {
1124 		if (mem->card->dbg_level > 2)
1125 			device_printf(mem->card->dev, "emu_memalloc: buffer allocation failed\n");
1126 		return (NULL);
1127 		}
1128 	bzero(blk, sizeof(*blk));
1129 	membuf = emu_malloc(mem, sz, &blk->buf_addr, &blk->buf_map);
1130 	*addr = blk->buf_addr;
1131 	if (membuf == NULL) {
1132 		if (mem->card->dbg_level > 2)
1133 			device_printf(mem->card->dev, "emu_memalloc: can't setup HW memory\n");
1134 		free(blk, M_DEVBUF);
1135 		return (NULL);
1136 	}
1137 	blk->buf = membuf;
1138 	blk->pte_start = start;
1139 	blk->pte_size = blksz;
1140 	strncpy(blk->owner, owner, 15);
1141 	blk->owner[15] = '\0';
1142 	ofs = 0;
1143 	for (idx = start; idx < start + blksz; idx++) {
1144 		mem->bmap[idx >> 3] |= 1 << (idx & 7);
1145 		tmp = (uint32_t) (blk->buf_addr + ofs);
1146 		mem->ptb_pages[idx] = (tmp << 1) | idx;
1147 		ofs += EMUPAGESIZE;
1148 	}
1149 	SLIST_INSERT_HEAD(&mem->blocks, blk, link);
1150 	return (membuf);
1151 }
1152 
1153 static int
1154 emu_memfree(struct emu_mem *mem, void *membuf)
1155 {
1156 	uint32_t idx, tmp;
1157 	struct emu_memblk *blk, *i;
1158 
1159 	blk = NULL;
1160 	SLIST_FOREACH(i, &mem->blocks, link) {
1161 		if (i->buf == membuf)
1162 			blk = i;
1163 	}
1164 	if (blk == NULL)
1165 		return (EINVAL);
1166 	SLIST_REMOVE(&mem->blocks, blk, emu_memblk, link);
1167 	emu_free(mem, membuf, blk->buf_map);
1168 	tmp = (uint32_t) (mem->silent_page_addr) << 1;
1169 	for (idx = blk->pte_start; idx < blk->pte_start + blk->pte_size; idx++) {
1170 		mem->bmap[idx >> 3] &= ~(1 << (idx & 7));
1171 		mem->ptb_pages[idx] = tmp | idx;
1172 	}
1173 	free(blk, M_DEVBUF);
1174 	return (0);
1175 }
1176 
1177 static int
1178 emu_memstart(struct emu_mem *mem, void *membuf)
1179 {
1180 	struct emu_memblk *blk, *i;
1181 
1182 	blk = NULL;
1183 	SLIST_FOREACH(i, &mem->blocks, link) {
1184 		if (i->buf == membuf)
1185 			blk = i;
1186 	}
1187 	if (blk == NULL)
1188 		return (-1);
1189 	return (blk->pte_start);
1190 }
1191 
1192 
1193 static uint32_t
1194 emu_rate_to_pitch(uint32_t rate)
1195 {
1196 	static uint32_t logMagTable[128] = {
1197 		0x00000, 0x02dfc, 0x05b9e, 0x088e6, 0x0b5d6, 0x0e26f, 0x10eb3, 0x13aa2,
1198 		0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 0x2118b, 0x23b9a, 0x2655d, 0x28ed5,
1199 		0x2b803, 0x2e0e8, 0x30985, 0x331db, 0x359eb, 0x381b6, 0x3a93d, 0x3d081,
1200 		0x3f782, 0x41e42, 0x444c1, 0x46b01, 0x49101, 0x4b6c4, 0x4dc49, 0x50191,
1201 		0x5269e, 0x54b6f, 0x57006, 0x59463, 0x5b888, 0x5dc74, 0x60029, 0x623a7,
1202 		0x646ee, 0x66a00, 0x68cdd, 0x6af86, 0x6d1fa, 0x6f43c, 0x7164b, 0x73829,
1203 		0x759d4, 0x77b4f, 0x79c9a, 0x7bdb5, 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e,
1204 		0x86082, 0x88089, 0x8a064, 0x8c014, 0x8df98, 0x8fef1, 0x91e20, 0x93d26,
1205 		0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 0x9d5d9, 0x9f3ec, 0xa11d8, 0xa2f9d,
1206 		0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 0xac241, 0xadf26, 0xafbe7, 0xb1885,
1207 		0xb3500, 0xb5157, 0xb6d8c, 0xb899f, 0xba58f, 0xbc15e, 0xbdd0c, 0xbf899,
1208 		0xc1404, 0xc2f50, 0xc4a7b, 0xc6587, 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c,
1209 		0xceaec, 0xd053f, 0xd1f73, 0xd398a, 0xd5384, 0xd6d60, 0xd8720, 0xda0c3,
1210 		0xdba4a, 0xdd3b4, 0xded03, 0xe0636, 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3,
1211 		0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 0xee44c, 0xefc78, 0xf148a, 0xf2c83,
1212 		0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 0xfa2f0, 0xfba57, 0xfd1a7, 0xfe8df
1213 	};
1214 	static char logSlopeTable[128] = {
1215 		0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58,
1216 		0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53,
1217 		0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f,
1218 		0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b,
1219 		0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47,
1220 		0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44,
1221 		0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41,
1222 		0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e,
1223 		0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c,
1224 		0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39,
1225 		0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37,
1226 		0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35,
1227 		0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34,
1228 		0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32,
1229 		0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30,
1230 		0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f
1231 	};
1232 	int i;
1233 
1234 	if (rate == 0)
1235 		return (0);
1236 	rate *= 11185;		/* Scale 48000 to 0x20002380 */
1237 	for (i = 31; i > 0; i--) {
1238 		if (rate & 0x80000000) {	/* Detect leading "1" */
1239 			return (((uint32_t) (i - 15) << 20) +
1240 			    logMagTable[0x7f & (rate >> 24)] +
1241 			    (0x7f & (rate >> 17)) *
1242 			    logSlopeTable[0x7f & (rate >> 24)]);
1243 		}
1244 		rate <<= 1;
1245 	}
1246 	/* NOTREACHED */
1247 	return (0);
1248 }
1249 
1250 static uint32_t
1251 emu_rate_to_linearpitch(uint32_t rate)
1252 {
1253 	rate = (rate << 8) / 375;
1254 	return ((rate >> 1) + (rate & 1));
1255 }
1256 
1257 struct emu_voice *
1258 emu_valloc(struct emu_sc_info *sc)
1259 {
1260 	struct emu_voice *v;
1261 	int i;
1262 
1263 	v = NULL;
1264 	mtx_lock(&sc->lock);
1265 	for (i = 0; i < NUM_G && sc->voice[i].busy; i++);
1266 	if (i < NUM_G) {
1267 		v = &sc->voice[i];
1268 		v->busy = 1;
1269 	}
1270 	mtx_unlock(&sc->lock);
1271 	return (v);
1272 }
1273 
1274 void
1275 emu_vfree(struct emu_sc_info *sc, struct emu_voice *v)
1276 {
1277 	int i, r;
1278 
1279 	mtx_lock(&sc->lock);
1280 	for (i = 0; i < NUM_G; i++) {
1281 		if (v == &sc->voice[i] && sc->voice[i].busy) {
1282 			v->busy = 0;
1283 			/*
1284 			 * XXX What we should do with mono channels?
1285 			 * See -pcm.c emupchan_init for other side of
1286 			 * this problem
1287 			 */
1288 			if (v->slave != NULL)
1289 				r = emu_memfree(&sc->mem, v->vbuf);
1290 		}
1291 	}
1292 	mtx_unlock(&sc->lock);
1293 }
1294 
1295 int
1296 emu_vinit(struct emu_sc_info *sc, struct emu_voice *m, struct emu_voice *s,
1297     uint32_t sz, struct snd_dbuf *b)
1298 {
1299 	void *vbuf;
1300 	bus_addr_t tmp_addr;
1301 
1302 	vbuf = emu_memalloc(&sc->mem, sz, &tmp_addr, "vinit");
1303 	if (vbuf == NULL) {
1304 		if(sc->dbg_level > 2)
1305 			device_printf(sc->dev, "emu_memalloc returns NULL in enu_vinit\n");
1306 		return (ENOMEM);
1307 		}
1308 	if (b != NULL)
1309 		sndbuf_setup(b, vbuf, sz);
1310 	m->start = emu_memstart(&sc->mem, vbuf) * EMUPAGESIZE;
1311 	if (m->start < 0) {
1312 		if(sc->dbg_level > 2)
1313 			device_printf(sc->dev, "emu_memstart returns (-1) in enu_vinit\n");
1314 		emu_memfree(&sc->mem, vbuf);
1315 		return (ENOMEM);
1316 	}
1317 	m->end = m->start + sz;
1318 	m->speed = 0;
1319 	m->b16 = 0;
1320 	m->stereo = 0;
1321 	m->running = 0;
1322 	m->ismaster = 1;
1323 	m->vol = 0xff;
1324 	m->buf = tmp_addr;
1325 	m->vbuf = vbuf;
1326 	m->slave = s;
1327 	if (s != NULL) {
1328 		s->start = m->start;
1329 		s->end = m->end;
1330 		s->speed = 0;
1331 		s->b16 = 0;
1332 		s->stereo = 0;
1333 		s->running = 0;
1334 		s->ismaster = 0;
1335 		s->vol = m->vol;
1336 		s->buf = m->buf;
1337 		s->vbuf = NULL;
1338 		s->slave = NULL;
1339 	}
1340 	return (0);
1341 }
1342 
1343 void
1344 emu_vsetup(struct emu_voice *v, int fmt, int spd)
1345 {
1346 	if (fmt) {
1347 		v->b16 = (fmt & AFMT_16BIT) ? 1 : 0;
1348 		v->stereo = (AFMT_CHANNEL(fmt) > 1) ? 1 : 0;
1349 		if (v->slave != NULL) {
1350 			v->slave->b16 = v->b16;
1351 			v->slave->stereo = v->stereo;
1352 		}
1353 	}
1354 	if (spd) {
1355 		v->speed = spd;
1356 		if (v->slave != NULL)
1357 			v->slave->speed = v->speed;
1358 	}
1359 }
1360 
1361 void
1362 emu_vroute(struct emu_sc_info *sc, struct emu_route *rt,  struct emu_voice *v)
1363 {
1364 	int i;
1365 
1366 	for (i = 0; i < 8; i++) {
1367 		v->routing[i] = rt->routing_left[i];
1368 		v->amounts[i] = rt->amounts_left[i];
1369 	}
1370 	if ((v->stereo) && (v->ismaster == 0))
1371 		for (i = 0; i < 8; i++) {
1372 			v->routing[i] = rt->routing_right[i];
1373 			v->amounts[i] = rt->amounts_right[i];
1374 		}
1375 
1376 	if ((v->stereo) && (v->slave != NULL))
1377 		emu_vroute(sc, rt, v->slave);
1378 }
1379 
1380 void
1381 emu_vwrite(struct emu_sc_info *sc, struct emu_voice *v)
1382 {
1383 	int s;
1384 	uint32_t start, val, silent_page;
1385 
1386 	s = (v->stereo ? 1 : 0) + (v->b16 ? 1 : 0);
1387 
1388 	v->sa = v->start >> s;
1389 	v->ea = v->end >> s;
1390 
1391 
1392 	if (v->stereo) {
1393 		emu_wrptr(sc, v->vnum, EMU_CHAN_CPF, EMU_CHAN_CPF_STEREO_MASK);
1394 	} else {
1395 		emu_wrptr(sc, v->vnum, EMU_CHAN_CPF, 0);
1396 	}
1397 	val = v->stereo ? 28 : 30;
1398 	val *= v->b16 ? 1 : 2;
1399 	start = v->sa + val;
1400 
1401 	if (sc->is_emu10k1) {
1402 		emu_wrptr(sc, v->vnum, EMU_CHAN_FXRT, ((v->routing[3] << 12) |
1403 		    (v->routing[2] << 8) |
1404 		    (v->routing[1] << 4) |
1405 		    (v->routing[0] << 0)) << 16);
1406 	} else {
1407 		emu_wrptr(sc, v->vnum, EMU_A_CHAN_FXRT1, (v->routing[3] << 24) |
1408 		    (v->routing[2] << 16) |
1409 		    (v->routing[1] << 8) |
1410 		    (v->routing[0] << 0));
1411 		emu_wrptr(sc, v->vnum, EMU_A_CHAN_FXRT2, (v->routing[7] << 24) |
1412 		    (v->routing[6] << 16) |
1413 		    (v->routing[5] << 8) |
1414 		    (v->routing[4] << 0));
1415 		emu_wrptr(sc, v->vnum, EMU_A_CHAN_SENDAMOUNTS, (v->amounts[7] << 24) |
1416 		    (v->amounts[6] << 26) |
1417 		    (v->amounts[5] << 8) |
1418 		    (v->amounts[4] << 0));
1419 	}
1420 	emu_wrptr(sc, v->vnum, EMU_CHAN_PTRX, (v->amounts[0] << 8) | (v->amounts[1] << 0));
1421 	emu_wrptr(sc, v->vnum, EMU_CHAN_DSL, v->ea | (v->amounts[3] << 24));
1422 	emu_wrptr(sc, v->vnum, EMU_CHAN_PSST, v->sa | (v->amounts[2] << 24));
1423 
1424 	emu_wrptr(sc, v->vnum, EMU_CHAN_CCCA, start | (v->b16 ? 0 : EMU_CHAN_CCCA_8BITSELECT));
1425 	emu_wrptr(sc, v->vnum, EMU_CHAN_Z1, 0);
1426 	emu_wrptr(sc, v->vnum, EMU_CHAN_Z2, 0);
1427 
1428 	silent_page = ((uint32_t) (sc->mem.silent_page_addr) << 1) | EMU_CHAN_MAP_PTI_MASK;
1429 	emu_wrptr(sc, v->vnum, EMU_CHAN_MAPA, silent_page);
1430 	emu_wrptr(sc, v->vnum, EMU_CHAN_MAPB, silent_page);
1431 
1432 	emu_wrptr(sc, v->vnum, EMU_CHAN_CVCF, EMU_CHAN_CVCF_CURRFILTER_MASK);
1433 	emu_wrptr(sc, v->vnum, EMU_CHAN_VTFT, EMU_CHAN_VTFT_FILTERTARGET_MASK);
1434 	emu_wrptr(sc, v->vnum, EMU_CHAN_ATKHLDM, 0);
1435 	emu_wrptr(sc, v->vnum, EMU_CHAN_DCYSUSM, EMU_CHAN_DCYSUSM_DECAYTIME_MASK);
1436 	emu_wrptr(sc, v->vnum, EMU_CHAN_LFOVAL1, 0x8000);
1437 	emu_wrptr(sc, v->vnum, EMU_CHAN_LFOVAL2, 0x8000);
1438 	emu_wrptr(sc, v->vnum, EMU_CHAN_FMMOD, 0);
1439 	emu_wrptr(sc, v->vnum, EMU_CHAN_TREMFRQ, 0);
1440 	emu_wrptr(sc, v->vnum, EMU_CHAN_FM2FRQ2, 0);
1441 	emu_wrptr(sc, v->vnum, EMU_CHAN_ENVVAL, 0x8000);
1442 
1443 	emu_wrptr(sc, v->vnum, EMU_CHAN_ATKHLDV, EMU_CHAN_ATKHLDV_HOLDTIME_MASK | EMU_CHAN_ATKHLDV_ATTACKTIME_MASK);
1444 	emu_wrptr(sc, v->vnum, EMU_CHAN_ENVVOL, 0x8000);
1445 
1446 	emu_wrptr(sc, v->vnum, EMU_CHAN_PEFE_FILTERAMOUNT, 0x7f);
1447 	emu_wrptr(sc, v->vnum, EMU_CHAN_PEFE_PITCHAMOUNT, 0);
1448 	if ((v->stereo) && (v->slave != NULL))
1449 		emu_vwrite(sc, v->slave);
1450 }
1451 
1452 static void
1453 emu_vstop(struct emu_sc_info *sc, char channel, int enable)
1454 {
1455 	int reg;
1456 
1457 	reg = (channel & 0x20) ? EMU_SOLEH : EMU_SOLEL;
1458 	channel &= 0x1f;
1459 	reg |= 1 << 24;
1460 	reg |= channel << 16;
1461 	emu_wrptr(sc, 0, reg, enable);
1462 }
1463 
1464 void
1465 emu_vtrigger(struct emu_sc_info *sc, struct emu_voice *v, int go)
1466 {
1467 	uint32_t pitch_target, initial_pitch;
1468 	uint32_t cra, cs, ccis;
1469 	uint32_t sample, i;
1470 
1471 	if (go) {
1472 		cra = 64;
1473 		cs = v->stereo ? 4 : 2;
1474 		ccis = v->stereo ? 28 : 30;
1475 		ccis *= v->b16 ? 1 : 2;
1476 		sample = v->b16 ? 0x00000000 : 0x80808080;
1477 		for (i = 0; i < cs; i++)
1478 			emu_wrptr(sc, v->vnum, EMU_CHAN_CD0 + i, sample);
1479 		emu_wrptr(sc, v->vnum, EMU_CHAN_CCR_CACHEINVALIDSIZE, 0);
1480 		emu_wrptr(sc, v->vnum, EMU_CHAN_CCR_READADDRESS, cra);
1481 		emu_wrptr(sc, v->vnum, EMU_CHAN_CCR_CACHEINVALIDSIZE, ccis);
1482 
1483 		emu_wrptr(sc, v->vnum, EMU_CHAN_IFATN, 0xff00);
1484 		emu_wrptr(sc, v->vnum, EMU_CHAN_VTFT, 0xffffffff);
1485 		emu_wrptr(sc, v->vnum, EMU_CHAN_CVCF, 0xffffffff);
1486 		emu_wrptr(sc, v->vnum, EMU_CHAN_DCYSUSV, 0x00007f7f);
1487 		emu_vstop(sc, v->vnum, 0);
1488 
1489 		pitch_target = emu_rate_to_linearpitch(v->speed);
1490 		initial_pitch = emu_rate_to_pitch(v->speed) >> 8;
1491 		emu_wrptr(sc, v->vnum, EMU_CHAN_PTRX_PITCHTARGET, pitch_target);
1492 		emu_wrptr(sc, v->vnum, EMU_CHAN_CPF_PITCH, pitch_target);
1493 		emu_wrptr(sc, v->vnum, EMU_CHAN_IP, initial_pitch);
1494 	} else {
1495 		emu_wrptr(sc, v->vnum, EMU_CHAN_PTRX_PITCHTARGET, 0);
1496 		emu_wrptr(sc, v->vnum, EMU_CHAN_CPF_PITCH, 0);
1497 		emu_wrptr(sc, v->vnum, EMU_CHAN_IFATN, 0xffff);
1498 		emu_wrptr(sc, v->vnum, EMU_CHAN_VTFT, 0x0000ffff);
1499 		emu_wrptr(sc, v->vnum, EMU_CHAN_CVCF, 0x0000ffff);
1500 		emu_wrptr(sc, v->vnum, EMU_CHAN_IP, 0);
1501 		emu_vstop(sc, v->vnum, 1);
1502 	}
1503 	if ((v->stereo) && (v->slave != NULL))
1504 		emu_vtrigger(sc, v->slave, go);
1505 }
1506 
1507 int
1508 emu_vpos(struct emu_sc_info *sc, struct emu_voice *v)
1509 {
1510 	int s, ptr;
1511 
1512 	s = (v->b16 ? 1 : 0) + (v->stereo ? 1 : 0);
1513 	ptr = (emu_rdptr(sc, v->vnum, EMU_CHAN_CCCA_CURRADDR) - (v->start >> s)) << s;
1514 	return (ptr & ~0x0000001f);
1515 }
1516 
1517 
1518 /* fx */
1519 static void
1520 emu_wrefx(struct emu_sc_info *sc, unsigned int pc, unsigned int data)
1521 {
1522 	emu_wrptr(sc, 0, sc->code_base + pc, data);
1523 }
1524 
1525 
1526 static void
1527 emu_addefxop(struct emu_sc_info *sc, unsigned int op, unsigned int z, unsigned int w, unsigned int x, unsigned int y, uint32_t * pc)
1528 {
1529 	if ((*pc) + 1 > sc->code_size) {
1530 		device_printf(sc->dev, "DSP CODE OVERRUN: attept to write past code_size (pc=%d)\n", (*pc));
1531 		return;
1532 	}
1533 	emu_wrefx(sc, (*pc) * 2, (x << sc->high_operand_shift) | y);
1534 	emu_wrefx(sc, (*pc) * 2 + 1, (op << sc->opcode_shift) | (z << sc->high_operand_shift) | w);
1535 	(*pc)++;
1536 }
1537 
1538 static int
1539 sysctl_emu_mixer_control(SYSCTL_HANDLER_ARGS)
1540 {
1541 	struct emu_sc_info *sc;
1542 	int	mixer_id;
1543 	int	new_vol;
1544 	int	err;
1545 
1546 	sc = arg1;
1547 	mixer_id = arg2;
1548 
1549 	new_vol = emumix_get_volume(sc, mixer_id);
1550 	err = sysctl_handle_int(oidp, &new_vol, 0, req);
1551 
1552 	if (err || req->newptr == NULL)
1553 		return (err);
1554 	if (new_vol < 0 || new_vol > 100)
1555 		return (EINVAL);
1556 	emumix_set_volume(sc, mixer_id, new_vol);
1557 
1558 	return (0);
1559 }
1560 
1561 static int
1562 emu_addefxmixer(struct emu_sc_info *sc, const char *mix_name, const int mix_id, uint32_t defvolume)
1563 {
1564 	int volgpr;
1565 	char	sysctl_name[32];
1566 
1567 	volgpr = emu_rm_gpr_alloc(sc->rm, 1);
1568 	emumix_set_fxvol(sc, volgpr, defvolume);
1569 	/*
1570 	 * Mixer controls with NULL mix_name are handled
1571 	 * by AC97 emulation code or PCM mixer.
1572 	 */
1573 	if (mix_name != NULL) {
1574 		/*
1575 		 * Temporary sysctls should start with underscore,
1576 		 * see freebsd-current mailing list, emu10kx driver
1577 		 * discussion around 2006-05-24.
1578 		 */
1579 		snprintf(sysctl_name, 32, "_%s", mix_name);
1580 		SYSCTL_ADD_PROC(sc->ctx,
1581 			SYSCTL_CHILDREN(sc->root),
1582 			OID_AUTO, sysctl_name,
1583 			CTLTYPE_INT | CTLFLAG_RW, sc, mix_id,
1584 			sysctl_emu_mixer_control, "I", "");
1585 	}
1586 
1587 	return (volgpr);
1588 }
1589 
1590 static int
1591 sysctl_emu_digitalswitch_control(SYSCTL_HANDLER_ARGS)
1592 {
1593 	struct emu_sc_info *sc;
1594 	int	new_val;
1595 	int	err;
1596 
1597 	sc = arg1;
1598 
1599 	new_val = (sc->mode == MODE_DIGITAL) ? 1 : 0;
1600 	err = sysctl_handle_int(oidp, &new_val, 0, req);
1601 
1602 	if (err || req->newptr == NULL)
1603 		return (err);
1604 	if (new_val < 0 || new_val > 1)
1605 		return (EINVAL);
1606 
1607 	switch (new_val) {
1608 		case 0:
1609 			emumix_set_mode(sc, MODE_ANALOG);
1610 			break;
1611 		case 1:
1612 			emumix_set_mode(sc, MODE_DIGITAL);
1613 			break;
1614 	}
1615 	return (0);
1616 }
1617 
1618 static void
1619 emu_digitalswitch(struct emu_sc_info *sc)
1620 {
1621 	/* XXX temporary? */
1622 	SYSCTL_ADD_PROC(sc->ctx,
1623 		SYSCTL_CHILDREN(sc->root),
1624 		OID_AUTO, "_digital",
1625 		CTLTYPE_INT | CTLFLAG_RW, sc, 0,
1626 		sysctl_emu_digitalswitch_control, "I", "Enable digital output");
1627 
1628 	return;
1629 }
1630 
1631 /*
1632  * Allocate cache GPRs that will hold mixed output channels
1633  * and clear it on every DSP run.
1634  */
1635 #define	EFX_CACHE(CACHE_IDX) do {				\
1636 	sc->cache_gpr[CACHE_IDX] = emu_rm_gpr_alloc(sc->rm, 1); \
1637 	emu_addefxop(sc, ACC3, 					\
1638 		GPR(sc->cache_gpr[CACHE_IDX]), 			\
1639 		DSP_CONST(0), 					\
1640 		DSP_CONST(0), 					\
1641 		DSP_CONST(0), 					\
1642 		&pc);						\
1643 } while (0)
1644 
1645 /* Allocate GPR for volume control and route sound: OUT = OUT + IN * VOL */
1646 #define	EFX_ROUTE(TITLE, INP_NR, IN_GPR_IDX, OUT_CACHE_IDX, DEF) do { 	\
1647 	sc->mixer_gpr[IN_GPR_IDX] = emu_addefxmixer(sc, TITLE, IN_GPR_IDX,  DEF); \
1648 	sc->mixer_volcache[IN_GPR_IDX] = DEF; 			\
1649 	emu_addefxop(sc, MACS, 					\
1650 		GPR(sc->cache_gpr[OUT_CACHE_IDX]), 		\
1651 		GPR(sc->cache_gpr[OUT_CACHE_IDX]),		\
1652 		INP_NR,						\
1653 		GPR(sc->mixer_gpr[IN_GPR_IDX]),			\
1654 		&pc);						\
1655 } while (0)
1656 
1657 /* allocate GPR, OUT = IN * VOL */
1658 #define	EFX_OUTPUT(TITLE, OUT_CACHE_IDX, OUT_GPR_IDX, OUTP_NR, DEF) do {	\
1659 	sc->mixer_gpr[OUT_GPR_IDX] = emu_addefxmixer(sc, TITLE, OUT_GPR_IDX, DEF); \
1660 	sc->mixer_volcache[OUT_GPR_IDX] = DEF;			\
1661 	emu_addefxop(sc, MACS,					\
1662 		OUTP(OUTP_NR),					\
1663 		DSP_CONST(0),					\
1664 		GPR(sc->cache_gpr[OUT_CACHE_IDX]),		\
1665 		GPR(sc->mixer_gpr[OUT_GPR_IDX]),		\
1666 		&pc);						\
1667 } while (0)
1668 
1669 /* like EFX_OUTPUT, but don't allocate mixer gpr */
1670 #define	EFX_OUTPUTD(OUT_CACHE_IDX, OUT_GPR_IDX, OUTP_NR) do {	\
1671 	emu_addefxop(sc, MACS,					\
1672 		OUTP(OUTP_NR),					\
1673 		DSP_CONST(0),					\
1674 		GPR(sc->cache_gpr[OUT_CACHE_IDX]),		\
1675 		GPR(sc->mixer_gpr[OUT_GPR_IDX]),		\
1676 		&pc);						\
1677 } while (0)
1678 
1679 /* skip next OPCOUNT instructions if FLAG != 0 */
1680 #define EFX_SKIP(OPCOUNT, FLAG_GPR) do {			\
1681 	emu_addefxop(sc, MACS,					\
1682 		DSP_CONST(0),					\
1683 		GPR(sc->mute_gpr[FLAG_GPR]),					\
1684 		DSP_CONST(0),					\
1685 		DSP_CONST(0),					\
1686 		&pc);						\
1687 	emu_addefxop(sc, SKIP,					\
1688 		DSP_CCR,					\
1689 		DSP_CCR,					\
1690 		COND_NEQ_ZERO,					\
1691 		OPCOUNT,					\
1692 		&pc);						\
1693 } while (0)
1694 
1695 #define EFX_COPY(TO, FROM) do {					\
1696 	emu_addefxop(sc, ACC3,					\
1697 		TO,						\
1698 		DSP_CONST(0),					\
1699 		DSP_CONST(0),					\
1700 		FROM,						\
1701 		&pc);						\
1702 } while (0)
1703 
1704 
1705 static void
1706 emu_initefx(struct emu_sc_info *sc)
1707 {
1708 	unsigned int i;
1709 	uint32_t pc;
1710 
1711 	/* stop DSP */
1712 	if (sc->is_emu10k1) {
1713 		emu_wrptr(sc, 0, EMU_DBG, EMU_DBG_SINGLE_STEP);
1714 	} else {
1715 		emu_wrptr(sc, 0, EMU_A_DBG, EMU_A_DBG_SINGLE_STEP);
1716 	}
1717 
1718 	/* code size is in instructions */
1719 	pc = 0;
1720 	for (i = 0; i < sc->code_size; i++) {
1721 		if (sc->is_emu10k1) {
1722 			emu_addefxop(sc, ACC3, DSP_CONST(0x0), DSP_CONST(0x0), DSP_CONST(0x0), DSP_CONST(0x0), &pc);
1723 		} else {
1724 			emu_addefxop(sc, SKIP, DSP_CONST(0x0), DSP_CONST(0x0), DSP_CONST(0xf), DSP_CONST(0x0), &pc);
1725 		}
1726 	}
1727 
1728 	/* allocate GPRs for mute switches (EFX_SKIP). Mute by default */
1729 	for (i = 0; i < NUM_MUTE; i++) {
1730 		sc->mute_gpr[i] = emu_rm_gpr_alloc(sc->rm, 1);
1731 		emumix_set_gpr(sc, sc->mute_gpr[i], 1);
1732 	}
1733 	emu_digitalswitch(sc);
1734 
1735 	pc = 0;
1736 
1737 	/*
1738 	 * DSP code below is not good, because:
1739 	 * 1. It can be written smaller, if it can use DSP accumulator register
1740 	 * instead of cache_gpr[].
1741 	 * 2. It can be more careful when volume is 100%, because in DSP
1742 	 * x*0x7fffffff may not be equal to x !
1743 	 */
1744 
1745 	/* clean outputs */
1746 	for (i = 0; i < 16 ; i++) {
1747 		emu_addefxop(sc, ACC3, OUTP(i), DSP_CONST(0), DSP_CONST(0), DSP_CONST(0), &pc);
1748 	}
1749 
1750 
1751 	if (sc->is_emu10k1) {
1752 		EFX_CACHE(C_FRONT_L);
1753 		EFX_CACHE(C_FRONT_R);
1754 		EFX_CACHE(C_REC_L);
1755 		EFX_CACHE(C_REC_R);
1756 
1757 		/* fx0 to front/record, 100%/muted by default */
1758 		EFX_ROUTE("pcm_front_l", FX(0), M_FX0_FRONT_L, C_FRONT_L, 100);
1759 		EFX_ROUTE("pcm_front_r", FX(1), M_FX1_FRONT_R, C_FRONT_R, 100);
1760 		EFX_ROUTE(NULL, FX(0), M_FX0_REC_L, C_REC_L, 0);
1761 		EFX_ROUTE(NULL, FX(1), M_FX1_REC_R, C_REC_R, 0);
1762 
1763 		/* in0, from AC97 codec output */
1764 		EFX_ROUTE("ac97_front_l", INP(IN_AC97_L), M_IN0_FRONT_L, C_FRONT_L, 0);
1765 		EFX_ROUTE("ac97_front_r", INP(IN_AC97_R), M_IN0_FRONT_R, C_FRONT_R, 0);
1766 		EFX_ROUTE("ac97_rec_l", INP(IN_AC97_L), M_IN0_REC_L, C_REC_L, 0);
1767 		EFX_ROUTE("ac97_rec_r", INP(IN_AC97_R), M_IN0_REC_R, C_REC_R, 0);
1768 
1769 		/* in1, from CD S/PDIF */
1770 		/* XXX EFX_SKIP 4 assumes that each EFX_ROUTE is one DSP op */
1771 		EFX_SKIP(4, CDSPDIFMUTE);
1772 		EFX_ROUTE(NULL, INP(IN_SPDIF_CD_L), M_IN1_FRONT_L, C_FRONT_L, 0);
1773 		EFX_ROUTE(NULL, INP(IN_SPDIF_CD_R), M_IN1_FRONT_R, C_FRONT_R, 0);
1774 		EFX_ROUTE(NULL, INP(IN_SPDIF_CD_L), M_IN1_REC_L, C_REC_L, 0);
1775 		EFX_ROUTE(NULL, INP(IN_SPDIF_CD_R), M_IN1_REC_R, C_REC_R, 0);
1776 
1777 		if (sc->dbg_level > 0) {
1778 			/* in2, ZoomVide (???) */
1779 			EFX_ROUTE("zoom_front_l", INP(IN_ZOOM_L), M_IN2_FRONT_L, C_FRONT_L, 0);
1780 			EFX_ROUTE("zoom_front_r", INP(IN_ZOOM_R), M_IN2_FRONT_R, C_FRONT_R, 0);
1781 			EFX_ROUTE("zoom_rec_l", INP(IN_ZOOM_L), M_IN2_REC_L, C_REC_L, 0);
1782 			EFX_ROUTE("zoom_rec_r", INP(IN_ZOOM_R), M_IN2_REC_R, C_REC_R, 0);
1783 		}
1784 
1785 		/* in3, TOSLink  */
1786 		EFX_ROUTE(NULL, INP(IN_TOSLINK_L), M_IN3_FRONT_L, C_FRONT_L, 0);
1787 		EFX_ROUTE(NULL, INP(IN_TOSLINK_R), M_IN3_FRONT_R, C_FRONT_R, 0);
1788 		EFX_ROUTE(NULL, INP(IN_TOSLINK_L), M_IN3_REC_L, C_REC_L, 0);
1789 		EFX_ROUTE(NULL, INP(IN_TOSLINK_R), M_IN3_REC_R, C_REC_R, 0);
1790 		/* in4, LineIn  */
1791 		EFX_ROUTE(NULL, INP(IN_LINE1_L), M_IN4_FRONT_L, C_FRONT_L, 0);
1792 		EFX_ROUTE(NULL, INP(IN_LINE1_R), M_IN4_FRONT_R, C_FRONT_R, 0);
1793 		EFX_ROUTE(NULL, INP(IN_LINE1_L), M_IN4_REC_L, C_REC_L, 0);
1794 		EFX_ROUTE(NULL, INP(IN_LINE1_R), M_IN4_REC_R, C_REC_R, 0);
1795 
1796 		/* in5, on-card S/PDIF */
1797 		EFX_ROUTE(NULL, INP(IN_COAX_SPDIF_L), M_IN5_FRONT_L, C_FRONT_L, 0);
1798 		EFX_ROUTE(NULL, INP(IN_COAX_SPDIF_R), M_IN5_FRONT_R, C_FRONT_R, 0);
1799 		EFX_ROUTE(NULL, INP(IN_COAX_SPDIF_L), M_IN5_REC_L, C_REC_L, 0);
1800 		EFX_ROUTE(NULL, INP(IN_COAX_SPDIF_R), M_IN5_REC_R, C_REC_R, 0);
1801 
1802 		/* in6, Line2 on Live!Drive */
1803 		EFX_ROUTE(NULL, INP(IN_LINE2_L), M_IN6_FRONT_L, C_FRONT_L, 0);
1804 		EFX_ROUTE(NULL, INP(IN_LINE2_R), M_IN6_FRONT_R, C_FRONT_R, 0);
1805 		EFX_ROUTE(NULL, INP(IN_LINE2_L), M_IN6_REC_L, C_REC_L, 0);
1806 		EFX_ROUTE(NULL, INP(IN_LINE2_R), M_IN6_REC_R, C_REC_R, 0);
1807 
1808 		if (sc->dbg_level > 0) {
1809 			/* in7, unknown */
1810 			EFX_ROUTE("in7_front_l", INP(0xE), M_IN7_FRONT_L, C_FRONT_L, 0);
1811 			EFX_ROUTE("in7_front_r", INP(0xF), M_IN7_FRONT_R, C_FRONT_R, 0);
1812 			EFX_ROUTE("in7_rec_l", INP(0xE), M_IN7_REC_L, C_REC_L, 0);
1813 			EFX_ROUTE("in7_rec_r", INP(0xF), M_IN7_REC_R, C_REC_R, 0);
1814 		}
1815 
1816 		/* analog and digital */
1817 		EFX_OUTPUT("master_front_l", C_FRONT_L, M_MASTER_FRONT_L, OUT_AC97_L, 100);
1818 		EFX_OUTPUT("master_front_r", C_FRONT_R, M_MASTER_FRONT_R, OUT_AC97_R, 100);
1819 		/* S/PDIF */
1820 		EFX_OUTPUTD(C_FRONT_L, M_MASTER_FRONT_L, OUT_TOSLINK_L);
1821 		EFX_OUTPUTD(C_FRONT_R, M_MASTER_FRONT_R, OUT_TOSLINK_R);
1822 		/* Headphones */
1823 		EFX_OUTPUTD(C_FRONT_L, M_MASTER_FRONT_L, OUT_HEADPHONE_L);
1824 		EFX_OUTPUTD(C_FRONT_R, M_MASTER_FRONT_R, OUT_HEADPHONE_R);
1825 
1826 		/* rec output to "ADC" */
1827 		EFX_OUTPUT("master_rec_l", C_REC_L, M_MASTER_REC_L, OUT_ADC_REC_L, 100);
1828 		EFX_OUTPUT("master_rec_r", C_REC_R, M_MASTER_REC_R, OUT_ADC_REC_R, 100);
1829 
1830 		if (!(sc->mch_disabled)) {
1831 			/*
1832 			 * Additional channel volume is controlled by mixer in
1833 			 * emu_dspmixer_set() in -pcm.c
1834 			 */
1835 
1836 			/* fx2/3 (pcm1) to rear */
1837 			EFX_CACHE(C_REAR_L);
1838 			EFX_CACHE(C_REAR_R);
1839 			EFX_ROUTE(NULL, FX(2), M_FX2_REAR_L, C_REAR_L, 100);
1840 			EFX_ROUTE(NULL, FX(3), M_FX3_REAR_R, C_REAR_R, 100);
1841 
1842 			EFX_OUTPUT(NULL, C_REAR_L, M_MASTER_REAR_L, OUT_REAR_L, 100);
1843 			EFX_OUTPUT(NULL, C_REAR_R, M_MASTER_REAR_R, OUT_REAR_R, 100);
1844 			if (sc->has_51) {
1845 				/* fx4 (pcm2) to center */
1846 				EFX_CACHE(C_CENTER);
1847 				EFX_ROUTE(NULL, FX(4), M_FX4_CENTER, C_CENTER, 100);
1848 				EFX_OUTPUT(NULL, C_CENTER, M_MASTER_CENTER, OUT_D_CENTER, 100);
1849 
1850 				/* XXX in digital mode (default) this should be muted because
1851 				this output is shared with digital out */
1852 				EFX_SKIP(1, ANALOGMUTE);
1853 				EFX_OUTPUTD(C_CENTER, M_MASTER_CENTER, OUT_A_CENTER);
1854 
1855 				/* fx5 (pcm3) to sub */
1856 				EFX_CACHE(C_SUB);
1857 				EFX_ROUTE(NULL, FX(5), M_FX5_SUBWOOFER, C_SUB, 100);
1858 				EFX_OUTPUT(NULL, C_SUB, M_MASTER_SUBWOOFER, OUT_D_SUB, 100);
1859 
1860 				/* XXX in digital mode (default) this should be muted because
1861 				this output is shared with digital out */
1862 				EFX_SKIP(1, ANALOGMUTE);
1863 				EFX_OUTPUTD(C_SUB, M_MASTER_SUBWOOFER, OUT_A_SUB);
1864 
1865 			}
1866 		} else {
1867 			/* SND_EMU10KX_MULTICHANNEL_DISABLED */
1868 			EFX_OUTPUT(NULL, C_FRONT_L, M_MASTER_REAR_L, OUT_REAR_L, 57); /* 75%*75% */
1869 			EFX_OUTPUT(NULL, C_FRONT_R, M_MASTER_REAR_R, OUT_REAR_R, 57); /* 75%*75% */
1870 
1871 #if 0
1872 			/* XXX 5.1 does not work */
1873 
1874 			if (sc->has_51) {
1875 				/* (fx0+fx1)/2 to center */
1876 				EFX_CACHE(C_CENTER);
1877 				emu_addefxop(sc, MACS,
1878 					GPR(sc->cache_gpr[C_CENTER]),
1879 					GPR(sc->cache_gpr[C_CENTER]),
1880 					DSP_CONST(0xd), /* = 1/2 */
1881 					GPR(sc->cache_gpr[C_FRONT_L]),
1882 					&pc);
1883 				emu_addefxop(sc, MACS,
1884 					GPR(sc->cache_gpr[C_CENTER]),
1885 					GPR(sc->cache_gpr[C_CENTER]),
1886 					DSP_CONST(0xd), /* = 1/2 */
1887 					GPR(sc->cache_gpr[C_FRONT_R]),
1888 					&pc);
1889 				EFX_OUTPUT(NULL, C_CENTER, M_MASTER_CENTER, OUT_D_CENTER, 100);
1890 
1891 				/* XXX in digital mode (default) this should be muted because
1892 				this output is shared with digital out */
1893 				EFX_SKIP(1, ANALOGMUTE);
1894 				EFX_OUTPUTD(C_CENTER, M_MASTER_CENTER, OUT_A_CENTER);
1895 
1896 				/* (fx0+fx1)/2  to sub */
1897 				EFX_CACHE(C_SUB);
1898 				emu_addefxop(sc, MACS,
1899 					GPR(sc->cache_gpr[C_CENTER]),
1900 					GPR(sc->cache_gpr[C_CENTER]),
1901 					DSP_CONST(0xd), /* = 1/2 */
1902 					GPR(sc->cache_gpr[C_FRONT_L]),
1903 					&pc);
1904 				emu_addefxop(sc, MACS,
1905 					GPR(sc->cache_gpr[C_CENTER]),
1906 					GPR(sc->cache_gpr[C_CENTER]),
1907 					DSP_CONST(0xd), /* = 1/2 */
1908 					GPR(sc->cache_gpr[C_FRONT_R]),
1909 					&pc);
1910 				/* XXX add lowpass filter here */
1911 
1912 				EFX_OUTPUT(NULL, C_SUB, M_MASTER_SUBWOOFER, OUT_D_SUB, 100);
1913 
1914 				/* XXX in digital mode (default) this should be muted because
1915 				this output is shared with digital out */
1916 				EFX_SKIP(1, ANALOGMUTE);
1917 				EFX_OUTPUTD(C_SUB, M_MASTER_SUBWOOFER, OUT_A_SUB);
1918 			}
1919 #endif
1920 		} /* !mch_disabled */
1921 		if (sc->mch_rec) {
1922 			/*
1923 			 * MCH RECORDING , hight 16 slots. On 5.1 cards first 4 slots
1924 			 * are used as outputs and already filled with data
1925 			 */
1926 			/*
1927 			 * XXX On Live! cards stream does not begin at zero offset.
1928 			 * It can be HW, driver or sound buffering problem.
1929 			 * Use sync substream (offset 0x3E) to let userland find
1930 			 * correct data.
1931 			 */
1932 
1933 			/*
1934 			 * Substream map (in byte offsets, each substream is 2 bytes):
1935 			 *	0x00..0x1E - outputs
1936 			 *	0x20..0x3E - FX, inputs and sync stream
1937 			 */
1938 
1939 			/* First 2 channels (offset 0x20,0x22) are empty */
1940 			for(i = (sc->has_51 ? 2 : 0); i < 2; i++)
1941 				EFX_COPY(FX2(i), DSP_CONST(0));
1942 
1943 			/* PCM Playback monitoring, offset 0x24..0x2A */
1944 			for(i = 0; i < 4; i++)
1945 				EFX_COPY(FX2(i+2), FX(i));
1946 
1947 			/* Copy of some inputs, offset 0x2C..0x3C */
1948 			for(i = 0; i < 9; i++)
1949 				EFX_COPY(FX2(i+8), INP(i));
1950 
1951 			/* sync data (0xc0de, offset 0x3E) */
1952 			sc->dummy_gpr = emu_rm_gpr_alloc(sc->rm, 1);
1953 			emumix_set_gpr(sc, sc->dummy_gpr, 0xc0de0000);
1954 
1955 			EFX_COPY(FX2(15), GPR(sc->dummy_gpr));
1956 		} /* mch_rec */
1957 	} else /* emu10k2 and later */ {
1958 		EFX_CACHE(C_FRONT_L);
1959 		EFX_CACHE(C_FRONT_R);
1960 		EFX_CACHE(C_REC_L);
1961 		EFX_CACHE(C_REC_R);
1962 
1963 		/* fx0 to front/record, 100%/muted by default */
1964 		/*
1965 		 * FRONT_[L|R] is controlled by AC97 emulation in
1966 		 * emu_ac97_[read|write]_emulation in -pcm.c
1967 		 */
1968 		EFX_ROUTE(NULL, FX(0), M_FX0_FRONT_L, C_FRONT_L, 100);
1969 		EFX_ROUTE(NULL, FX(1), M_FX1_FRONT_R, C_FRONT_R, 100);
1970 		EFX_ROUTE(NULL, FX(0), M_FX0_REC_L, C_REC_L, 0);
1971 		EFX_ROUTE(NULL, FX(1), M_FX1_REC_R, C_REC_R, 0);
1972 
1973 		/* in0, from AC97 codec output */
1974 		EFX_ROUTE(NULL, INP(A_IN_AC97_L), M_IN0_FRONT_L, C_FRONT_L, 100);
1975 		EFX_ROUTE(NULL, INP(A_IN_AC97_R), M_IN0_FRONT_R, C_FRONT_R, 100);
1976 		EFX_ROUTE(NULL, INP(A_IN_AC97_L), M_IN0_REC_L, C_REC_L, 0);
1977 		EFX_ROUTE(NULL, INP(A_IN_AC97_R), M_IN0_REC_R, C_REC_R, 0);
1978 
1979 		/* in1, from CD S/PDIF */
1980 		EFX_ROUTE(NULL, INP(A_IN_SPDIF_CD_L), M_IN1_FRONT_L, C_FRONT_L, 0);
1981 		EFX_ROUTE(NULL, INP(A_IN_SPDIF_CD_R), M_IN1_FRONT_R, C_FRONT_R, 0);
1982 		EFX_ROUTE(NULL, INP(A_IN_SPDIF_CD_L), M_IN1_REC_L, C_REC_L, 0);
1983 		EFX_ROUTE(NULL, INP(A_IN_SPDIF_CD_R), M_IN1_REC_R, C_REC_R, 0);
1984 
1985 		/* in2, optical & coax S/PDIF on AudigyDrive*/
1986 		/* XXX Should be muted when GPRSCS valid stream == 0 */
1987 		EFX_ROUTE(NULL, INP(A_IN_O_SPDIF_L), M_IN2_FRONT_L, C_FRONT_L, 0);
1988 		EFX_ROUTE(NULL, INP(A_IN_O_SPDIF_R), M_IN2_FRONT_R, C_FRONT_R, 0);
1989 		EFX_ROUTE(NULL, INP(A_IN_O_SPDIF_L), M_IN2_REC_L, C_REC_L, 0);
1990 		EFX_ROUTE(NULL, INP(A_IN_O_SPDIF_R), M_IN2_REC_R, C_REC_R, 0);
1991 
1992 		if (sc->dbg_level > 0) {
1993 			/* in3, unknown */
1994 			EFX_ROUTE("in3_front_l", INP(0x6), M_IN3_FRONT_L, C_FRONT_L, 0);
1995 			EFX_ROUTE("in3_front_r", INP(0x7), M_IN3_FRONT_R, C_FRONT_R, 0);
1996 			EFX_ROUTE("in3_rec_l", INP(0x6), M_IN3_REC_L, C_REC_L, 0);
1997 			EFX_ROUTE("in3_rec_r", INP(0x7), M_IN3_REC_R, C_REC_R, 0);
1998 		}
1999 
2000 		/* in4, LineIn 2 on AudigyDrive */
2001 		EFX_ROUTE(NULL, INP(A_IN_LINE2_L), M_IN4_FRONT_L, C_FRONT_L, 0);
2002 		EFX_ROUTE(NULL, INP(A_IN_LINE2_R), M_IN4_FRONT_R, C_FRONT_R, 0);
2003 		EFX_ROUTE(NULL, INP(A_IN_LINE2_L), M_IN4_REC_L, C_REC_L, 0);
2004 		EFX_ROUTE(NULL, INP(A_IN_LINE2_R), M_IN4_REC_R, C_REC_R, 0);
2005 
2006 		/* in5, on-card S/PDIF */
2007 		EFX_ROUTE(NULL, INP(A_IN_R_SPDIF_L), M_IN5_FRONT_L, C_FRONT_L, 0);
2008 		EFX_ROUTE(NULL, INP(A_IN_R_SPDIF_R), M_IN5_FRONT_R, C_FRONT_R, 0);
2009 		EFX_ROUTE(NULL, INP(A_IN_R_SPDIF_L), M_IN5_REC_L, C_REC_L, 0);
2010 		EFX_ROUTE(NULL, INP(A_IN_R_SPDIF_R), M_IN5_REC_R, C_REC_R, 0);
2011 
2012 		/* in6, AUX2 on AudigyDrive */
2013 		EFX_ROUTE(NULL, INP(A_IN_AUX2_L), M_IN6_FRONT_L, C_FRONT_L, 0);
2014 		EFX_ROUTE(NULL, INP(A_IN_AUX2_R), M_IN6_FRONT_R, C_FRONT_R, 0);
2015 		EFX_ROUTE(NULL, INP(A_IN_AUX2_L), M_IN6_REC_L, C_REC_L, 0);
2016 		EFX_ROUTE(NULL, INP(A_IN_AUX2_R), M_IN6_REC_R, C_REC_R, 0);
2017 
2018 		if (sc->dbg_level > 0) {
2019 			/* in7, unknown */
2020 			EFX_ROUTE("in7_front_l", INP(0xE), M_IN7_FRONT_L, C_FRONT_L, 0);
2021 			EFX_ROUTE("in7_front_r", INP(0xF), M_IN7_FRONT_R, C_FRONT_R, 0);
2022 			EFX_ROUTE("in7_rec_l", INP(0xE), M_IN7_REC_L, C_REC_L, 0);
2023 			EFX_ROUTE("in7_rec_r", INP(0xF), M_IN7_REC_R, C_REC_R, 0);
2024 		}
2025 
2026 		/* front output to headphones and  alog and digital *front */
2027 		/* volume controlled by AC97 emulation */
2028 		EFX_OUTPUT(NULL, C_FRONT_L, M_MASTER_FRONT_L, A_OUT_A_FRONT_L, 100);
2029 		EFX_OUTPUT(NULL, C_FRONT_R, M_MASTER_FRONT_R, A_OUT_A_FRONT_R, 100);
2030 		EFX_OUTPUTD(C_FRONT_L, M_MASTER_FRONT_L, A_OUT_D_FRONT_L);
2031 		EFX_OUTPUTD(C_FRONT_R, M_MASTER_FRONT_R, A_OUT_D_FRONT_R);
2032 		EFX_OUTPUTD(C_FRONT_L, M_MASTER_FRONT_L, A_OUT_HPHONE_L);
2033 		EFX_OUTPUTD(C_FRONT_R, M_MASTER_FRONT_R, A_OUT_HPHONE_R);
2034 
2035 		/* rec output to "ADC" */
2036 		/* volume controlled by AC97 emulation */
2037 		EFX_OUTPUT(NULL, C_REC_L, M_MASTER_REC_L, A_OUT_ADC_REC_L, 100);
2038 		EFX_OUTPUT(NULL, C_REC_R, M_MASTER_REC_R, A_OUT_ADC_REC_R, 100);
2039 
2040 		if (!(sc->mch_disabled)) {
2041 			/*
2042 			 * Additional channel volume is controlled by mixer in
2043 			 * emu_dspmixer_set() in -pcm.c
2044 			 */
2045 
2046 			/* fx2/3 (pcm1) to rear */
2047 			EFX_CACHE(C_REAR_L);
2048 			EFX_CACHE(C_REAR_R);
2049 			EFX_ROUTE(NULL, FX(2), M_FX2_REAR_L, C_REAR_L, 100);
2050 			EFX_ROUTE(NULL, FX(3), M_FX3_REAR_R, C_REAR_R, 100);
2051 
2052 			EFX_OUTPUT(NULL, C_REAR_L, M_MASTER_REAR_L, A_OUT_A_REAR_L, 100);
2053 			EFX_OUTPUT(NULL, C_REAR_R, M_MASTER_REAR_R, A_OUT_A_REAR_R, 100);
2054 			EFX_OUTPUTD(C_REAR_L, M_MASTER_REAR_L, A_OUT_D_REAR_L);
2055 			EFX_OUTPUTD(C_REAR_R, M_MASTER_REAR_R, A_OUT_D_REAR_R);
2056 
2057 			/* fx4 (pcm2) to center */
2058 			EFX_CACHE(C_CENTER);
2059 			EFX_ROUTE(NULL, FX(4), M_FX4_CENTER, C_CENTER, 100);
2060 			EFX_OUTPUT(NULL, C_CENTER, M_MASTER_CENTER, A_OUT_D_CENTER, 100);
2061 #if 0
2062 			/*
2063 			 * XXX in digital mode (default) this should be muted
2064 			 * because this output is shared with digital out
2065 			 */
2066 			EFX_OUTPUTD(C_CENTER, M_MASTER_CENTER, A_OUT_A_CENTER);
2067 #endif
2068 			/* fx5 (pcm3) to sub */
2069 			EFX_CACHE(C_SUB);
2070 			EFX_ROUTE(NULL, FX(5), M_FX5_SUBWOOFER, C_SUB, 100);
2071 			EFX_OUTPUT(NULL, C_SUB, M_MASTER_SUBWOOFER, A_OUT_D_SUB, 100);
2072 #if 0
2073 			/*
2074 			 * XXX in digital mode (default) this should be muted
2075 			 * because this output is shared with digital out
2076 			 */
2077 			EFX_OUTPUTD(C_SUB, M_MASTER_SUBWOOFER, A_OUT_A_SUB);
2078 #endif
2079 			if (sc->has_71) {
2080 				/* XXX this will broke headphones on AudigyDrive */
2081 				/* fx6/7 (pcm4) to side */
2082 				EFX_CACHE(C_SIDE_L);
2083 				EFX_CACHE(C_SIDE_R);
2084 				EFX_ROUTE(NULL, FX(6), M_FX6_SIDE_L, C_SIDE_L, 100);
2085 				EFX_ROUTE(NULL, FX(7), M_FX7_SIDE_R, C_SIDE_R, 100);
2086 				EFX_OUTPUT(NULL, C_SIDE_L, M_MASTER_SIDE_L, A_OUT_A_SIDE_L, 100);
2087 				EFX_OUTPUT(NULL, C_SIDE_R, M_MASTER_SIDE_R, A_OUT_A_SIDE_R, 100);
2088 				EFX_OUTPUTD(C_SIDE_L, M_MASTER_SIDE_L, A_OUT_D_SIDE_L);
2089 				EFX_OUTPUTD(C_SIDE_R, M_MASTER_SIDE_R, A_OUT_D_SIDE_R);
2090 			}
2091 		} else {	/* mch_disabled */
2092 			EFX_OUTPUTD(C_FRONT_L, M_MASTER_FRONT_L, A_OUT_A_REAR_L);
2093 			EFX_OUTPUTD(C_FRONT_R, M_MASTER_FRONT_R, A_OUT_A_REAR_R);
2094 
2095 			EFX_OUTPUTD(C_FRONT_L, M_MASTER_FRONT_L, A_OUT_D_REAR_L);
2096 			EFX_OUTPUTD(C_FRONT_R, M_MASTER_FRONT_R, A_OUT_D_REAR_R);
2097 
2098 			if (sc->has_51) {
2099 				/* (fx0+fx1)/2 to center */
2100 				EFX_CACHE(C_CENTER);
2101 				emu_addefxop(sc, MACS,
2102 					GPR(sc->cache_gpr[C_CENTER]),
2103 					GPR(sc->cache_gpr[C_CENTER]),
2104 					DSP_CONST(0xd), /* = 1/2 */
2105 					GPR(sc->cache_gpr[C_FRONT_L]),
2106 					&pc);
2107 				emu_addefxop(sc, MACS,
2108 					GPR(sc->cache_gpr[C_CENTER]),
2109 					GPR(sc->cache_gpr[C_CENTER]),
2110 					DSP_CONST(0xd), /* = 1/2 */
2111 					GPR(sc->cache_gpr[C_FRONT_R]),
2112 					&pc);
2113 				EFX_OUTPUT(NULL, C_CENTER, M_MASTER_CENTER, A_OUT_D_CENTER, 100);
2114 
2115 				/* XXX in digital mode (default) this should be muted because
2116 				this output is shared with digital out */
2117 				EFX_SKIP(1, ANALOGMUTE);
2118 				EFX_OUTPUTD(C_CENTER, M_MASTER_CENTER, A_OUT_A_CENTER);
2119 
2120 				/* (fx0+fx1)/2  to sub */
2121 				EFX_CACHE(C_SUB);
2122 				emu_addefxop(sc, MACS,
2123 					GPR(sc->cache_gpr[C_SUB]),
2124 					GPR(sc->cache_gpr[C_SUB]),
2125 					DSP_CONST(0xd), /* = 1/2 */
2126 					GPR(sc->cache_gpr[C_FRONT_L]),
2127 					&pc);
2128 				emu_addefxop(sc, MACS,
2129 					GPR(sc->cache_gpr[C_SUB]),
2130 					GPR(sc->cache_gpr[C_SUB]),
2131 					DSP_CONST(0xd), /* = 1/2 */
2132 					GPR(sc->cache_gpr[C_FRONT_R]),
2133 					&pc);
2134 				/* XXX add lowpass filter here */
2135 
2136 				EFX_OUTPUT(NULL, C_SUB, M_MASTER_SUBWOOFER, A_OUT_D_SUB, 100);
2137 
2138 				/* XXX in digital mode (default) this should be muted because
2139 				this output is shared with digital out */
2140 				EFX_SKIP(1, ANALOGMUTE);
2141 				EFX_OUTPUTD(C_SUB, M_MASTER_SUBWOOFER, A_OUT_A_SUB);
2142 			}
2143 		} /* mch_disabled */
2144 		if (sc->mch_rec) {
2145 			/* MCH RECORDING, high 32 slots */
2146 
2147 			/*
2148 			 * Stream map (in byte offsets):
2149 			 *	0x00..0x3E - outputs
2150 			 *	0x40..0x7E - FX, inputs
2151 			 *	each substream is 2 bytes.
2152 			 */
2153 			/*
2154 			 * XXX Audigy 2 Value cards (and, possibly,
2155 			 * Audigy 4) write some unknown data in place of
2156 			 * some outputs (offsets 0x20..0x3F) and one
2157 			 * input (offset 0x7E).
2158 			 */
2159 
2160 			/* PCM Playback monitoring, offsets 0x40..0x5E */
2161 			for(i = 0; i < 16; i++)
2162 				EFX_COPY(FX2(i), FX(i));
2163 
2164 			/* Copy of all inputs, offsets 0x60..0x7E */
2165 			for(i = 0; i < 16; i++)
2166 				EFX_COPY(FX2(i+16), INP(i));
2167 #if 0
2168 			/* XXX Audigy seems to work correct and does not need this */
2169 			/* sync data (0xc0de), offset 0x7E */
2170 			sc->dummy_gpr = emu_rm_gpr_alloc(sc->rm, 1);
2171 			emumix_set_gpr(sc, sc->dummy_gpr, 0xc0de0000);
2172 			EFX_COPY(FX2(31), GPR(sc->dummy_gpr));
2173 #endif
2174 		} /* mch_rec */
2175 	}
2176 
2177 	sc->routing_code_end = pc;
2178 
2179 	/* start DSP */
2180 	if (sc->is_emu10k1) {
2181 		emu_wrptr(sc, 0, EMU_DBG, 0);
2182 	} else {
2183 		emu_wrptr(sc, 0, EMU_A_DBG, 0);
2184 	}
2185 }
2186 
2187 /* /dev/em10kx */
2188 static d_open_t		emu10kx_open;
2189 static d_close_t	emu10kx_close;
2190 static d_read_t		emu10kx_read;
2191 
2192 static struct cdevsw emu10kx_cdevsw = {
2193 	.d_open = 	emu10kx_open,
2194 	.d_close =	emu10kx_close,
2195 	.d_read = 	emu10kx_read,
2196 	.d_name = 	"emu10kx",
2197 	.d_version = 	D_VERSION,
2198 };
2199 
2200 
2201 static int
2202 emu10kx_open(struct cdev *i_dev, int flags __unused, int mode __unused, struct thread *td __unused)
2203 {
2204 	int error;
2205 	struct emu_sc_info *sc;
2206 
2207 	sc = i_dev->si_drv1;
2208 	mtx_lock(&sc->emu10kx_lock);
2209 	if (sc->emu10kx_isopen) {
2210 		mtx_unlock(&sc->emu10kx_lock);
2211 		return (EBUSY);
2212 	}
2213 	sc->emu10kx_isopen = 1;
2214 	mtx_unlock(&sc->emu10kx_lock);
2215 	if (sbuf_new(&sc->emu10kx_sbuf, NULL, 4096, 0) == NULL) {
2216 		error = ENXIO;
2217 		goto out;
2218 	}
2219 	sc->emu10kx_bufptr = 0;
2220 	error = (emu10kx_prepare(sc, &sc->emu10kx_sbuf) > 0) ? 0 : ENOMEM;
2221 out:
2222 	if (error) {
2223 		mtx_lock(&sc->emu10kx_lock);
2224 		sc->emu10kx_isopen = 0;
2225 		mtx_unlock(&sc->emu10kx_lock);
2226 	}
2227 	return (error);
2228 }
2229 
2230 static int
2231 emu10kx_close(struct cdev *i_dev, int flags __unused, int mode __unused, struct thread *td __unused)
2232 {
2233 	struct emu_sc_info *sc;
2234 
2235 	sc = i_dev->si_drv1;
2236 
2237 	mtx_lock(&sc->emu10kx_lock);
2238 	if (!(sc->emu10kx_isopen)) {
2239 		mtx_unlock(&sc->emu10kx_lock);
2240 		return (EBADF);
2241 	}
2242 	sbuf_delete(&sc->emu10kx_sbuf);
2243 	sc->emu10kx_isopen = 0;
2244 	mtx_unlock(&sc->emu10kx_lock);
2245 
2246 	return (0);
2247 }
2248 
2249 static int
2250 emu10kx_read(struct cdev *i_dev, struct uio *buf, int flag __unused)
2251 {
2252 	int l, err;
2253 	struct emu_sc_info *sc;
2254 
2255 	sc = i_dev->si_drv1;
2256 	mtx_lock(&sc->emu10kx_lock);
2257 	if (!(sc->emu10kx_isopen)) {
2258 		mtx_unlock(&sc->emu10kx_lock);
2259 		return (EBADF);
2260 	}
2261 	mtx_unlock(&sc->emu10kx_lock);
2262 
2263 	l = min(buf->uio_resid, sbuf_len(&sc->emu10kx_sbuf) - sc->emu10kx_bufptr);
2264 	err = (l > 0) ? uiomove(sbuf_data(&sc->emu10kx_sbuf) + sc->emu10kx_bufptr, l, buf) : 0;
2265 	sc->emu10kx_bufptr += l;
2266 
2267 	return (err);
2268 }
2269 
2270 static int
2271 emu10kx_prepare(struct emu_sc_info *sc, struct sbuf *s)
2272 {
2273 	int i;
2274 
2275 	sbuf_printf(s, "FreeBSD EMU10Kx Audio Driver\n");
2276 	sbuf_printf(s, "\nHardware resource usage:\n");
2277 	sbuf_printf(s, "DSP General Purpose Registers: %d used, %d total\n", sc->rm->num_used, sc->rm->num_gprs);
2278 	sbuf_printf(s, "DSP Instruction Registers: %d used, %d total\n", sc->routing_code_end, sc->code_size);
2279 	sbuf_printf(s, "Card supports");
2280 	if (sc->has_ac97) {
2281 		sbuf_printf(s, " AC97 codec");
2282 	} else {
2283 		sbuf_printf(s, " NO AC97 codec");
2284 	}
2285 	if (sc->has_51) {
2286 		if (sc->has_71)
2287 			sbuf_printf(s, " and 7.1 output");
2288 		else
2289 			sbuf_printf(s, " and 5.1 output");
2290 	}
2291 	if (sc->is_emu10k1)
2292 		sbuf_printf(s, ", SBLive! DSP code");
2293 	if (sc->is_emu10k2)
2294 		sbuf_printf(s, ", Audigy DSP code");
2295 	if (sc->is_ca0102)
2296 		sbuf_printf(s, ", Audigy DSP code with Audigy2 hacks");
2297 	if (sc->is_ca0108)
2298 		sbuf_printf(s, ", Audigy DSP code with Audigy2Value hacks");
2299 	sbuf_printf(s, "\n");
2300 	if (sc->broken_digital)
2301 		sbuf_printf(s, "Digital mode unsupported\n");
2302 	sbuf_printf(s, "\nInstalled devices:\n");
2303 	for (i = 0; i < RT_COUNT; i++)
2304 		if (sc->pcm[i] != NULL)
2305 			if (device_is_attached(sc->pcm[i])) {
2306 				sbuf_printf(s, "%s on %s\n", device_get_desc(sc->pcm[i]), device_get_nameunit(sc->pcm[i]));
2307 			}
2308 	if (sc->midi[0] != NULL)
2309 		if (device_is_attached(sc->midi[0])) {
2310 			sbuf_printf(s, "EMU10Kx MIDI Interface\n");
2311 			sbuf_printf(s, "\tOn-card connector on %s\n", device_get_nameunit(sc->midi[0]));
2312 		}
2313 	if (sc->midi[1] != NULL)
2314 		if (device_is_attached(sc->midi[1])) {
2315 			sbuf_printf(s, "\tOn-Drive connector on %s\n", device_get_nameunit(sc->midi[1]));
2316 		}
2317 	if (sc->midi[0] != NULL)
2318 		if (device_is_attached(sc->midi[0])) {
2319 			sbuf_printf(s, "\tIR reciever MIDI events %s\n", sc->enable_ir ? "enabled" : "disabled");
2320 		}
2321 	sbuf_printf(s, "Card is in %s mode\n", (sc->mode == MODE_ANALOG) ? "analog" : "digital");
2322 
2323 	sbuf_finish(s);
2324 	return (sbuf_len(s));
2325 }
2326 
2327 /* INIT & UNINIT */
2328 static int
2329 emu10kx_dev_init(struct emu_sc_info *sc)
2330 {
2331 	int unit;
2332 
2333 	mtx_init(&sc->emu10kx_lock, device_get_nameunit(sc->dev), "kxdevlock", 0);
2334 	unit = device_get_unit(sc->dev);
2335 
2336 	sc->cdev = make_dev(&emu10kx_cdevsw, PCMMINOR(unit), UID_ROOT, GID_WHEEL, 0640, "emu10kx%d", unit);
2337 	if (sc->cdev != NULL) {
2338 		sc->cdev->si_drv1 = sc;
2339 		return (0);
2340 	}
2341 	return (ENXIO);
2342 }
2343 
2344 static int
2345 emu10kx_dev_uninit(struct emu_sc_info *sc)
2346 {
2347 	mtx_lock(&sc->emu10kx_lock);
2348 	if (sc->emu10kx_isopen) {
2349 		mtx_unlock(&sc->emu10kx_lock);
2350 		return (EBUSY);
2351 	}
2352 	if (sc->cdev)
2353 		destroy_dev(sc->cdev);
2354 	sc->cdev = 0;
2355 
2356 	mtx_destroy(&sc->emu10kx_lock);
2357 	return (0);
2358 }
2359 
2360 /* resource manager */
2361 int
2362 emu_rm_init(struct emu_sc_info *sc)
2363 {
2364 	int i;
2365 	int maxcount;
2366 	struct emu_rm *rm;
2367 
2368 	rm = malloc(sizeof(struct emu_rm), M_DEVBUF, M_NOWAIT | M_ZERO);
2369 	if (rm == NULL) {
2370 		return (ENOMEM);
2371 	}
2372 	sc->rm = rm;
2373 	rm->card = sc;
2374 	maxcount = sc->num_gprs;
2375 	rm->num_used = 0;
2376 	mtx_init(&(rm->gpr_lock), device_get_nameunit(sc->dev), "gpr alloc", MTX_DEF);
2377 	rm->num_gprs = (maxcount < EMU_MAX_GPR ? maxcount : EMU_MAX_GPR);
2378 	for (i = 0; i < rm->num_gprs; i++)
2379 		rm->allocmap[i] = 0;
2380 	/* pre-allocate gpr[0] */
2381 	rm->allocmap[0] = 1;
2382 	rm->last_free_gpr = 1;
2383 
2384 	return (0);
2385 }
2386 
2387 int
2388 emu_rm_uninit(struct emu_sc_info *sc)
2389 {
2390 	int i;
2391 
2392 	if (sc->dbg_level > 1) {
2393 		mtx_lock(&(sc->rm->gpr_lock));
2394 		for (i = 1; i < sc->rm->last_free_gpr; i++)
2395 			if (sc->rm->allocmap[i] > 0)
2396 				device_printf(sc->dev, "rm: gpr %d not free before uninit\n", i);
2397 		mtx_unlock(&(sc->rm->gpr_lock));
2398 	}
2399 
2400 	mtx_destroy(&(sc->rm->gpr_lock));
2401 	free(sc->rm, M_DEVBUF);
2402 	return (0);
2403 }
2404 
2405 static int
2406 emu_rm_gpr_alloc(struct emu_rm *rm, int count)
2407 {
2408 	int i, j;
2409 	int allocated_gpr;
2410 
2411 	allocated_gpr = rm->num_gprs;
2412 	/* try fast way first */
2413 	mtx_lock(&(rm->gpr_lock));
2414 	if (rm->last_free_gpr + count <= rm->num_gprs) {
2415 		allocated_gpr = rm->last_free_gpr;
2416 		rm->last_free_gpr += count;
2417 		rm->allocmap[allocated_gpr] = count;
2418 		for (i = 1; i < count; i++)
2419 			rm->allocmap[allocated_gpr + i] = -(count - i);
2420 	} else {
2421 		/* longer */
2422 		i = 0;
2423 		allocated_gpr = rm->num_gprs;
2424 		while (i < rm->last_free_gpr - count) {
2425 			if (rm->allocmap[i] > 0) {
2426 				i += rm->allocmap[i];
2427 			} else {
2428 				allocated_gpr = i;
2429 				for (j = 1; j < count; j++) {
2430 					if (rm->allocmap[i + j] != 0)
2431 						allocated_gpr = rm->num_gprs;
2432 				}
2433 				if (allocated_gpr == i)
2434 					break;
2435 			}
2436 		}
2437 		if (allocated_gpr + count < rm->last_free_gpr) {
2438 			rm->allocmap[allocated_gpr] = count;
2439 			for (i = 1; i < count; i++)
2440 				rm->allocmap[allocated_gpr + i] = -(count - i);
2441 
2442 		}
2443 	}
2444 	if (allocated_gpr == rm->num_gprs)
2445 		allocated_gpr = (-1);
2446 	if (allocated_gpr >= 0)
2447 		rm->num_used += count;
2448 	mtx_unlock(&(rm->gpr_lock));
2449 	return (allocated_gpr);
2450 }
2451 
2452 /* mixer */
2453 void
2454 emumix_set_mode(struct emu_sc_info *sc, int mode)
2455 {
2456 	uint32_t a_iocfg;
2457 	uint32_t hcfg;
2458 	uint32_t tmp;
2459 
2460 	switch (mode) {
2461 	case MODE_DIGITAL:
2462 		/* FALLTHROUGH */
2463 	case MODE_ANALOG:
2464 		break;
2465 	default:
2466 		return;
2467 	}
2468 
2469 	hcfg = EMU_HCFG_AUDIOENABLE | EMU_HCFG_AUTOMUTE;
2470 	a_iocfg = 0;
2471 
2472 	if (sc->rev >= 6)
2473 		hcfg |= EMU_HCFG_JOYENABLE;
2474 
2475 	if (sc->is_emu10k1)
2476 		hcfg |= EMU_HCFG_LOCKTANKCACHE_MASK;
2477 	else
2478 		hcfg |= EMU_HCFG_CODECFMT_I2S | EMU_HCFG_JOYENABLE;
2479 
2480 
2481 	if (mode == MODE_DIGITAL) {
2482 		if (sc->broken_digital) {
2483 			device_printf(sc->dev, "Digital mode is reported as broken on this card.\n");
2484 		}
2485 		a_iocfg |= EMU_A_IOCFG_GPOUT1;
2486 		hcfg |= EMU_HCFG_GPOUT0;
2487 	}
2488 
2489 	if (mode == MODE_ANALOG)
2490 		emumix_set_spdif_mode(sc, SPDIF_MODE_PCM);
2491 
2492 	if (sc->is_emu10k2)
2493 		a_iocfg |= 0x80; /* XXX */
2494 
2495 	if ((sc->is_ca0102) || (sc->is_ca0108))
2496 		/*
2497 		 * Setting EMU_A_IOCFG_DISABLE_ANALOG will do opposite things
2498 		 * on diffrerent cards.
2499 		 * "don't disable analog outs" on Audigy 2 (ca0102/ca0108)
2500 		 * "disable analog outs" on Audigy (emu10k2)
2501 		 */
2502 		a_iocfg |= EMU_A_IOCFG_DISABLE_ANALOG;
2503 
2504 	if (sc->is_ca0108)
2505 		a_iocfg |= 0x20; /* XXX */
2506 
2507 	/* Mute analog center & subwoofer before mode change */
2508 	if (mode == MODE_DIGITAL)
2509 		emumix_set_gpr(sc, sc->mute_gpr[ANALOGMUTE], 1);
2510 
2511 	emu_wr(sc, EMU_HCFG, hcfg, 4);
2512 
2513 	if ((sc->is_emu10k2) || (sc->is_ca0102) || (sc->is_ca0108)) {
2514 		tmp = emu_rd(sc, EMU_A_IOCFG, 2);
2515 		tmp = a_iocfg;
2516 		emu_wr(sc, EMU_A_IOCFG, tmp, 2);
2517 	}
2518 
2519 	/* Unmute if we have changed mode to analog. */
2520 
2521 	if (mode == MODE_ANALOG)
2522 		emumix_set_gpr(sc, sc->mute_gpr[ANALOGMUTE], 0);
2523 
2524 	sc->mode = mode;
2525 }
2526 
2527 void
2528 emumix_set_spdif_mode(struct emu_sc_info *sc, int mode)
2529 {
2530 	uint32_t spcs;
2531 
2532 	switch (mode) {
2533 	case SPDIF_MODE_PCM:
2534 		break;
2535 	case SPDIF_MODE_AC3:
2536 		device_printf(sc->dev, "AC3 mode does not work and disabled\n");
2537 		return;
2538 	default:
2539 		return;
2540 	}
2541 
2542 	spcs = EMU_SPCS_CLKACCY_1000PPM | EMU_SPCS_SAMPLERATE_48 |
2543 	    EMU_SPCS_CHANNELNUM_LEFT | EMU_SPCS_SOURCENUM_UNSPEC |
2544 	    EMU_SPCS_GENERATIONSTATUS | 0x00001200 | 0x00000000 |
2545 	    EMU_SPCS_EMPHASIS_NONE | EMU_SPCS_COPYRIGHT;
2546 
2547 	mode = SPDIF_MODE_PCM;
2548 
2549 	emu_wrptr(sc, 0, EMU_SPCS0, spcs);
2550 	emu_wrptr(sc, 0, EMU_SPCS1, spcs);
2551 	emu_wrptr(sc, 0, EMU_SPCS2, spcs);
2552 }
2553 
2554 #define	L2L_POINTS	10
2555 
2556 static int l2l_df[L2L_POINTS] = {
2557 	0x572C5CA,		/* 100..90 */
2558 	0x3211625,		/* 90..80 */
2559 	0x1CC1A76,		/* 80..70 */
2560 	0x108428F,		/* 70..60 */
2561 	0x097C70A,		/* 60..50 */
2562 	0x0572C5C,		/* 50..40 */
2563 	0x0321162,		/* 40..30 */
2564 	0x01CC1A7,		/* 30..20 */
2565 	0x0108428,		/* 20..10 */
2566 	0x016493D		/* 10..0 */
2567 };
2568 
2569 static int l2l_f[L2L_POINTS] = {
2570 	0x4984461A,		/* 90 */
2571 	0x2A3968A7,		/* 80 */
2572 	0x18406003,		/* 70 */
2573 	0x0DEDC66D,		/* 60 */
2574 	0x07FFFFFF,		/* 50 */
2575 	0x04984461,		/* 40 */
2576 	0x02A3968A,		/* 30 */
2577 	0x01840600,		/* 20 */
2578 	0x00DEDC66,		/* 10 */
2579 	0x00000000		/* 0 */
2580 };
2581 
2582 
2583 static int
2584 log2lin(int log_t)
2585 {
2586 	int lin_t;
2587 	int idx, lin;
2588 
2589 	if (log_t <= 0) {
2590 		lin_t = 0x00000000;
2591 		return (lin_t);
2592 	}
2593 
2594 	if (log_t >= 100) {
2595 		lin_t = 0x7fffffff;
2596 		return (lin_t);
2597 	}
2598 
2599 	idx = (L2L_POINTS - 1) - log_t / (L2L_POINTS);
2600 	lin = log_t % (L2L_POINTS);
2601 	lin_t = l2l_df[idx] * lin + l2l_f[idx];
2602 	return (lin_t);
2603 }
2604 
2605 
2606 void
2607 emumix_set_fxvol(struct emu_sc_info *sc, unsigned gpr, int32_t vol)
2608 {
2609 
2610 	vol = log2lin(vol);
2611 	emumix_set_gpr(sc, gpr, vol);
2612 }
2613 
2614 void
2615 emumix_set_gpr(struct emu_sc_info *sc, unsigned gpr, int32_t val)
2616 {
2617 	if (sc->dbg_level > 1)
2618 		if (gpr == 0) {
2619 			device_printf(sc->dev, "Zero gpr write access\n");
2620 #ifdef KDB
2621 			kdb_backtrace();
2622 #endif
2623 			return;
2624 			}
2625 
2626 	emu_wrptr(sc, 0, GPR(gpr), val);
2627 }
2628 
2629 void
2630 emumix_set_volume(struct emu_sc_info *sc, int mixer_idx, int volume)
2631 {
2632 
2633 	RANGE(volume, 0, 100);
2634 	if (mixer_idx < NUM_MIXERS) {
2635 		sc->mixer_volcache[mixer_idx] = volume;
2636 		emumix_set_fxvol(sc, sc->mixer_gpr[mixer_idx], volume);
2637 	}
2638 }
2639 
2640 int
2641 emumix_get_volume(struct emu_sc_info *sc, int mixer_idx)
2642 {
2643 	if ((mixer_idx < NUM_MIXERS) && (mixer_idx >= 0))
2644 		return (sc->mixer_volcache[mixer_idx]);
2645 	return (-1);
2646 }
2647 
2648 /* Init CardBus part */
2649 static int
2650 emu_cardbus_init(struct emu_sc_info *sc)
2651 {
2652 
2653 	/*
2654 	 * XXX May not need this if we have EMU_IPR3 handler.
2655 	 * Is it a real init calls, or EMU_IPR3 interrupt acknowledgments?
2656 	 * Looks much like "(data << 16) | register".
2657 	 */
2658 	emu_wr_cbptr(sc, (0x00d0 << 16) | 0x0000);
2659 	emu_wr_cbptr(sc, (0x00d0 << 16) | 0x0001);
2660 	emu_wr_cbptr(sc, (0x00d0 << 16) | 0x005f);
2661 	emu_wr_cbptr(sc, (0x00d0 << 16) | 0x007f);
2662 
2663 	emu_wr_cbptr(sc, (0x0090 << 16) | 0x007f);
2664 
2665 	return (0);
2666 }
2667 
2668 /* Probe and attach the card */
2669 static int
2670 emu_init(struct emu_sc_info *sc)
2671 {
2672 	uint32_t ch, tmp;
2673 	uint32_t spdif_sr;
2674 	uint32_t ac97slot;
2675 	int def_mode;
2676 	int i;
2677 
2678 	/* disable audio and lock cache */
2679 	emu_wr(sc, EMU_HCFG, EMU_HCFG_LOCKSOUNDCACHE | EMU_HCFG_LOCKTANKCACHE_MASK | EMU_HCFG_MUTEBUTTONENABLE, 4);
2680 
2681 	/* reset recording buffers */
2682 	emu_wrptr(sc, 0, EMU_MICBS, EMU_RECBS_BUFSIZE_NONE);
2683 	emu_wrptr(sc, 0, EMU_MICBA, 0);
2684 	emu_wrptr(sc, 0, EMU_FXBS, EMU_RECBS_BUFSIZE_NONE);
2685 	emu_wrptr(sc, 0, EMU_FXBA, 0);
2686 	emu_wrptr(sc, 0, EMU_ADCBS, EMU_RECBS_BUFSIZE_NONE);
2687 	emu_wrptr(sc, 0, EMU_ADCBA, 0);
2688 
2689 	/* disable channel interrupt */
2690 	emu_wr(sc, EMU_INTE, EMU_INTE_INTERTIMERENB | EMU_INTE_SAMPLERATER | EMU_INTE_PCIERRENABLE, 4);
2691 	emu_wrptr(sc, 0, EMU_CLIEL, 0);
2692 	emu_wrptr(sc, 0, EMU_CLIEH, 0);
2693 	emu_wrptr(sc, 0, EMU_SOLEL, 0);
2694 	emu_wrptr(sc, 0, EMU_SOLEH, 0);
2695 
2696 	/* disable P16V and S/PDIF interrupts */
2697 	if ((sc->is_ca0102) || (sc->is_ca0108))
2698 		emu_wr(sc, EMU_INTE2, 0, 4);
2699 
2700 	if (sc->is_ca0102)
2701 		emu_wr(sc, EMU_INTE3, 0, 4);
2702 
2703 	/* init phys inputs and outputs */
2704 	ac97slot = 0;
2705 	if (sc->has_51)
2706 		ac97slot = EMU_AC97SLOT_CENTER | EMU_AC97SLOT_LFE;
2707 	if (sc->has_71)
2708 		ac97slot = EMU_AC97SLOT_CENTER | EMU_AC97SLOT_LFE | EMU_AC97SLOT_REAR_LEFT | EMU_AC97SLOT_REAR_RIGHT;
2709 	if (sc->is_emu10k2)
2710 		ac97slot |= 0x40;
2711 	emu_wrptr(sc, 0, EMU_AC97SLOT, ac97slot);
2712 
2713 	if (sc->is_emu10k2)	/* XXX for later cards? */
2714 		emu_wrptr(sc, 0, EMU_SPBYPASS, 0xf00);	/* What will happen if
2715 							 * we write 1 here? */
2716 
2717 	if (bus_dma_tag_create( /* parent */ bus_get_dma_tag(sc->dev),
2718 	     /* alignment */ 2, /* boundary */ 0,
2719 	     /* lowaddr */ (1U << 31) - 1,	/* can only access 0-2gb */
2720 	     /* highaddr */ BUS_SPACE_MAXADDR,
2721 	     /* filter */ NULL, /* filterarg */ NULL,
2722 	     /* maxsize */ EMU_MAX_BUFSZ, /* nsegments */ 1, /* maxsegz */ 0x3ffff,
2723 	     /* flags */ 0, /* lockfunc */ busdma_lock_mutex,
2724 	     /* lockarg */ &Giant, &(sc->mem.dmat)) != 0) {
2725 		device_printf(sc->dev, "unable to create dma tag\n");
2726 		bus_dma_tag_destroy(sc->mem.dmat);
2727 		return (ENOMEM);
2728 	}
2729 
2730 	sc->mem.card = sc;
2731 	SLIST_INIT(&sc->mem.blocks);
2732 	sc->mem.ptb_pages = emu_malloc(&sc->mem, EMU_MAXPAGES * sizeof(uint32_t), &sc->mem.ptb_pages_addr, &sc->mem.ptb_map);
2733 	if (sc->mem.ptb_pages == NULL)
2734 		return (ENOMEM);
2735 
2736 	sc->mem.silent_page = emu_malloc(&sc->mem, EMUPAGESIZE, &sc->mem.silent_page_addr, &sc->mem.silent_map);
2737 	if (sc->mem.silent_page == NULL) {
2738 		emu_free(&sc->mem, sc->mem.ptb_pages, sc->mem.ptb_map);
2739 		return (ENOMEM);
2740 	}
2741 	/* Clear page with silence & setup all pointers to this page */
2742 	bzero(sc->mem.silent_page, EMUPAGESIZE);
2743 	tmp = (uint32_t) (sc->mem.silent_page_addr) << 1;
2744 	for (i = 0; i < EMU_MAXPAGES; i++)
2745 		sc->mem.ptb_pages[i] = tmp | i;
2746 
2747 	for (ch = 0; ch < NUM_G; ch++) {
2748 		emu_wrptr(sc, ch, EMU_CHAN_MAPA, tmp | EMU_CHAN_MAP_PTI_MASK);
2749 		emu_wrptr(sc, ch, EMU_CHAN_MAPB, tmp | EMU_CHAN_MAP_PTI_MASK);
2750 	}
2751 	emu_wrptr(sc, 0, EMU_PTB, (sc->mem.ptb_pages_addr));
2752 	emu_wrptr(sc, 0, EMU_TCB, 0);	/* taken from original driver */
2753 	emu_wrptr(sc, 0, EMU_TCBS, 0);	/* taken from original driver */
2754 
2755 	/* init envelope engine */
2756 	for (ch = 0; ch < NUM_G; ch++) {
2757 		emu_wrptr(sc, ch, EMU_CHAN_DCYSUSV, 0);
2758 		emu_wrptr(sc, ch, EMU_CHAN_IP, 0);
2759 		emu_wrptr(sc, ch, EMU_CHAN_VTFT, 0xffff);
2760 		emu_wrptr(sc, ch, EMU_CHAN_CVCF, 0xffff);
2761 		emu_wrptr(sc, ch, EMU_CHAN_PTRX, 0);
2762 		emu_wrptr(sc, ch, EMU_CHAN_CPF, 0);
2763 		emu_wrptr(sc, ch, EMU_CHAN_CCR, 0);
2764 
2765 		emu_wrptr(sc, ch, EMU_CHAN_PSST, 0);
2766 		emu_wrptr(sc, ch, EMU_CHAN_DSL, 0x10);
2767 		emu_wrptr(sc, ch, EMU_CHAN_CCCA, 0);
2768 		emu_wrptr(sc, ch, EMU_CHAN_Z1, 0);
2769 		emu_wrptr(sc, ch, EMU_CHAN_Z2, 0);
2770 		emu_wrptr(sc, ch, EMU_CHAN_FXRT, 0xd01c0000);
2771 
2772 		emu_wrptr(sc, ch, EMU_CHAN_ATKHLDM, 0);
2773 		emu_wrptr(sc, ch, EMU_CHAN_DCYSUSM, 0);
2774 		emu_wrptr(sc, ch, EMU_CHAN_IFATN, 0xffff);
2775 		emu_wrptr(sc, ch, EMU_CHAN_PEFE, 0);
2776 		emu_wrptr(sc, ch, EMU_CHAN_FMMOD, 0);
2777 		emu_wrptr(sc, ch, EMU_CHAN_TREMFRQ, 24);	/* 1 Hz */
2778 		emu_wrptr(sc, ch, EMU_CHAN_FM2FRQ2, 24);	/* 1 Hz */
2779 		emu_wrptr(sc, ch, EMU_CHAN_TEMPENV, 0);
2780 
2781 		/*** these are last so OFF prevents writing ***/
2782 		emu_wrptr(sc, ch, EMU_CHAN_LFOVAL2, 0);
2783 		emu_wrptr(sc, ch, EMU_CHAN_LFOVAL1, 0);
2784 		emu_wrptr(sc, ch, EMU_CHAN_ATKHLDV, 0);
2785 		emu_wrptr(sc, ch, EMU_CHAN_ENVVOL, 0);
2786 		emu_wrptr(sc, ch, EMU_CHAN_ENVVAL, 0);
2787 
2788 		if ((sc->is_emu10k2) || (sc->is_ca0102) || (sc->is_ca0108)) {
2789 			emu_wrptr(sc, ch, 0x4c, 0x0);
2790 			emu_wrptr(sc, ch, 0x4d, 0x0);
2791 			emu_wrptr(sc, ch, 0x4e, 0x0);
2792 			emu_wrptr(sc, ch, 0x4f, 0x0);
2793 			emu_wrptr(sc, ch, EMU_A_CHAN_FXRT1, 0x3f3f3f3f);
2794 			emu_wrptr(sc, ch, EMU_A_CHAN_FXRT2, 0x3f3f3f3f);
2795 			emu_wrptr(sc, ch, EMU_A_CHAN_SENDAMOUNTS, 0x0);
2796 		}
2797 	}
2798 
2799 	emumix_set_spdif_mode(sc, SPDIF_MODE_PCM);
2800 
2801 	if ((sc->is_emu10k2) || (sc->is_ca0102) || (sc->is_ca0108))
2802 		emu_wrptr(sc, 0, EMU_A_SPDIF_SAMPLERATE, EMU_A_SPDIF_48000);
2803 
2804 	/*
2805 	 * CAxxxx cards needs additional setup:
2806 	 * 1. Set I2S capture sample rate to 96000
2807 	 * 2. Disable P16v / P17v proceesing
2808 	 * 3. Allow EMU10K DSP inputs
2809 	 */
2810 	if ((sc->is_ca0102) || (sc->is_ca0108)) {
2811 
2812 		spdif_sr = emu_rdptr(sc, 0, EMU_A_SPDIF_SAMPLERATE);
2813 		spdif_sr &= 0xfffff1ff;
2814 		spdif_sr |= EMU_A_I2S_CAPTURE_96000;
2815 		emu_wrptr(sc, 0, EMU_A_SPDIF_SAMPLERATE, spdif_sr);
2816 
2817 		/* Disable P16v processing */
2818 		emu_wr_p16vptr(sc, 0, EMU_A2_SRCSel, 0x14);
2819 
2820 		/* Setup P16v/P17v sound routing */
2821 		if (sc->is_ca0102)
2822 			emu_wr_p16vptr(sc, 0, EMU_A2_SRCMULTI_ENABLE, 0xFF00FF00);
2823 		else {
2824 			emu_wr_p16vptr(sc, 0, EMU_A2_MIXER_I2S_ENABLE, 0xFF000000);
2825 			emu_wr_p16vptr(sc, 0, EMU_A2_MIXER_SPDIF_ENABLE, 0xFF000000);
2826 
2827 			tmp = emu_rd(sc, EMU_A_IOCFG, 2);
2828 			emu_wr(sc, EMU_A_IOCFG, tmp & ~0x8, 2);
2829 		}
2830 	}
2831 	emu_initefx(sc);
2832 
2833 	def_mode = MODE_ANALOG;
2834 	if ((sc->is_emu10k2) || (sc->is_ca0102) || (sc->is_ca0108))
2835 		def_mode = MODE_DIGITAL;
2836 	if (((sc->is_emu10k2) || (sc->is_ca0102) || (sc->is_ca0108)) && (sc->broken_digital)) {
2837 		device_printf(sc->dev, "Audigy card initialized in analog mode.\n");
2838 		def_mode = MODE_ANALOG;
2839 	}
2840 	emumix_set_mode(sc, def_mode);
2841 
2842 	if (bootverbose) {
2843 		tmp = emu_rd(sc, EMU_HCFG, 4);
2844 		device_printf(sc->dev, "Card Configuration (   0x%08x )\n", tmp);
2845 		device_printf(sc->dev, "Card Configuration ( & 0xff000000 ) : %s%s%s%s%s%s%s%s\n",
2846 		    (tmp & 0x80000000 ? "[Legacy MPIC] " : ""),
2847 		    (tmp & 0x40000000 ? "[0x40] " : ""),
2848 		    (tmp & 0x20000000 ? "[0x20] " : ""),
2849 		    (tmp & 0x10000000 ? "[0x10] " : ""),
2850 		    (tmp & 0x08000000 ? "[0x08] " : ""),
2851 		    (tmp & 0x04000000 ? "[0x04] " : ""),
2852 		    (tmp & 0x02000000 ? "[0x02] " : ""),
2853 		    (tmp & 0x01000000 ? "[0x01]" : " "));
2854 		device_printf(sc->dev, "Card Configuration ( & 0x00ff0000 ) : %s%s%s%s%s%s%s%s\n",
2855 		    (tmp & 0x00800000 ? "[0x80] " : ""),
2856 		    (tmp & 0x00400000 ? "[0x40] " : ""),
2857 		    (tmp & 0x00200000 ? "[Legacy INT] " : ""),
2858 		    (tmp & 0x00100000 ? "[0x10] " : ""),
2859 		    (tmp & 0x00080000 ? "[0x08] " : ""),
2860 		    (tmp & 0x00040000 ? "[Codec4] " : ""),
2861 		    (tmp & 0x00020000 ? "[Codec2] " : ""),
2862 		    (tmp & 0x00010000 ? "[I2S Codec]" : " "));
2863 		device_printf(sc->dev, "Card Configuration ( & 0x0000ff00 ) : %s%s%s%s%s%s%s%s\n",
2864 		    (tmp & 0x00008000 ? "[0x80] " : ""),
2865 		    (tmp & 0x00004000 ? "[GPINPUT0] " : ""),
2866 		    (tmp & 0x00002000 ? "[GPINPUT1] " : ""),
2867 		    (tmp & 0x00001000 ? "[GPOUT0] " : ""),
2868 		    (tmp & 0x00000800 ? "[GPOUT1] " : ""),
2869 		    (tmp & 0x00000400 ? "[GPOUT2] " : ""),
2870 		    (tmp & 0x00000200 ? "[Joystick] " : ""),
2871 		    (tmp & 0x00000100 ? "[0x01]" : " "));
2872 		device_printf(sc->dev, "Card Configuration ( & 0x000000ff ) : %s%s%s%s%s%s%s%s\n",
2873 		    (tmp & 0x00000080 ? "[0x80] " : ""),
2874 		    (tmp & 0x00000040 ? "[0x40] " : ""),
2875 		    (tmp & 0x00000020 ? "[0x20] " : ""),
2876 		    (tmp & 0x00000010 ? "[AUTOMUTE] " : ""),
2877 		    (tmp & 0x00000008 ? "[LOCKSOUNDCACHE] " : ""),
2878 		    (tmp & 0x00000004 ? "[LOCKTANKCACHE] " : ""),
2879 		    (tmp & 0x00000002 ? "[MUTEBUTTONENABLE] " : ""),
2880 		    (tmp & 0x00000001 ? "[AUDIOENABLE]" : " "));
2881 
2882 		if ((sc->is_emu10k2) || (sc->is_ca0102) || (sc->is_ca0108)) {
2883 			tmp = emu_rd(sc, EMU_A_IOCFG, 2);
2884 			device_printf(sc->dev, "Audigy Card Configuration (    0x%04x )\n", tmp);
2885 			device_printf(sc->dev, "Audigy Card Configuration (  & 0xff00 )");
2886 			printf(" : %s%s%s%s%s%s%s%s\n",
2887 			    (tmp & 0x8000 ? "[Rear Speakers] " : ""),
2888 			    (tmp & 0x4000 ? "[Front Speakers] " : ""),
2889 			    (tmp & 0x2000 ? "[0x20] " : ""),
2890 			    (tmp & 0x1000 ? "[0x10] " : ""),
2891 			    (tmp & 0x0800 ? "[0x08] " : ""),
2892 			    (tmp & 0x0400 ? "[0x04] " : ""),
2893 			    (tmp & 0x0200 ? "[0x02] " : ""),
2894 			    (tmp & 0x0100 ? "[AudigyDrive Phones]" : " "));
2895 			device_printf(sc->dev, "Audigy Card Configuration (  & 0x00ff )");
2896 			printf(" : %s%s%s%s%s%s%s%s\n",
2897 			    (tmp & 0x0080 ? "[0x80] " : ""),
2898 			    (tmp & 0x0040 ? "[Mute AnalogOut] " : ""),
2899 			    (tmp & 0x0020 ? "[0x20] " : ""),
2900 			    (tmp & 0x0010 ? "[0x10] " : ""),
2901 			    (tmp & 0x0008 ? "[0x08] " : ""),
2902 			    (tmp & 0x0004 ? "[GPOUT0] " : ""),
2903 			    (tmp & 0x0002 ? "[GPOUT1] " : ""),
2904 			    (tmp & 0x0001 ? "[GPOUT2]" : " "));
2905 		}		/* is_emu10k2 or ca* */
2906 	}			/* bootverbose */
2907 	return (0);
2908 }
2909 
2910 static int
2911 emu_uninit(struct emu_sc_info *sc)
2912 {
2913 	uint32_t ch;
2914 	struct emu_memblk *blk;
2915 
2916 	emu_wr(sc, EMU_INTE, 0, 4);
2917 	for (ch = 0; ch < NUM_G; ch++)
2918 		emu_wrptr(sc, ch, EMU_CHAN_DCYSUSV, 0);
2919 	for (ch = 0; ch < NUM_G; ch++) {
2920 		emu_wrptr(sc, ch, EMU_CHAN_VTFT, 0);
2921 		emu_wrptr(sc, ch, EMU_CHAN_CVCF, 0);
2922 		emu_wrptr(sc, ch, EMU_CHAN_PTRX, 0);
2923 		emu_wrptr(sc, ch, EMU_CHAN_CPF, 0);
2924 	}
2925 
2926 	/* disable audio and lock cache */
2927 	emu_wr(sc, EMU_HCFG, EMU_HCFG_LOCKSOUNDCACHE | EMU_HCFG_LOCKTANKCACHE_MASK | EMU_HCFG_MUTEBUTTONENABLE, 4);
2928 
2929 	emu_wrptr(sc, 0, EMU_PTB, 0);
2930 	/* reset recording buffers */
2931 	emu_wrptr(sc, 0, EMU_MICBS, EMU_RECBS_BUFSIZE_NONE);
2932 	emu_wrptr(sc, 0, EMU_MICBA, 0);
2933 	emu_wrptr(sc, 0, EMU_FXBS, EMU_RECBS_BUFSIZE_NONE);
2934 	emu_wrptr(sc, 0, EMU_FXBA, 0);
2935 	emu_wrptr(sc, 0, EMU_FXWC, 0);
2936 	emu_wrptr(sc, 0, EMU_ADCBS, EMU_RECBS_BUFSIZE_NONE);
2937 	emu_wrptr(sc, 0, EMU_ADCBA, 0);
2938 	emu_wrptr(sc, 0, EMU_TCB, 0);
2939 	emu_wrptr(sc, 0, EMU_TCBS, 0);
2940 
2941 	/* disable channel interrupt */
2942 	emu_wrptr(sc, 0, EMU_CLIEL, 0);
2943 	emu_wrptr(sc, 0, EMU_CLIEH, 0);
2944 	emu_wrptr(sc, 0, EMU_SOLEL, 0);
2945 	emu_wrptr(sc, 0, EMU_SOLEH, 0);
2946 
2947 	if (!SLIST_EMPTY(&sc->mem.blocks))
2948 		device_printf(sc->dev, "warning: memblock list not empty\n");
2949 
2950 	SLIST_FOREACH(blk, &sc->mem.blocks, link)
2951 		if (blk != NULL)
2952 		device_printf(sc->dev, "lost %d for %s\n", blk->pte_size, blk->owner);
2953 
2954 	emu_free(&sc->mem, sc->mem.ptb_pages, sc->mem.ptb_map);
2955 	emu_free(&sc->mem, sc->mem.silent_page, sc->mem.silent_map);
2956 
2957 	return (0);
2958 }
2959 
2960 static int
2961 emu_read_ivar(device_t bus, device_t dev, int ivar_index, uintptr_t * result)
2962 {
2963 	struct sndcard_func *func = device_get_ivars(dev);
2964 	struct emu_sc_info *sc = device_get_softc(bus);
2965 
2966 	if (func==NULL)
2967 		return (ENOMEM);
2968 	if (sc == NULL)
2969 		return (ENOMEM);
2970 
2971 	switch (ivar_index) {
2972 	case EMU_VAR_FUNC:
2973 		*result = func->func;
2974 		break;
2975 	case EMU_VAR_ROUTE:
2976 		if (func->varinfo == NULL)
2977 			return (ENOMEM);
2978 		*result = ((struct emu_pcminfo *)func->varinfo)->route;
2979 		break;
2980 	case EMU_VAR_ISEMU10K1:
2981 		*result = sc->is_emu10k1;
2982 		break;
2983 	case EMU_VAR_MCH_DISABLED:
2984 		*result = sc->mch_disabled;
2985 		break;
2986 	case EMU_VAR_MCH_REC:
2987 		*result = sc->mch_rec;
2988 		break;
2989 	default:
2990 		return (ENOENT);
2991 	}
2992 
2993 	return (0);
2994 }
2995 
2996 static int
2997 emu_write_ivar(device_t bus __unused, device_t dev __unused,
2998     int ivar_index, uintptr_t value __unused)
2999 {
3000 
3001 	switch (ivar_index) {
3002 		case 0:
3003 		return (EINVAL);
3004 
3005 	default:
3006 		return (ENOENT);
3007 	}
3008 }
3009 
3010 static int
3011 emu_pci_probe(device_t dev)
3012 {
3013 	struct sbuf *s;
3014 	unsigned int thiscard = 0;
3015 	uint16_t vendor;
3016 
3017 	vendor = pci_read_config(dev, PCIR_DEVVENDOR, /* bytes */ 2);
3018 	if (vendor != 0x1102)
3019 		return (ENXIO);	/* Not Creative */
3020 
3021 	thiscard = emu_getcard(dev);
3022 	if (thiscard == 0)
3023 		return (ENXIO);
3024 
3025 	s = sbuf_new(NULL, NULL, 4096, 0);
3026 	if (s == NULL)
3027 		return (ENOMEM);
3028 	sbuf_printf(s, "Creative %s [%s]", emu_cards[thiscard].desc, emu_cards[thiscard].SBcode);
3029 	sbuf_finish(s);
3030 
3031 	device_set_desc_copy(dev, sbuf_data(s));
3032 
3033 	sbuf_delete(s);
3034 
3035 	return (BUS_PROBE_DEFAULT);
3036 }
3037 
3038 
3039 static int
3040 emu_pci_attach(device_t dev)
3041 {
3042 	struct sndcard_func *func;
3043 	struct emu_sc_info *sc;
3044 	struct emu_pcminfo *pcminfo;
3045 #if 0
3046 	struct emu_midiinfo *midiinfo;
3047 #endif
3048 	int i;
3049 	int device_flags;
3050 	char status[255];
3051 	int error = ENXIO;
3052 	int unit;
3053 
3054 	sc = device_get_softc(dev);
3055 	unit = device_get_unit(dev);
3056 
3057 	/* Get configuration */
3058 
3059 	sc->ctx = device_get_sysctl_ctx(dev);
3060 	if (sc->ctx == NULL)
3061 		goto bad;
3062 	sc->root = device_get_sysctl_tree(dev);
3063 	if (sc->root == NULL)
3064 		goto bad;
3065 
3066 	if (resource_int_value("emu10kx", unit, "multichannel_disabled", &(sc->mch_disabled)))
3067 		RANGE(sc->mch_disabled, 0, 1);
3068 	SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
3069 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
3070             OID_AUTO, "multichannel_disabled", CTLFLAG_RD, &(sc->mch_disabled), 0, "Multichannel playback setting");
3071 
3072 	if (resource_int_value("emu10kx", unit, "multichannel_recording", &(sc->mch_rec)))
3073 		RANGE(sc->mch_rec, 0, 1);
3074 	SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
3075 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
3076             OID_AUTO, "multichannel_recording", CTLFLAG_RD,  &(sc->mch_rec), 0, "Multichannel recording setting");
3077 
3078 	if (resource_int_value("emu10kx", unit, "debug", &(sc->dbg_level)))
3079 		RANGE(sc->mch_rec, 0, 2);
3080 	SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
3081 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
3082             OID_AUTO, "debug", CTLFLAG_RW, &(sc->dbg_level), 0, "Debug level");
3083 
3084 	/* Fill in the softc. */
3085 	mtx_init(&sc->lock, device_get_nameunit(dev), "bridge conf", MTX_DEF);
3086 	mtx_init(&sc->rw, device_get_nameunit(dev), "exclusive io", MTX_DEF);
3087 	sc->dev = dev;
3088 	sc->type = pci_get_devid(dev);
3089 	sc->rev = pci_get_revid(dev);
3090 	sc->enable_ir = 0;
3091 	sc->has_ac97 = 0;
3092 	sc->has_51 = 0;
3093 	sc->has_71 = 0;
3094 	sc->broken_digital = 0;
3095 	sc->is_emu10k1 = 0;
3096 	sc->is_emu10k2 = 0;
3097 	sc->is_ca0102 = 0;
3098 	sc->is_ca0108 = 0;
3099 	sc->is_cardbus = 0;
3100 
3101 	device_flags = emu_cards[emu_getcard(dev)].flags;
3102 	if (device_flags & HAS_51)
3103 		sc->has_51 = 1;
3104 	if (device_flags & HAS_71) {
3105 		sc->has_51 = 1;
3106 		sc->has_71 = 1;
3107 	}
3108 	if (device_flags & IS_EMU10K1)
3109 		sc->is_emu10k1 = 1;
3110 	if (device_flags & IS_EMU10K2)
3111 		sc->is_emu10k2 = 1;
3112 	if (device_flags & IS_CA0102)
3113 		sc->is_ca0102 = 1;
3114 	if (device_flags & IS_CA0108)
3115 		sc->is_ca0108 = 1;
3116 	if ((sc->is_emu10k2) && (sc->rev == 4)) {
3117 		sc->is_emu10k2 = 0;
3118 		sc->is_ca0102 = 1;	/* for unknown Audigy 2 cards */
3119 	}
3120 	if ((sc->is_ca0102 == 1) || (sc->is_ca0108 == 1))
3121 		if (device_flags & IS_CARDBUS)
3122 			sc->is_cardbus = 1;
3123 
3124 	if ((sc->is_emu10k1 + sc->is_emu10k2 + sc->is_ca0102 + sc->is_ca0108) != 1) {
3125 		device_printf(sc->dev, "Unable to detect HW chipset\n");
3126 		goto bad;
3127 	}
3128 	if (device_flags & BROKEN_DIGITAL)
3129 		sc->broken_digital = 1;
3130 	if (device_flags & HAS_AC97)
3131 		sc->has_ac97 = 1;
3132 
3133 	sc->opcode_shift = 0;
3134 	if ((sc->is_emu10k2) || (sc->is_ca0102) || (sc->is_ca0108)) {
3135 		sc->opcode_shift = 24;
3136 		sc->high_operand_shift = 12;
3137 
3138 	/*	DSP map				*/
3139 	/*	sc->fx_base = 0x0		*/
3140 		sc->input_base = 0x40;
3141 	/*	sc->p16vinput_base = 0x50;	*/
3142 		sc->output_base = 0x60;
3143 		sc->efxc_base = 0x80;
3144 	/*	sc->output32h_base = 0xa0;	*/
3145 	/*	sc->output32l_base = 0xb0;	*/
3146 		sc->dsp_zero = 0xc0;
3147 	/*	0xe0...0x100 are unknown	*/
3148 	/*	sc->tram_base = 0x200		*/
3149 	/*	sc->tram_addr_base = 0x300	*/
3150 		sc->gpr_base = EMU_A_FXGPREGBASE;
3151 		sc->num_gprs = 0x200;
3152 		sc->code_base = EMU_A_MICROCODEBASE;
3153 		sc->code_size = 0x800 / 2;	/* 0x600-0xdff,  2048 words,
3154 						 * 1024 instructions */
3155 
3156 		sc->mchannel_fx = 8;
3157 		sc->num_fxbuses = 16;
3158 		sc->num_inputs = 8;
3159 		sc->num_outputs = 16;
3160 		sc->address_mask = EMU_A_PTR_ADDR_MASK;
3161 	}
3162 	if (sc->is_emu10k1) {
3163 		sc->has_51 = 0;	/* We don't support 5.1 sound on SB Live! 5.1 */
3164 		sc->opcode_shift = 20;
3165 		sc->high_operand_shift = 10;
3166 		sc->code_base = EMU_MICROCODEBASE;
3167 		sc->code_size = 0x400 / 2;	/* 0x400-0x7ff,  1024 words,
3168 						 * 512 instructions */
3169 		sc->gpr_base = EMU_FXGPREGBASE;
3170 		sc->num_gprs = 0x100;
3171 		sc->input_base = 0x10;
3172 		sc->output_base = 0x20;
3173 		/*
3174 		 * XXX 5.1 Analog outputs are inside efxc address space!
3175 		 * They use output+0x11/+0x12 (=efxc+1/+2).
3176 		 * Don't use this efx registers for recording on SB Live! 5.1!
3177 		 */
3178 		sc->efxc_base = 0x30;
3179 		sc->dsp_zero = 0x40;
3180 		sc->mchannel_fx = 0;
3181 		sc->num_fxbuses = 8;
3182 		sc->num_inputs = 8;
3183 		sc->num_outputs = 16;
3184 		sc->address_mask = EMU_PTR_ADDR_MASK;
3185 	}
3186 	if (sc->opcode_shift == 0)
3187 		goto bad;
3188 
3189 	pci_enable_busmaster(dev);
3190 
3191 	i = PCIR_BAR(0);
3192 	sc->reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &i, RF_ACTIVE);
3193 	if (sc->reg == NULL) {
3194 		device_printf(dev, "unable to map register space\n");
3195 		goto bad;
3196 	}
3197 	sc->st = rman_get_bustag(sc->reg);
3198 	sc->sh = rman_get_bushandle(sc->reg);
3199 
3200 	for (i = 0; i < EMU_MAX_IRQ_CONSUMERS; i++)
3201 		sc->timer[i] = 0;	/* disable it */
3202 
3203 	i = 0;
3204 	sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &i, RF_ACTIVE | RF_SHAREABLE);
3205 	if ((sc->irq == NULL) || bus_setup_intr(dev, sc->irq, INTR_MPSAFE | INTR_TYPE_AV,
3206 #if __FreeBSD_version >= 700031
3207 	    NULL,
3208 #endif
3209 	    emu_intr, sc, &sc->ih)) {
3210 		device_printf(dev, "unable to map interrupt\n");
3211 		goto bad;
3212 	}
3213 	if (emu_rm_init(sc) != 0) {
3214 		device_printf(dev, "unable to create resource manager\n");
3215 		goto bad;
3216 	}
3217 	if (sc->is_cardbus)
3218 		if (emu_cardbus_init(sc) != 0) {
3219 			device_printf(dev, "unable to initialize CardBus interface\n");
3220 			goto bad;
3221 		}
3222 	if (emu_init(sc) != 0) {
3223 		device_printf(dev, "unable to initialize the card\n");
3224 		goto bad;
3225 	}
3226 	if (emu10kx_dev_init(sc) != 0) {
3227 		device_printf(dev, "unable to create control device\n");
3228 		goto bad;
3229 	}
3230 	snprintf(status, 255, "rev %d at io 0x%lx irq %ld", sc->rev, rman_get_start(sc->reg), rman_get_start(sc->irq));
3231 
3232 	/* Voices */
3233 	for (i = 0; i < NUM_G; i++) {
3234 		sc->voice[i].vnum = i;
3235 		sc->voice[i].slave = NULL;
3236 		sc->voice[i].busy = 0;
3237 		sc->voice[i].ismaster = 0;
3238 		sc->voice[i].running = 0;
3239 		sc->voice[i].b16 = 0;
3240 		sc->voice[i].stereo = 0;
3241 		sc->voice[i].speed = 0;
3242 		sc->voice[i].start = 0;
3243 		sc->voice[i].end = 0;
3244 	}
3245 
3246 	/* PCM Audio */
3247 	for (i = 0; i < RT_COUNT; i++)
3248 		sc->pcm[i] = NULL;
3249 
3250 	/* FRONT */
3251 	func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3252 	if (func == NULL) {
3253 		error = ENOMEM;
3254 		goto bad;
3255 	}
3256 	pcminfo = malloc(sizeof(struct emu_pcminfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3257 	if (pcminfo == NULL) {
3258 		error = ENOMEM;
3259 		goto bad;
3260 	}
3261 	pcminfo->card = sc;
3262 	pcminfo->route = RT_FRONT;
3263 
3264 	func->func = SCF_PCM;
3265 	func->varinfo = pcminfo;
3266 	sc->pcm[RT_FRONT] = device_add_child(dev, "pcm", -1);
3267 	device_set_ivars(sc->pcm[RT_FRONT], func);
3268 
3269 	if (!(sc->mch_disabled)) {
3270 		/* REAR */
3271 		func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3272 		if (func == NULL) {
3273 			error = ENOMEM;
3274 			goto bad;
3275 		}
3276 		pcminfo = malloc(sizeof(struct emu_pcminfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3277 		if (pcminfo == NULL) {
3278 			error = ENOMEM;
3279 			goto bad;
3280 		}
3281 		pcminfo->card = sc;
3282 		pcminfo->route = RT_REAR;
3283 
3284 		func->func = SCF_PCM;
3285 		func->varinfo = pcminfo;
3286 		sc->pcm[RT_REAR] = device_add_child(dev, "pcm", -1);
3287 		device_set_ivars(sc->pcm[RT_REAR], func);
3288 		if (sc->has_51) {
3289 			/* CENTER */
3290 			func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3291 			if (func == NULL) {
3292 				error = ENOMEM;
3293 				goto bad;
3294 			}
3295 			pcminfo = malloc(sizeof(struct emu_pcminfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3296 			if (pcminfo == NULL) {
3297 				error = ENOMEM;
3298 				goto bad;
3299 			}
3300 			pcminfo->card = sc;
3301 			pcminfo->route = RT_CENTER;
3302 
3303 			func->func = SCF_PCM;
3304 			func->varinfo = pcminfo;
3305 			sc->pcm[RT_CENTER] = device_add_child(dev, "pcm", -1);
3306 			device_set_ivars(sc->pcm[RT_CENTER], func);
3307 			/* SUB */
3308 			func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3309 			if (func == NULL) {
3310 				error = ENOMEM;
3311 				goto bad;
3312 			}
3313 			pcminfo = malloc(sizeof(struct emu_pcminfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3314 			if (pcminfo == NULL) {
3315 				error = ENOMEM;
3316 				goto bad;
3317 			}
3318 			pcminfo->card = sc;
3319 			pcminfo->route = RT_SUB;
3320 
3321 			func->func = SCF_PCM;
3322 			func->varinfo = pcminfo;
3323 			sc->pcm[RT_SUB] = device_add_child(dev, "pcm", -1);
3324 			device_set_ivars(sc->pcm[RT_SUB], func);
3325 		}
3326 		if (sc->has_71) {
3327 			/* SIDE */
3328 			func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3329 			if (func == NULL) {
3330 				error = ENOMEM;
3331 				goto bad;
3332 			}
3333 			pcminfo = malloc(sizeof(struct emu_pcminfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3334 			if (pcminfo == NULL) {
3335 				error = ENOMEM;
3336 				goto bad;
3337 			}
3338 			pcminfo->card = sc;
3339 			pcminfo->route = RT_SIDE;
3340 
3341 			func->func = SCF_PCM;
3342 			func->varinfo = pcminfo;
3343 			sc->pcm[RT_SIDE] = device_add_child(dev, "pcm", -1);
3344 			device_set_ivars(sc->pcm[RT_SIDE], func);
3345 		}
3346 	} /* mch_disabled */
3347 
3348 	if (sc->mch_rec) {
3349 		func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3350 		if (func == NULL) {
3351 			error = ENOMEM;
3352 			goto bad;
3353 		}
3354 		pcminfo = malloc(sizeof(struct emu_pcminfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3355 		if (pcminfo == NULL) {
3356 			error = ENOMEM;
3357 			goto bad;
3358 		}
3359 		pcminfo->card = sc;
3360 		pcminfo->route = RT_MCHRECORD;
3361 
3362 		func->func = SCF_PCM;
3363 		func->varinfo = pcminfo;
3364 		sc->pcm[RT_MCHRECORD] = device_add_child(dev, "pcm", -1);
3365 		device_set_ivars(sc->pcm[RT_MCHRECORD], func);
3366 	} /*mch_rec */
3367 
3368 	for (i = 0; i < 2; i++)
3369 		sc->midi[i] = NULL;
3370 
3371 	/* MIDI has some memory mangament and (possible) locking problems */
3372 #if 0
3373 	/* Midi Interface 1: Live!, Audigy, Audigy 2 */
3374 	if ((sc->is_emu10k1) || (sc->is_emu10k2) || (sc->is_ca0102)) {
3375 		func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3376 		if (func == NULL) {
3377 			error = ENOMEM;
3378 			goto bad;
3379 		}
3380 		midiinfo = malloc(sizeof(struct emu_midiinfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3381 		if (midiinfo == NULL) {
3382 			error = ENOMEM;
3383 			goto bad;
3384 		}
3385 		midiinfo->card = sc;
3386 		if (sc->is_emu10k2 || (sc->is_ca0102)) {
3387 			midiinfo->port = EMU_A_MUDATA1;
3388 			midiinfo->portnr = 1;
3389 		}
3390 		if (sc->is_emu10k1) {
3391 			midiinfo->port = MUDATA;
3392 			midiinfo->portnr = 1;
3393 		}
3394 		func->func = SCF_MIDI;
3395 		func->varinfo = midiinfo;
3396 		sc->midi[0] = device_add_child(dev, "midi", -1);
3397 		device_set_ivars(sc->midi[0], func);
3398 	}
3399 	/* Midi Interface 2: Audigy, Audigy 2 (on AudigyDrive) */
3400 	if (sc->is_emu10k2 || (sc->is_ca0102)) {
3401 		func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3402 		if (func == NULL) {
3403 			error = ENOMEM;
3404 			goto bad;
3405 		}
3406 		midiinfo = malloc(sizeof(struct emu_midiinfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3407 		if (midiinfo == NULL) {
3408 			error = ENOMEM;
3409 			goto bad;
3410 		}
3411 		midiinfo->card = sc;
3412 
3413 		midiinfo->port = EMU_A_MUDATA2;
3414 		midiinfo->portnr = 2;
3415 
3416 		func->func = SCF_MIDI;
3417 		func->varinfo = midiinfo;
3418 		sc->midi[1] = device_add_child(dev, "midi", -1);
3419 		device_set_ivars(sc->midi[1], func);
3420 	}
3421 #endif
3422 	return (bus_generic_attach(dev));
3423 
3424 bad:
3425 	/* XXX can we just call emu_pci_detach here? */
3426 	if (sc->cdev)
3427 		emu10kx_dev_uninit(sc);
3428 	if (sc->rm != NULL)
3429 		emu_rm_uninit(sc);
3430 	if (sc->reg)
3431 		bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0), sc->reg);
3432 	if (sc->ih)
3433 		bus_teardown_intr(dev, sc->irq, sc->ih);
3434 	if (sc->irq)
3435 		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
3436 	mtx_destroy(&sc->rw);
3437 	mtx_destroy(&sc->lock);
3438 	return (error);
3439 }
3440 
3441 static int
3442 emu_pci_detach(device_t dev)
3443 {
3444 	struct emu_sc_info *sc;
3445 	struct sndcard_func *func;
3446 	int devcount, i;
3447 	device_t *childlist;
3448 	int r = 0;
3449 
3450 	sc = device_get_softc(dev);
3451 
3452 	for (i = 0; i < RT_COUNT; i++) {
3453 		if (sc->pcm[i] != NULL) {
3454 			func = device_get_ivars(sc->pcm[i]);
3455 			if (func != NULL && func->func == SCF_PCM) {
3456 				device_set_ivars(sc->pcm[i], NULL);
3457 				free(func->varinfo, M_DEVBUF);
3458 				free(func, M_DEVBUF);
3459 			}
3460 			r = device_delete_child(dev, sc->pcm[i]);
3461 			if (r)	return (r);
3462 		}
3463 	}
3464 
3465 	if (sc->midi[0] != NULL) {
3466 		func = device_get_ivars(sc->midi[0]);
3467 		if (func != NULL && func->func == SCF_MIDI) {
3468 			device_set_ivars(sc->midi[0], NULL);
3469 			free(func->varinfo, M_DEVBUF);
3470 			free(func, M_DEVBUF);
3471 		}
3472 		r = device_delete_child(dev, sc->midi[0]);
3473 		if (r)	return (r);
3474 	}
3475 
3476 	if (sc->midi[1] != NULL) {
3477 		func = device_get_ivars(sc->midi[1]);
3478 		if (func != NULL && func->func == SCF_MIDI) {
3479 			device_set_ivars(sc->midi[1], NULL);
3480 			free(func->varinfo, M_DEVBUF);
3481 			free(func, M_DEVBUF);
3482 		}
3483 		r = device_delete_child(dev, sc->midi[1]);
3484 		if (r)	return (r);
3485 	}
3486 
3487 	if (device_get_children(dev, &childlist, &devcount) == 0)
3488 		for (i = 0; i < devcount - 1; i++) {
3489 			device_printf(dev, "removing stale child %d (unit %d)\n", i, device_get_unit(childlist[i]));
3490 			func = device_get_ivars(childlist[i]);
3491 			if (func != NULL && (func->func == SCF_MIDI || func->func == SCF_PCM)) {
3492 				device_set_ivars(childlist[i], NULL);
3493 				free(func->varinfo, M_DEVBUF);
3494 				free(func, M_DEVBUF);
3495 			}
3496 			device_delete_child(dev, childlist[i]);
3497 		}
3498 	if (childlist != NULL)
3499 		free(childlist, M_TEMP);
3500 
3501 	r = emu10kx_dev_uninit(sc);
3502 	if (r)
3503 		return (r);
3504 
3505 	/* shutdown chip */
3506 	emu_uninit(sc);
3507 	emu_rm_uninit(sc);
3508 
3509 	if (sc->mem.dmat)
3510 		bus_dma_tag_destroy(sc->mem.dmat);
3511 
3512 	if (sc->reg)
3513 		bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0), sc->reg);
3514 	bus_teardown_intr(dev, sc->irq, sc->ih);
3515 	bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
3516 	mtx_destroy(&sc->rw);
3517 	mtx_destroy(&sc->lock);
3518 
3519 	return (bus_generic_detach(dev));
3520 }
3521 /* add suspend, resume */
3522 static device_method_t emu_methods[] = {
3523 	/* Device interface */
3524 	DEVMETHOD(device_probe, emu_pci_probe),
3525 	DEVMETHOD(device_attach, emu_pci_attach),
3526 	DEVMETHOD(device_detach, emu_pci_detach),
3527 	/* Bus methods */
3528 	DEVMETHOD(bus_read_ivar, emu_read_ivar),
3529 	DEVMETHOD(bus_write_ivar, emu_write_ivar),
3530 
3531 	DEVMETHOD_END
3532 };
3533 
3534 
3535 static driver_t emu_driver = {
3536 	"emu10kx",
3537 	emu_methods,
3538 	sizeof(struct emu_sc_info),
3539 	NULL,
3540 	0,
3541 	NULL
3542 };
3543 
3544 static int
3545 emu_modevent(module_t mod __unused, int cmd, void *data __unused)
3546 {
3547 	int err = 0;
3548 
3549 	switch (cmd) {
3550 	case MOD_LOAD:
3551 		break;		/* Success */
3552 
3553 	case MOD_UNLOAD:
3554 	case MOD_SHUTDOWN:
3555 
3556 		/* XXX  Should we check state of pcm & midi subdevices here? */
3557 
3558 		break;		/* Success */
3559 
3560 	default:
3561 		err = EINVAL;
3562 		break;
3563 	}
3564 
3565 	return (err);
3566 
3567 }
3568 
3569 static devclass_t emu_devclass;
3570 
3571 DRIVER_MODULE(snd_emu10kx, pci, emu_driver, emu_devclass, emu_modevent, NULL);
3572 MODULE_VERSION(snd_emu10kx, SND_EMU10KX_PREFVER);
3573