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