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