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