1 /* $NetBSD: emuxki.c,v 1.63 2014/03/29 19:28:24 christos Exp $ */ 2 3 /*- 4 * Copyright (c) 2001, 2007 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Yannick Montulet, and by Andrew Doran. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* 33 * Driver for Creative Labs SBLive! series and probably PCI512. 34 * 35 * Known bugs: 36 * - inversed stereo at ac97 codec level 37 * (XXX jdolecek - don't see the problem? maybe because auvia(4) has 38 * it swapped too?) 39 * - bass disappear when you plug rear jack-in on Cambridge FPS2000 speakers 40 * (and presumably all speakers that support front and rear jack-in) 41 * 42 * TODO: 43 * - Digital Outputs 44 * - (midi/mpu),joystick support 45 * - Multiple voices play (problem with /dev/audio architecture) 46 * - Multiple sources recording (Pb with audio(4)) 47 * - Independent modification of each channel's parameters (via mixer ?) 48 * - DSP FX patches (to make fx like chipmunk) 49 */ 50 51 #include <sys/cdefs.h> 52 __KERNEL_RCSID(0, "$NetBSD: emuxki.c,v 1.63 2014/03/29 19:28:24 christos Exp $"); 53 54 #include <sys/param.h> 55 #include <sys/device.h> 56 #include <sys/errno.h> 57 #include <sys/systm.h> 58 #include <sys/audioio.h> 59 #include <sys/select.h> 60 #include <sys/mutex.h> 61 #include <sys/kmem.h> 62 #include <sys/malloc.h> 63 64 #include <dev/audio_if.h> 65 #include <dev/audiovar.h> 66 #include <dev/auconv.h> 67 #include <dev/mulaw.h> 68 69 #include <dev/ic/ac97reg.h> 70 #include <dev/ic/ac97var.h> 71 72 #include <dev/pci/pcireg.h> 73 #include <dev/pci/pcivar.h> 74 #include <dev/pci/pcidevs.h> 75 #include <dev/pci/emuxkireg.h> 76 #include <dev/pci/emuxkivar.h> 77 78 /* autoconf goo */ 79 static int emuxki_match(device_t, cfdata_t, void *); 80 static void emuxki_attach(device_t, device_t, void *); 81 static int emuxki_detach(device_t, int); 82 83 /* DMA mem mgmt */ 84 static struct dmamem *dmamem_alloc(bus_dma_tag_t, size_t, bus_size_t, 85 int); 86 static void dmamem_free(struct dmamem *); 87 88 /* Emu10k1 init & shutdown */ 89 static int emuxki_init(struct emuxki_softc *); 90 static void emuxki_shutdown(struct emuxki_softc *); 91 92 /* Emu10k1 mem mgmt */ 93 static void *emuxki_pmem_alloc(struct emuxki_softc *, size_t); 94 static void *emuxki_rmem_alloc(struct emuxki_softc *, size_t); 95 96 /* 97 * Emu10k1 channels funcs : There is no direct access to channels, everything 98 * is done through voices I will at least provide channel based fx params 99 * modification, later... 100 */ 101 102 /* Emu10k1 voice mgmt */ 103 static struct emuxki_voice *emuxki_voice_new(struct emuxki_softc *, 104 uint8_t); 105 static void emuxki_voice_delete(struct emuxki_voice *); 106 static int emuxki_voice_set_audioparms(struct emuxki_softc *, 107 struct emuxki_voice *, uint8_t, 108 uint8_t, uint32_t); 109 /* emuxki_voice_set_fxparms will come later, it'll need channel distinction */ 110 static int emuxki_voice_set_bufparms(struct emuxki_voice *, 111 void *, uint32_t, uint16_t); 112 static void emuxki_voice_commit_parms(struct emuxki_voice *); 113 static int emuxki_voice_adc_rate(struct emuxki_voice *); 114 static uint32_t emuxki_voice_curaddr(struct emuxki_voice *); 115 static void emuxki_voice_start(struct emuxki_voice *, 116 void (*) (void *), void *); 117 static void emuxki_voice_halt(struct emuxki_voice *); 118 119 /* 120 * Emu10k1 stream mgmt : not done yet 121 */ 122 #if 0 123 static struct emuxki_stream *emuxki_stream_new(struct emu10k1 *); 124 static void emuxki_stream_delete(struct emuxki_stream *); 125 static int emuxki_stream_set_audio_params(struct emuxki_stream *, 126 uint8_t, uint8_t, uint8_t, uint16_t); 127 static void emuxki_stream_start(struct emuxki_stream *); 128 static void emuxki_stream_halt(struct emuxki_stream *); 129 #endif 130 131 /* audio interface callbacks */ 132 133 static int emuxki_open(void *, int); 134 static void emuxki_close(void *); 135 136 static int emuxki_query_encoding(void *, struct audio_encoding *); 137 static int emuxki_set_params(void *, int, int, audio_params_t *, 138 audio_params_t *, stream_filter_list_t *, 139 stream_filter_list_t *); 140 141 static int emuxki_round_blocksize(void *, int, int, const audio_params_t *); 142 static size_t emuxki_round_buffersize(void *, int, size_t); 143 144 static int emuxki_trigger_output(void *, void *, void *, int, 145 void (*)(void *), void *, const audio_params_t *); 146 static int emuxki_trigger_input(void *, void *, void *, int, 147 void (*) (void *), void *, const audio_params_t *); 148 static int emuxki_halt_output(void *); 149 static int emuxki_halt_input(void *); 150 151 static int emuxki_getdev(void *, struct audio_device *); 152 static int emuxki_set_port(void *, mixer_ctrl_t *); 153 static int emuxki_get_port(void *, mixer_ctrl_t *); 154 static int emuxki_query_devinfo(void *, mixer_devinfo_t *); 155 156 static void *emuxki_allocm(void *, int, size_t); 157 static void emuxki_freem(void *, void *, size_t); 158 159 static paddr_t emuxki_mappage(void *, void *, off_t, int); 160 static int emuxki_get_props(void *); 161 static void emuxki_get_locks(void *, kmutex_t **, kmutex_t **); 162 163 /* Interrupt handler */ 164 static int emuxki_intr(void *); 165 166 /* Emu10k1 AC97 interface callbacks */ 167 static int emuxki_ac97_attach(void *, struct ac97_codec_if *); 168 static int emuxki_ac97_read(void *, uint8_t, uint16_t *); 169 static int emuxki_ac97_write(void *, uint8_t, uint16_t); 170 static int emuxki_ac97_reset(void *); 171 static enum ac97_host_flags emuxki_ac97_flags(void *); 172 173 /* 174 * Autoconfig goo. 175 */ 176 CFATTACH_DECL_NEW(emuxki, sizeof(struct emuxki_softc), 177 emuxki_match, emuxki_attach, emuxki_detach, NULL); 178 179 static const struct audio_hw_if emuxki_hw_if = { 180 emuxki_open, 181 emuxki_close, 182 NULL, /* drain */ 183 emuxki_query_encoding, 184 emuxki_set_params, 185 emuxki_round_blocksize, 186 NULL, /* commit settings */ 187 NULL, /* init_output */ 188 NULL, /* init_input */ 189 NULL, /* start_output */ 190 NULL, /* start_input */ 191 emuxki_halt_output, 192 emuxki_halt_input, 193 NULL, /* speaker_ctl */ 194 emuxki_getdev, 195 NULL, /* setfd */ 196 emuxki_set_port, 197 emuxki_get_port, 198 emuxki_query_devinfo, 199 emuxki_allocm, 200 emuxki_freem, 201 emuxki_round_buffersize, 202 emuxki_mappage, 203 emuxki_get_props, 204 emuxki_trigger_output, 205 emuxki_trigger_input, 206 NULL, /* dev_ioctl */ 207 emuxki_get_locks, 208 }; 209 210 #if 0 211 static const int emuxki_recsrc_intrmasks[EMU_NUMRECSRCS] = 212 { EMU_INTE_MICBUFENABLE, EMU_INTE_ADCBUFENABLE, EMU_INTE_EFXBUFENABLE }; 213 #endif 214 static const uint32_t emuxki_recsrc_bufaddrreg[EMU_NUMRECSRCS] = 215 { EMU_MICBA, EMU_ADCBA, EMU_FXBA }; 216 static const uint32_t emuxki_recsrc_szreg[EMU_NUMRECSRCS] = 217 { EMU_MICBS, EMU_ADCBS, EMU_FXBS }; 218 static const int emuxki_recbuf_sz[] = { 219 0, 384, 448, 512, 640, 768, 896, 1024, 1280, 1536, 1792, 220 2048, 2560, 3072, 3584, 4096, 5120, 6144, 7168, 8192, 10240, 221 12288, 14366, 16384, 20480, 24576, 28672, 32768, 40960, 49152, 222 57344, 65536 223 }; 224 225 #define EMUXKI_NFORMATS 4 226 static const struct audio_format emuxki_formats[EMUXKI_NFORMATS] = { 227 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16, 228 2, AUFMT_STEREO, 0, {4000, 48000}}, 229 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16, 230 1, AUFMT_MONAURAL, 0, {4000, 48000}}, 231 {NULL, AUMODE_PLAY, AUDIO_ENCODING_ULINEAR_LE, 8, 8, 232 2, AUFMT_STEREO, 0, {4000, 48000}}, 233 {NULL, AUMODE_PLAY, AUDIO_ENCODING_ULINEAR_LE, 8, 8, 234 1, AUFMT_MONAURAL, 0, {4000, 48000}}, 235 }; 236 237 /* 238 * DMA memory mgmt 239 */ 240 241 static void 242 dmamem_delete(struct dmamem *mem) 243 { 244 245 kmem_free(mem->segs, mem->nsegs * sizeof(*(mem->segs))); 246 kmem_free(mem, sizeof(*mem)); 247 } 248 249 static struct dmamem * 250 dmamem_alloc(bus_dma_tag_t dmat, size_t size, bus_size_t align, int nsegs) 251 { 252 struct dmamem *mem; 253 254 /* Allocate memory for structure */ 255 if ((mem = kmem_alloc(sizeof(*mem), KM_SLEEP)) == NULL) 256 return NULL; 257 mem->dmat = dmat; 258 mem->size = size; 259 mem->align = align; 260 mem->nsegs = nsegs; 261 mem->bound = 0; 262 263 mem->segs = kmem_alloc(mem->nsegs * sizeof(*(mem->segs)), KM_SLEEP); 264 if (mem->segs == NULL) { 265 kmem_free(mem, sizeof(*mem)); 266 return NULL; 267 } 268 269 if (bus_dmamem_alloc(dmat, mem->size, mem->align, mem->bound, 270 mem->segs, mem->nsegs, &(mem->rsegs), 271 BUS_DMA_WAITOK)) { 272 dmamem_delete(mem); 273 return NULL; 274 } 275 276 if (bus_dmamem_map(dmat, mem->segs, mem->nsegs, mem->size, 277 &(mem->kaddr), BUS_DMA_WAITOK | BUS_DMA_COHERENT)) { 278 bus_dmamem_free(dmat, mem->segs, mem->nsegs); 279 dmamem_delete(mem); 280 return NULL; 281 } 282 283 if (bus_dmamap_create(dmat, mem->size, mem->nsegs, mem->size, 284 mem->bound, BUS_DMA_WAITOK, &(mem->map))) { 285 bus_dmamem_unmap(dmat, mem->kaddr, mem->size); 286 bus_dmamem_free(dmat, mem->segs, mem->nsegs); 287 dmamem_delete(mem); 288 return NULL; 289 } 290 291 if (bus_dmamap_load(dmat, mem->map, mem->kaddr, 292 mem->size, NULL, BUS_DMA_WAITOK)) { 293 bus_dmamap_destroy(dmat, mem->map); 294 bus_dmamem_unmap(dmat, mem->kaddr, mem->size); 295 bus_dmamem_free(dmat, mem->segs, mem->nsegs); 296 dmamem_delete(mem); 297 return NULL; 298 } 299 300 return mem; 301 } 302 303 static void 304 dmamem_free(struct dmamem *mem) 305 { 306 307 bus_dmamap_unload(mem->dmat, mem->map); 308 bus_dmamap_destroy(mem->dmat, mem->map); 309 bus_dmamem_unmap(mem->dmat, mem->kaddr, mem->size); 310 bus_dmamem_free(mem->dmat, mem->segs, mem->nsegs); 311 dmamem_delete(mem); 312 } 313 314 315 /* 316 * Autoconf device callbacks : attach and detach 317 */ 318 319 static void 320 emuxki_pci_shutdown(struct emuxki_softc *sc) 321 { 322 323 if (sc->sc_ih != NULL) 324 pci_intr_disestablish(sc->sc_pc, sc->sc_ih); 325 if (sc->sc_ios) 326 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios); 327 } 328 329 static int 330 emuxki_scinit(struct emuxki_softc *sc) 331 { 332 int err; 333 334 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG, 335 EMU_HCFG_LOCKSOUNDCACHE | EMU_HCFG_LOCKTANKCACHE_MASK | 336 EMU_HCFG_MUTEBUTTONENABLE); 337 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE, 338 EMU_INTE_SAMPLERATER | EMU_INTE_PCIERRENABLE); 339 340 if ((err = emuxki_init(sc))) 341 return err; 342 343 if (sc->sc_type & EMUXKI_AUDIGY2) { 344 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG, 345 EMU_HCFG_AUDIOENABLE | EMU_HCFG_AC3ENABLE_CDSPDIF | 346 EMU_HCFG_AC3ENABLE_GPSPDIF | EMU_HCFG_AUTOMUTE); 347 } else if (sc->sc_type & EMUXKI_AUDIGY) { 348 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG, 349 EMU_HCFG_AUDIOENABLE | EMU_HCFG_AUTOMUTE); 350 } else { 351 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG, 352 EMU_HCFG_AUDIOENABLE | EMU_HCFG_JOYENABLE | 353 EMU_HCFG_LOCKTANKCACHE_MASK | EMU_HCFG_AUTOMUTE); 354 } 355 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE, 356 bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_INTE) | 357 EMU_INTE_VOLINCRENABLE | EMU_INTE_VOLDECRENABLE | 358 EMU_INTE_MUTEENABLE); 359 if (sc->sc_type & EMUXKI_AUDIGY2) { 360 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A_IOCFG, 361 EMU_A_IOCFG_GPOUT0 | 362 bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_A_IOCFG)); 363 } 364 365 /* No multiple voice support for now */ 366 sc->pvoice = sc->rvoice = NULL; 367 368 return 0; 369 } 370 371 static int 372 emuxki_ac97_init(struct emuxki_softc *sc) 373 { 374 sc->hostif.arg = sc; 375 sc->hostif.attach = emuxki_ac97_attach; 376 sc->hostif.read = emuxki_ac97_read; 377 sc->hostif.write = emuxki_ac97_write; 378 sc->hostif.reset = emuxki_ac97_reset; 379 sc->hostif.flags = emuxki_ac97_flags; 380 return ac97_attach(&sc->hostif, sc->sc_dev, &sc->sc_lock); 381 } 382 383 static int 384 emuxki_match(device_t parent, cfdata_t match, void *aux) 385 { 386 struct pci_attach_args *pa; 387 388 pa = aux; 389 if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_CREATIVELABS) 390 return 0; 391 392 switch (PCI_PRODUCT(pa->pa_id)) { 393 case PCI_PRODUCT_CREATIVELABS_SBLIVE: 394 case PCI_PRODUCT_CREATIVELABS_SBLIVE2: 395 case PCI_PRODUCT_CREATIVELABS_AUDIGY: 396 return 1; 397 default: 398 return 0; 399 } 400 } 401 402 static void 403 emuxki_attach(device_t parent, device_t self, void *aux) 404 { 405 struct emuxki_softc *sc; 406 struct pci_attach_args *pa; 407 pci_intr_handle_t ih; 408 const char *intrstr; 409 char intrbuf[PCI_INTRSTR_LEN]; 410 411 sc = device_private(self); 412 sc->sc_dev = self; 413 pa = aux; 414 415 mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE); 416 mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_AUDIO); 417 mutex_init(&sc->sc_index_lock, MUTEX_DEFAULT, IPL_AUDIO); 418 mutex_init(&sc->sc_ac97_index_lock, MUTEX_DEFAULT, IPL_AUDIO); 419 420 if (pci_mapreg_map(pa, EMU_PCI_CBIO, PCI_MAPREG_TYPE_IO, 0, 421 &(sc->sc_iot), &(sc->sc_ioh), &(sc->sc_iob), 422 &(sc->sc_ios))) { 423 aprint_error(": can't map iospace\n"); 424 return; 425 } 426 427 pci_aprint_devinfo(pa, "Audio controller"); 428 429 sc->sc_pc = pa->pa_pc; 430 sc->sc_dmat = pa->pa_dmat; 431 pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, 432 pci_conf_read(pa->pa_pc, pa->pa_tag, 433 (PCI_COMMAND_STATUS_REG) | PCI_COMMAND_MASTER_ENABLE)); 434 435 if (pci_intr_map(pa, &ih)) { 436 aprint_error_dev(self, "couldn't map interrupt\n"); 437 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios); 438 return; 439 } 440 441 intrstr = pci_intr_string(pa->pa_pc, ih, intrbuf, sizeof(intrbuf)); 442 sc->sc_ih = pci_intr_establish(pa->pa_pc, ih, IPL_AUDIO, emuxki_intr, 443 sc); 444 if (sc->sc_ih == NULL) { 445 aprint_error_dev(self, "couldn't establish interrupt"); 446 if (intrstr != NULL) 447 aprint_error(" at %s", intrstr); 448 aprint_error("\n"); 449 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios); 450 return; 451 } 452 aprint_normal_dev(self, "interrupting at %s\n", intrstr); 453 454 /* XXX it's unknown whether APS is made from Audigy as well */ 455 if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_CREATIVELABS_AUDIGY) { 456 sc->sc_type = EMUXKI_AUDIGY; 457 if (PCI_REVISION(pa->pa_class) == 0x04) { 458 sc->sc_type |= EMUXKI_AUDIGY2; 459 strlcpy(sc->sc_audv.name, "Audigy2", sizeof sc->sc_audv.name); 460 } else { 461 strlcpy(sc->sc_audv.name, "Audigy", sizeof sc->sc_audv.name); 462 } 463 } else if (pci_conf_read(pa->pa_pc, pa->pa_tag, 464 PCI_SUBSYS_ID_REG) == EMU_SUBSYS_APS) { 465 sc->sc_type = EMUXKI_APS; 466 strlcpy(sc->sc_audv.name, "E-mu APS", sizeof sc->sc_audv.name); 467 } else { 468 sc->sc_type = EMUXKI_SBLIVE; 469 strlcpy(sc->sc_audv.name, "SB Live!", sizeof sc->sc_audv.name); 470 } 471 snprintf(sc->sc_audv.version, sizeof sc->sc_audv.version, "0x%02x", 472 PCI_REVISION(pa->pa_class)); 473 strlcpy(sc->sc_audv.config, "emuxki", sizeof sc->sc_audv.config); 474 475 if (emuxki_scinit(sc) || emuxki_ac97_init(sc) || 476 (sc->sc_audev = audio_attach_mi(&emuxki_hw_if, sc, self)) == NULL) { 477 emuxki_pci_shutdown(sc); 478 return; 479 } 480 #if 0 481 mutex_enter(&sc->lock); 482 sc->rsourcectl.dev = 483 sc->codecif->vtbl->get_portnum_by_name(sc->codec_if, AudioCrecord, 484 AudioNsource, NULL); 485 sc->rsourcectl.cp = AUDIO_MIXER_ENUM; 486 mutex_exit(&sc->lock); 487 #endif 488 } 489 490 static int 491 emuxki_detach(device_t self, int flags) 492 { 493 struct emuxki_softc *sc; 494 495 sc = device_private(self); 496 if (sc->sc_audev != NULL) /* Test in case audio didn't attach */ 497 config_detach(sc->sc_audev, 0); 498 499 /* All voices should be stopped now but add some code here if not */ 500 501 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG, 502 EMU_HCFG_LOCKSOUNDCACHE | EMU_HCFG_LOCKTANKCACHE_MASK | 503 EMU_HCFG_MUTEBUTTONENABLE); 504 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE, 0); 505 506 mutex_enter(&sc->sc_lock); 507 emuxki_shutdown(sc); 508 mutex_exit(&sc->sc_lock); 509 510 emuxki_pci_shutdown(sc); 511 512 mutex_destroy(&sc->sc_lock); 513 mutex_destroy(&sc->sc_intr_lock); 514 mutex_destroy(&sc->sc_index_lock); 515 mutex_destroy(&sc->sc_ac97_index_lock); 516 517 return 0; 518 } 519 520 521 /* Misc stuff relative to emu10k1 */ 522 523 static uint32_t 524 emuxki_rate_to_pitch(uint32_t rate) 525 { 526 static const uint32_t logMagTable[128] = { 527 0x00000, 0x02dfc, 0x05b9e, 0x088e6, 0x0b5d6, 0x0e26f, 0x10eb3, 528 0x13aa2, 0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 0x2118b, 0x23b9a, 529 0x2655d, 0x28ed5, 0x2b803, 0x2e0e8, 0x30985, 0x331db, 0x359eb, 530 0x381b6, 0x3a93d, 0x3d081, 0x3f782, 0x41e42, 0x444c1, 0x46b01, 531 0x49101, 0x4b6c4, 0x4dc49, 0x50191, 0x5269e, 0x54b6f, 0x57006, 532 0x59463, 0x5b888, 0x5dc74, 0x60029, 0x623a7, 0x646ee, 0x66a00, 533 0x68cdd, 0x6af86, 0x6d1fa, 0x6f43c, 0x7164b, 0x73829, 0x759d4, 534 0x77b4f, 0x79c9a, 0x7bdb5, 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e, 535 0x86082, 0x88089, 0x8a064, 0x8c014, 0x8df98, 0x8fef1, 0x91e20, 536 0x93d26, 0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 0x9d5d9, 0x9f3ec, 537 0xa11d8, 0xa2f9d, 0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 0xac241, 538 0xadf26, 0xafbe7, 0xb1885, 0xb3500, 0xb5157, 0xb6d8c, 0xb899f, 539 0xba58f, 0xbc15e, 0xbdd0c, 0xbf899, 0xc1404, 0xc2f50, 0xc4a7b, 540 0xc6587, 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c, 0xceaec, 0xd053f, 541 0xd1f73, 0xd398a, 0xd5384, 0xd6d60, 0xd8720, 0xda0c3, 0xdba4a, 542 0xdd3b4, 0xded03, 0xe0636, 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3, 543 0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 0xee44c, 0xefc78, 0xf148a, 544 0xf2c83, 0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 0xfa2f0, 0xfba57, 545 0xfd1a7, 0xfe8df 546 }; 547 static const uint8_t logSlopeTable[128] = { 548 0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58, 549 0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53, 550 0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f, 551 0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b, 552 0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47, 553 0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44, 554 0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41, 555 0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e, 556 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c, 557 0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 558 0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37, 559 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35, 560 0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34, 561 0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32, 562 0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30, 563 0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f 564 }; 565 int8_t i; 566 567 if (rate == 0) 568 return 0; /* Bail out if no leading "1" */ 569 rate *= 11185; /* Scale 48000 to 0x20002380 */ 570 for (i = 31; i > 0; i--) { 571 if (rate & 0x80000000) { /* Detect leading "1" */ 572 return (((uint32_t) (i - 15) << 20) + 573 logMagTable[0x7f & (rate >> 24)] + 574 (0x7f & (rate >> 17)) * 575 logSlopeTable[0x7f & (rate >> 24)]); 576 } 577 rate <<= 1; 578 } 579 580 return 0; /* Should never reach this point */ 581 } 582 583 /* Emu10k1 Low level */ 584 585 static uint32_t 586 emuxki_read(struct emuxki_softc *sc, uint16_t chano, uint32_t reg) 587 { 588 uint32_t ptr, mask; 589 uint8_t size, offset; 590 591 mask = 0xffffffff; 592 offset = 0; 593 ptr = ((((u_int32_t) reg) << 16) & 594 (sc->sc_type & EMUXKI_AUDIGY ? 595 EMU_A_PTR_ADDR_MASK : EMU_PTR_ADDR_MASK)) | 596 (chano & EMU_PTR_CHNO_MASK); 597 if (reg & 0xff000000) { 598 size = (reg >> 24) & 0x3f; 599 offset = (reg >> 16) & 0x1f; 600 mask = ((1 << size) - 1) << offset; 601 } 602 603 mutex_spin_enter(&sc->sc_index_lock); 604 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_PTR, ptr); 605 ptr = (bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_DATA) & mask) 606 >> offset; 607 mutex_spin_exit(&sc->sc_index_lock); 608 609 return ptr; 610 } 611 612 static void 613 emuxki_write(struct emuxki_softc *sc, uint16_t chano, 614 uint32_t reg, uint32_t data) 615 { 616 uint32_t ptr, mask; 617 uint8_t size, offset; 618 619 ptr = ((((u_int32_t) reg) << 16) & 620 (sc->sc_type & EMUXKI_AUDIGY ? 621 EMU_A_PTR_ADDR_MASK : EMU_PTR_ADDR_MASK)) | 622 (chano & EMU_PTR_CHNO_MASK); 623 if (reg & 0xff000000) { 624 size = (reg >> 24) & 0x3f; 625 offset = (reg >> 16) & 0x1f; 626 mask = ((1 << size) - 1) << offset; 627 data = ((data << offset) & mask) | 628 (emuxki_read(sc, chano, reg & 0xffff) & ~mask); 629 } 630 631 mutex_spin_enter(&sc->sc_index_lock); 632 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_PTR, ptr); 633 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_DATA, data); 634 mutex_spin_exit(&sc->sc_index_lock); 635 } 636 637 /* Microcode should this go in /sys/dev/microcode ? */ 638 639 static void 640 emuxki_write_micro(struct emuxki_softc *sc, uint32_t pc, uint32_t data) 641 { 642 643 emuxki_write(sc, 0, 644 (sc->sc_type & EMUXKI_AUDIGY ? 645 EMU_A_MICROCODEBASE : EMU_MICROCODEBASE) + pc, 646 data); 647 } 648 649 static void 650 emuxki_dsp_addop(struct emuxki_softc *sc, uint16_t *pc, uint8_t op, 651 uint16_t r, uint16_t a, uint16_t x, uint16_t y) 652 { 653 654 if (sc->sc_type & EMUXKI_AUDIGY) { 655 emuxki_write_micro(sc, *pc << 1, 656 ((x << 12) & EMU_A_DSP_LOWORD_OPX_MASK) | 657 (y & EMU_A_DSP_LOWORD_OPY_MASK)); 658 emuxki_write_micro(sc, (*pc << 1) + 1, 659 ((op << 24) & EMU_A_DSP_HIWORD_OPCODE_MASK) | 660 ((r << 12) & EMU_A_DSP_HIWORD_RESULT_MASK) | 661 (a & EMU_A_DSP_HIWORD_OPA_MASK)); 662 } else { 663 emuxki_write_micro(sc, *pc << 1, 664 ((x << 10) & EMU_DSP_LOWORD_OPX_MASK) | 665 (y & EMU_DSP_LOWORD_OPY_MASK)); 666 emuxki_write_micro(sc, (*pc << 1) + 1, 667 ((op << 20) & EMU_DSP_HIWORD_OPCODE_MASK) | 668 ((r << 10) & EMU_DSP_HIWORD_RESULT_MASK) | 669 (a & EMU_DSP_HIWORD_OPA_MASK)); 670 } 671 (*pc)++; 672 } 673 674 /* init and shutdown */ 675 676 static void 677 emuxki_initfx(struct emuxki_softc *sc) 678 { 679 uint16_t pc; 680 681 /* Set all GPRs to 0 */ 682 for (pc = 0; pc < 256; pc++) 683 emuxki_write(sc, 0, EMU_DSP_GPR(pc), 0); 684 for (pc = 0; pc < 160; pc++) { 685 emuxki_write(sc, 0, EMU_TANKMEMDATAREGBASE + pc, 0); 686 emuxki_write(sc, 0, EMU_TANKMEMADDRREGBASE + pc, 0); 687 } 688 pc = 0; 689 690 if (sc->sc_type & EMUXKI_AUDIGY) { 691 /* AC97 Out (l/r) = AC97 In (l/r) + FX[0/1] * 4 */ 692 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 693 EMU_A_DSP_OUTL(EMU_A_DSP_OUT_A_FRONT), 694 EMU_A_DSP_CST(0), 695 EMU_DSP_FX(0), EMU_A_DSP_CST(4)); 696 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 697 EMU_A_DSP_OUTR(EMU_A_DSP_OUT_A_FRONT), 698 EMU_A_DSP_CST(0), 699 EMU_DSP_FX(1), EMU_A_DSP_CST(4)); 700 701 /* Rear channel OUT (l/r) = FX[2/3] * 4 */ 702 #if 0 703 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 704 EMU_A_DSP_OUTL(EMU_A_DSP_OUT_A_REAR), 705 EMU_A_DSP_OUTL(EMU_A_DSP_OUT_A_FRONT), 706 EMU_DSP_FX(0), EMU_A_DSP_CST(4)); 707 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 708 EMU_A_DSP_OUTR(EMU_A_DSP_OUT_A_REAR), 709 EMU_A_DSP_OUTR(EMU_A_DSP_OUT_A_FRONT), 710 EMU_DSP_FX(1), EMU_A_DSP_CST(4)); 711 #endif 712 /* ADC recording (l/r) = AC97 In (l/r) */ 713 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3, 714 EMU_A_DSP_OUTL(EMU_A_DSP_OUT_ADC), 715 EMU_A_DSP_INL(EMU_DSP_IN_AC97), 716 EMU_A_DSP_CST(0), EMU_A_DSP_CST(0)); 717 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3, 718 EMU_A_DSP_OUTR(EMU_A_DSP_OUT_ADC), 719 EMU_A_DSP_INR(EMU_DSP_IN_AC97), 720 EMU_A_DSP_CST(0), EMU_A_DSP_CST(0)); 721 722 /* zero out the rest of the microcode */ 723 while (pc < 512) 724 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3, 725 EMU_A_DSP_CST(0), EMU_A_DSP_CST(0), 726 EMU_A_DSP_CST(0), EMU_A_DSP_CST(0)); 727 728 emuxki_write(sc, 0, EMU_A_DBG, 0); /* Is it really necessary ? */ 729 } else { 730 /* AC97 Out (l/r) = AC97 In (l/r) + FX[0/1] * 4 */ 731 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 732 EMU_DSP_OUTL(EMU_DSP_OUT_A_FRONT), 733 EMU_DSP_CST(0), 734 EMU_DSP_FX(0), EMU_DSP_CST(4)); 735 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 736 EMU_DSP_OUTR(EMU_DSP_OUT_A_FRONT), 737 EMU_DSP_CST(0), 738 EMU_DSP_FX(1), EMU_DSP_CST(4)); 739 740 /* Rear channel OUT (l/r) = FX[2/3] * 4 */ 741 #if 0 742 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 743 EMU_DSP_OUTL(EMU_DSP_OUT_AD_REAR), 744 EMU_DSP_OUTL(EMU_DSP_OUT_A_FRONT), 745 EMU_DSP_FX(0), EMU_DSP_CST(4)); 746 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS, 747 EMU_DSP_OUTR(EMU_DSP_OUT_AD_REAR), 748 EMU_DSP_OUTR(EMU_DSP_OUT_A_FRONT), 749 EMU_DSP_FX(1), EMU_DSP_CST(4)); 750 #endif 751 /* ADC recording (l/r) = AC97 In (l/r) */ 752 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3, 753 EMU_DSP_OUTL(EMU_DSP_OUT_ADC), 754 EMU_DSP_INL(EMU_DSP_IN_AC97), 755 EMU_DSP_CST(0), EMU_DSP_CST(0)); 756 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3, 757 EMU_DSP_OUTR(EMU_DSP_OUT_ADC), 758 EMU_DSP_INR(EMU_DSP_IN_AC97), 759 EMU_DSP_CST(0), EMU_DSP_CST(0)); 760 761 /* zero out the rest of the microcode */ 762 while (pc < 512) 763 emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3, 764 EMU_DSP_CST(0), EMU_DSP_CST(0), 765 EMU_DSP_CST(0), EMU_DSP_CST(0)); 766 767 emuxki_write(sc, 0, EMU_DBG, 0); /* Is it really necessary ? */ 768 } 769 } 770 771 static int 772 emuxki_init(struct emuxki_softc *sc) 773 { 774 uint16_t i; 775 uint32_t spcs, *ptb; 776 bus_addr_t silentpage; 777 778 /* disable any channel interrupt */ 779 emuxki_write(sc, 0, EMU_CLIEL, 0); 780 emuxki_write(sc, 0, EMU_CLIEH, 0); 781 emuxki_write(sc, 0, EMU_SOLEL, 0); 782 emuxki_write(sc, 0, EMU_SOLEH, 0); 783 784 /* Set recording buffers sizes to zero */ 785 emuxki_write(sc, 0, EMU_MICBS, EMU_RECBS_BUFSIZE_NONE); 786 emuxki_write(sc, 0, EMU_MICBA, 0); 787 emuxki_write(sc, 0, EMU_FXBS, EMU_RECBS_BUFSIZE_NONE); 788 emuxki_write(sc, 0, EMU_FXBA, 0); 789 emuxki_write(sc, 0, EMU_ADCBS, EMU_RECBS_BUFSIZE_NONE); 790 emuxki_write(sc, 0, EMU_ADCBA, 0); 791 792 if(sc->sc_type & EMUXKI_AUDIGY) { 793 emuxki_write(sc, 0, EMU_SPBYPASS, EMU_SPBYPASS_24_BITS); 794 emuxki_write(sc, 0, EMU_AC97SLOT, EMU_AC97SLOT_CENTER | EMU_AC97SLOT_LFE); 795 } 796 797 /* Initialize all channels to stopped and no effects */ 798 for (i = 0; i < EMU_NUMCHAN; i++) { 799 emuxki_write(sc, i, EMU_CHAN_DCYSUSV, 0); 800 emuxki_write(sc, i, EMU_CHAN_IP, 0); 801 emuxki_write(sc, i, EMU_CHAN_VTFT, 0xffff); 802 emuxki_write(sc, i, EMU_CHAN_CVCF, 0xffff); 803 emuxki_write(sc, i, EMU_CHAN_PTRX, 0); 804 emuxki_write(sc, i, EMU_CHAN_CPF, 0); 805 emuxki_write(sc, i, EMU_CHAN_CCR, 0); 806 emuxki_write(sc, i, EMU_CHAN_PSST, 0); 807 emuxki_write(sc, i, EMU_CHAN_DSL, 0x10); /* Why 16 ? */ 808 emuxki_write(sc, i, EMU_CHAN_CCCA, 0); 809 emuxki_write(sc, i, EMU_CHAN_Z1, 0); 810 emuxki_write(sc, i, EMU_CHAN_Z2, 0); 811 emuxki_write(sc, i, EMU_CHAN_FXRT, 0x32100000); 812 emuxki_write(sc, i, EMU_CHAN_ATKHLDM, 0); 813 emuxki_write(sc, i, EMU_CHAN_DCYSUSM, 0); 814 emuxki_write(sc, i, EMU_CHAN_IFATN, 0xffff); 815 emuxki_write(sc, i, EMU_CHAN_PEFE, 0); 816 emuxki_write(sc, i, EMU_CHAN_FMMOD, 0); 817 emuxki_write(sc, i, EMU_CHAN_TREMFRQ, 24); 818 emuxki_write(sc, i, EMU_CHAN_FM2FRQ2, 24); 819 emuxki_write(sc, i, EMU_CHAN_TEMPENV, 0); 820 821 /* these are last so OFF prevents writing */ 822 emuxki_write(sc, i, EMU_CHAN_LFOVAL2, 0); 823 emuxki_write(sc, i, EMU_CHAN_LFOVAL1, 0); 824 emuxki_write(sc, i, EMU_CHAN_ATKHLDV, 0); 825 emuxki_write(sc, i, EMU_CHAN_ENVVOL, 0); 826 emuxki_write(sc, i, EMU_CHAN_ENVVAL, 0); 827 } 828 829 /* set digital outputs format */ 830 spcs = (EMU_SPCS_CLKACCY_1000PPM | EMU_SPCS_SAMPLERATE_48 | 831 EMU_SPCS_CHANNELNUM_LEFT | EMU_SPCS_SOURCENUM_UNSPEC | 832 EMU_SPCS_GENERATIONSTATUS | 0x00001200 /* Cat code. */ | 833 0x00000000 /* IEC-958 Mode */ | EMU_SPCS_EMPHASIS_NONE | 834 EMU_SPCS_COPYRIGHT); 835 emuxki_write(sc, 0, EMU_SPCS0, spcs); 836 emuxki_write(sc, 0, EMU_SPCS1, spcs); 837 emuxki_write(sc, 0, EMU_SPCS2, spcs); 838 839 if(sc->sc_type & EMUXKI_AUDIGY2) { 840 emuxki_write(sc, 0, EMU_A2_SPDIF_SAMPLERATE, EMU_A2_SPDIF_UNKNOWN); 841 842 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A2_PTR, EMU_A2_SRCSEL); 843 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A2_DATA, 844 EMU_A2_SRCSEL_ENABLE_SPDIF | EMU_A2_SRCSEL_ENABLE_SRCMULTI); 845 846 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A2_PTR, EMU_A2_SRCMULTI); 847 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A2_DATA, EMU_A2_SRCMULTI_ENABLE_INPUT); 848 } 849 850 851 /* Let's play with sound processor */ 852 emuxki_initfx(sc); 853 854 /* Here is our Page Table */ 855 if ((sc->ptb = dmamem_alloc(sc->sc_dmat, 856 EMU_MAXPTE * sizeof(u_int32_t), 857 EMU_DMA_ALIGN, EMU_DMAMEM_NSEG)) == NULL) 858 return ENOMEM; 859 860 /* This is necessary unless you like Metallic noise... */ 861 if ((sc->silentpage = dmamem_alloc(sc->sc_dmat, EMU_PTESIZE, 862 EMU_DMA_ALIGN, EMU_DMAMEM_NSEG))==NULL){ 863 dmamem_free(sc->ptb); 864 return ENOMEM; 865 } 866 867 /* Zero out the silent page */ 868 /* This might not be always true, it might be 128 for 8bit channels */ 869 memset(KERNADDR(sc->silentpage), 0, DMASIZE(sc->silentpage)); 870 871 /* 872 * Set all the PTB Entries to the silent page We shift the physical 873 * address by one and OR it with the page number. I don't know what 874 * the ORed index is for, might be a very useful unused feature... 875 */ 876 silentpage = DMAADDR(sc->silentpage) << 1; 877 ptb = KERNADDR(sc->ptb); 878 for (i = 0; i < EMU_MAXPTE; i++) 879 ptb[i] = htole32(silentpage | i); 880 881 /* Write PTB address and set TCB to none */ 882 emuxki_write(sc, 0, EMU_PTB, DMAADDR(sc->ptb)); 883 emuxki_write(sc, 0, EMU_TCBS, 0); /* This means 16K TCB */ 884 emuxki_write(sc, 0, EMU_TCB, 0); /* No TCB use for now */ 885 886 /* 887 * Set channels MAPs to the silent page. 888 * I don't know what MAPs are for. 889 */ 890 silentpage |= EMU_CHAN_MAP_PTI_MASK; 891 for (i = 0; i < EMU_NUMCHAN; i++) { 892 emuxki_write(sc, i, EMU_CHAN_MAPA, silentpage); 893 emuxki_write(sc, i, EMU_CHAN_MAPB, silentpage); 894 sc->channel[i] = NULL; 895 } 896 897 /* Init voices list */ 898 LIST_INIT(&(sc->voices)); 899 900 /* Timer is stopped */ 901 sc->timerstate &= ~EMU_TIMER_STATE_ENABLED; 902 return 0; 903 } 904 905 static void 906 emuxki_shutdown(struct emuxki_softc *sc) 907 { 908 uint32_t i; 909 910 /* Disable any Channels interrupts */ 911 emuxki_write(sc, 0, EMU_CLIEL, 0); 912 emuxki_write(sc, 0, EMU_CLIEH, 0); 913 emuxki_write(sc, 0, EMU_SOLEL, 0); 914 emuxki_write(sc, 0, EMU_SOLEH, 0); 915 916 /* 917 * Should do some voice(stream) stopping stuff here, that's what will 918 * stop and deallocate all channels. 919 */ 920 921 /* Stop all channels */ 922 /* XXX This shouldn't be necessary, I'll remove once everything works */ 923 for (i = 0; i < EMU_NUMCHAN; i++) 924 emuxki_write(sc, i, EMU_CHAN_DCYSUSV, 0); 925 for (i = 0; i < EMU_NUMCHAN; i++) { 926 emuxki_write(sc, i, EMU_CHAN_VTFT, 0); 927 emuxki_write(sc, i, EMU_CHAN_CVCF, 0); 928 emuxki_write(sc, i, EMU_CHAN_PTRX, 0); 929 emuxki_write(sc, i, EMU_CHAN_CPF, 0); 930 } 931 932 /* 933 * Deallocate Emu10k1 caches and recording buffers. Again it will be 934 * removed because it will be done in voice shutdown. 935 */ 936 emuxki_write(sc, 0, EMU_MICBS, EMU_RECBS_BUFSIZE_NONE); 937 emuxki_write(sc, 0, EMU_MICBA, 0); 938 emuxki_write(sc, 0, EMU_FXBS, EMU_RECBS_BUFSIZE_NONE); 939 emuxki_write(sc, 0, EMU_FXBA, 0); 940 if(sc->sc_type & EMUXKI_AUDIGY) { 941 emuxki_write(sc, 0, EMU_A_FXWC1, 0); 942 emuxki_write(sc, 0, EMU_A_FXWC2, 0); 943 } else { 944 emuxki_write(sc, 0, EMU_FXWC, 0); 945 } 946 emuxki_write(sc, 0, EMU_ADCBS, EMU_RECBS_BUFSIZE_NONE); 947 emuxki_write(sc, 0, EMU_ADCBA, 0); 948 949 /* 950 * XXX I don't know yet how I will handle tank cache buffer, 951 * I don't even clearly know what it is for. 952 */ 953 emuxki_write(sc, 0, EMU_TCB, 0); /* 16K again */ 954 emuxki_write(sc, 0, EMU_TCBS, 0); 955 956 emuxki_write(sc, 0, EMU_DBG, 0x8000); /* necessary ? */ 957 958 dmamem_free(sc->silentpage); 959 dmamem_free(sc->ptb); 960 } 961 962 /* Emu10k1 Memory management */ 963 964 static struct emuxki_mem * 965 emuxki_mem_new(struct emuxki_softc *sc, int ptbidx, size_t size) 966 { 967 struct emuxki_mem *mem; 968 969 if ((mem = kmem_alloc(sizeof(*mem), KM_SLEEP)) == NULL) 970 return NULL; 971 972 mem->ptbidx = ptbidx; 973 if ((mem->dmamem = dmamem_alloc(sc->sc_dmat, size, EMU_DMA_ALIGN, 974 EMU_DMAMEM_NSEG)) == NULL) { 975 kmem_free(mem, sizeof(*mem)); 976 return NULL; 977 } 978 return mem; 979 } 980 981 static void 982 emuxki_mem_delete(struct emuxki_mem *mem, size_t size) 983 { 984 985 dmamem_free(mem->dmamem); 986 kmem_free(mem, sizeof(*mem)); 987 } 988 989 static void * 990 emuxki_pmem_alloc(struct emuxki_softc *sc, size_t size) 991 { 992 int i, j; 993 size_t numblocks; 994 struct emuxki_mem *mem; 995 uint32_t *ptb, silentpage; 996 997 ptb = KERNADDR(sc->ptb); 998 silentpage = DMAADDR(sc->silentpage) << 1; 999 numblocks = size / EMU_PTESIZE; 1000 if (size % EMU_PTESIZE) 1001 numblocks++; 1002 1003 for (i = 0; i < EMU_MAXPTE; i++) { 1004 mutex_spin_enter(&sc->sc_intr_lock); 1005 if ((le32toh(ptb[i]) & EMU_CHAN_MAP_PTE_MASK) == silentpage) { 1006 /* We look for a free PTE */ 1007 for (j = 0; j < numblocks; j++) 1008 if ((le32toh(ptb[i + j]) 1009 & EMU_CHAN_MAP_PTE_MASK) != silentpage) 1010 break; 1011 if (j == numblocks) { 1012 mutex_spin_exit(&sc->sc_intr_lock); 1013 if ((mem = emuxki_mem_new(sc, i, 1014 size)) == NULL) { 1015 return NULL; 1016 } 1017 mutex_spin_enter(&sc->sc_intr_lock); 1018 for (j = 0; j < numblocks; j++) 1019 ptb[i + j] = 1020 htole32((((DMAADDR(mem->dmamem) + 1021 j * EMU_PTESIZE)) << 1) | (i + j)); 1022 LIST_INSERT_HEAD(&(sc->mem), mem, next); 1023 mutex_spin_exit(&sc->sc_intr_lock); 1024 return (KERNADDR(mem->dmamem)); 1025 } else 1026 i += j; 1027 } 1028 mutex_spin_exit(&sc->sc_intr_lock); 1029 } 1030 return NULL; 1031 } 1032 1033 static void * 1034 emuxki_rmem_alloc(struct emuxki_softc *sc, size_t size) 1035 { 1036 struct emuxki_mem *mem; 1037 1038 mem = emuxki_mem_new(sc, EMU_RMEM, size); 1039 if (mem == NULL) 1040 return NULL; 1041 1042 mutex_spin_enter(&sc->sc_intr_lock); 1043 LIST_INSERT_HEAD(&(sc->mem), mem, next); 1044 mutex_spin_exit(&sc->sc_intr_lock); 1045 1046 return KERNADDR(mem->dmamem); 1047 } 1048 1049 /* 1050 * emuxki_channel_* : Channel management functions 1051 * emuxki_chanparms_* : Channel parameters modification functions 1052 */ 1053 1054 /* 1055 * is splaudio necessary here, can the same voice be manipulated by two 1056 * different threads at a time ? 1057 */ 1058 static void 1059 emuxki_chanparms_set_defaults(struct emuxki_channel *chan) 1060 { 1061 1062 chan->fxsend.a.level = chan->fxsend.b.level = 1063 chan->fxsend.c.level = chan->fxsend.d.level = 1064 /* for audigy */ 1065 chan->fxsend.e.level = chan->fxsend.f.level = 1066 chan->fxsend.g.level = chan->fxsend.h.level = 1067 chan->voice->sc->sc_type & EMUXKI_AUDIGY ? 1068 0xc0 : 0xff; /* not max */ 1069 1070 chan->fxsend.a.dest = 0x0; 1071 chan->fxsend.b.dest = 0x1; 1072 chan->fxsend.c.dest = 0x2; 1073 chan->fxsend.d.dest = 0x3; 1074 /* for audigy */ 1075 chan->fxsend.e.dest = 0x4; 1076 chan->fxsend.f.dest = 0x5; 1077 chan->fxsend.g.dest = 0x6; 1078 chan->fxsend.h.dest = 0x7; 1079 1080 chan->pitch.initial = 0x0000; /* shouldn't it be 0xE000 ? */ 1081 chan->pitch.current = 0x0000; /* should it be 0x0400 */ 1082 chan->pitch.target = 0x0000; /* the unity pitch shift ? */ 1083 chan->pitch.envelope_amount = 0x00; /* none */ 1084 1085 chan->initial_attenuation = 0x00; /* no attenuation */ 1086 chan->volume.current = 0x0000; /* no volume */ 1087 chan->volume.target = 0xffff; 1088 chan->volume.envelope.current_state = 0x8000; /* 0 msec delay */ 1089 chan->volume.envelope.hold_time = 0x7f; /* 0 msec */ 1090 chan->volume.envelope.attack_time = 0x7F; /* 5.5msec */ 1091 chan->volume.envelope.sustain_level = 0x7F; /* full */ 1092 chan->volume.envelope.decay_time = 0x7F; /* 22msec */ 1093 1094 chan->filter.initial_cutoff_frequency = 0xff; /* no filter */ 1095 chan->filter.current_cutoff_frequency = 0xffff; /* no filtering */ 1096 chan->filter.target_cutoff_frequency = 0xffff; /* no filtering */ 1097 chan->filter.lowpass_resonance_height = 0x0; 1098 chan->filter.interpolation_ROM = 0x1; /* full band */ 1099 chan->filter.envelope_amount = 0x7f; /* none */ 1100 chan->filter.LFO_modulation_depth = 0x00; /* none */ 1101 1102 chan->loop.start = 0x000000; 1103 chan->loop.end = 0x000010; /* Why ? */ 1104 1105 chan->modulation.envelope.current_state = 0x8000; 1106 chan->modulation.envelope.hold_time = 0x00; /* 127 better ? */ 1107 chan->modulation.envelope.attack_time = 0x00; /* infinite */ 1108 chan->modulation.envelope.sustain_level = 0x00; /* off */ 1109 chan->modulation.envelope.decay_time = 0x7f; /* 22 msec */ 1110 chan->modulation.LFO_state = 0x8000; 1111 1112 chan->vibrato_LFO.state = 0x8000; 1113 chan->vibrato_LFO.modulation_depth = 0x00; /* none */ 1114 chan->vibrato_LFO.vibrato_depth = 0x00; 1115 chan->vibrato_LFO.frequency = 0x00; /* Why set to 24 when 1116 * initialized ? */ 1117 1118 chan->tremolo_depth = 0x00; 1119 } 1120 1121 /* only call it at splaudio */ 1122 static struct emuxki_channel * 1123 emuxki_channel_new(struct emuxki_voice *voice, u_int8_t num) 1124 { 1125 struct emuxki_channel *chan; 1126 1127 chan = malloc(sizeof(struct emuxki_channel), M_DEVBUF, M_WAITOK); 1128 if (chan == NULL) 1129 return NULL; 1130 1131 chan->voice = voice; 1132 chan->num = num; 1133 emuxki_chanparms_set_defaults(chan); 1134 chan->voice->sc->channel[num] = chan; 1135 return chan; 1136 } 1137 1138 /* only call it at splaudio */ 1139 static void 1140 emuxki_channel_delete(struct emuxki_channel *chan) 1141 { 1142 1143 chan->voice->sc->channel[chan->num] = NULL; 1144 free(chan, M_DEVBUF); 1145 } 1146 1147 static void 1148 emuxki_channel_set_fxsend(struct emuxki_channel *chan, 1149 struct emuxki_chanparms_fxsend *fxsend) 1150 { 1151 /* Could do a memcpy ...*/ 1152 chan->fxsend.a.level = fxsend->a.level; 1153 chan->fxsend.b.level = fxsend->b.level; 1154 chan->fxsend.c.level = fxsend->c.level; 1155 chan->fxsend.d.level = fxsend->d.level; 1156 chan->fxsend.a.dest = fxsend->a.dest; 1157 chan->fxsend.b.dest = fxsend->b.dest; 1158 chan->fxsend.c.dest = fxsend->c.dest; 1159 chan->fxsend.d.dest = fxsend->d.dest; 1160 1161 /* for audigy */ 1162 chan->fxsend.e.level = fxsend->e.level; 1163 chan->fxsend.f.level = fxsend->f.level; 1164 chan->fxsend.g.level = fxsend->g.level; 1165 chan->fxsend.h.level = fxsend->h.level; 1166 chan->fxsend.e.dest = fxsend->e.dest; 1167 chan->fxsend.f.dest = fxsend->f.dest; 1168 chan->fxsend.g.dest = fxsend->g.dest; 1169 chan->fxsend.h.dest = fxsend->h.dest; 1170 } 1171 1172 static void 1173 emuxki_channel_set_srate(struct emuxki_channel *chan, uint32_t srate) 1174 { 1175 1176 chan->pitch.target = (srate << 8) / 375; 1177 chan->pitch.target = (chan->pitch.target >> 1) + 1178 (chan->pitch.target & 1); 1179 chan->pitch.target &= 0xffff; 1180 chan->pitch.current = chan->pitch.target; 1181 chan->pitch.initial = 1182 (emuxki_rate_to_pitch(srate) >> 8) & EMU_CHAN_IP_MASK; 1183 } 1184 1185 /* voice params must be set before calling this */ 1186 static void 1187 emuxki_channel_set_bufparms(struct emuxki_channel *chan, 1188 uint32_t start, uint32_t end) 1189 { 1190 1191 chan->loop.start = start & EMU_CHAN_PSST_LOOPSTARTADDR_MASK; 1192 chan->loop.end = end & EMU_CHAN_DSL_LOOPENDADDR_MASK; 1193 } 1194 1195 static void 1196 emuxki_channel_commit_fx(struct emuxki_channel *chan) 1197 { 1198 struct emuxki_softc *sc; 1199 u_int8_t chano; 1200 1201 sc = chan->voice->sc; 1202 chano = chan->num; 1203 if(sc->sc_type & EMUXKI_AUDIGY) { 1204 emuxki_write(sc, chano, EMU_A_CHAN_FXRT1, 1205 (chan->fxsend.d.dest << 24) | 1206 (chan->fxsend.c.dest << 16) | 1207 (chan->fxsend.b.dest << 8) | 1208 (chan->fxsend.a.dest)); 1209 emuxki_write(sc, chano, EMU_A_CHAN_FXRT2, 1210 (chan->fxsend.h.dest << 24) | 1211 (chan->fxsend.g.dest << 16) | 1212 (chan->fxsend.f.dest << 8) | 1213 (chan->fxsend.e.dest)); 1214 emuxki_write(sc, chano, EMU_A_CHAN_SENDAMOUNTS, 1215 (chan->fxsend.e.level << 24) | 1216 (chan->fxsend.f.level << 16) | 1217 (chan->fxsend.g.level << 8) | 1218 (chan->fxsend.h.level)); 1219 } else { 1220 emuxki_write(sc, chano, EMU_CHAN_FXRT, 1221 (chan->fxsend.d.dest << 28) | 1222 (chan->fxsend.c.dest << 24) | 1223 (chan->fxsend.b.dest << 20) | 1224 (chan->fxsend.a.dest << 16)); 1225 } 1226 1227 emuxki_write(sc, chano, 0x10000000 | EMU_CHAN_PTRX, 1228 (chan->fxsend.a.level << 8) | chan->fxsend.b.level); 1229 emuxki_write(sc, chano, EMU_CHAN_DSL, 1230 (chan->fxsend.d.level << 24) | chan->loop.end); 1231 emuxki_write(sc, chano, EMU_CHAN_PSST, 1232 (chan->fxsend.c.level << 24) | chan->loop.start); 1233 } 1234 1235 static void 1236 emuxki_channel_commit_parms(struct emuxki_channel *chan) 1237 { 1238 struct emuxki_voice *voice; 1239 struct emuxki_softc *sc; 1240 uint32_t start, mapval; 1241 uint8_t chano; 1242 1243 voice = chan->voice; 1244 sc = voice->sc; 1245 chano = chan->num; 1246 start = chan->loop.start + 1247 (voice->stereo ? 28 : 30) * (voice->b16 + 1); 1248 mapval = DMAADDR(sc->silentpage) << 1 | EMU_CHAN_MAP_PTI_MASK; 1249 1250 KASSERT(mutex_owned(&sc->sc_intr_lock)); 1251 emuxki_write(sc, chano, EMU_CHAN_CPF_STEREO, voice->stereo); 1252 1253 emuxki_channel_commit_fx(chan); 1254 1255 emuxki_write(sc, chano, EMU_CHAN_CCCA, 1256 (chan->filter.lowpass_resonance_height << 28) | 1257 (chan->filter.interpolation_ROM << 25) | 1258 (voice->b16 ? 0 : EMU_CHAN_CCCA_8BITSELECT) | start); 1259 emuxki_write(sc, chano, EMU_CHAN_Z1, 0); 1260 emuxki_write(sc, chano, EMU_CHAN_Z2, 0); 1261 emuxki_write(sc, chano, EMU_CHAN_MAPA, mapval); 1262 emuxki_write(sc, chano, EMU_CHAN_MAPB, mapval); 1263 emuxki_write(sc, chano, EMU_CHAN_CVCF_CURRFILTER, 1264 chan->filter.current_cutoff_frequency); 1265 emuxki_write(sc, chano, EMU_CHAN_VTFT_FILTERTARGET, 1266 chan->filter.target_cutoff_frequency); 1267 emuxki_write(sc, chano, EMU_CHAN_ATKHLDM, 1268 (chan->modulation.envelope.hold_time << 8) | 1269 chan->modulation.envelope.attack_time); 1270 emuxki_write(sc, chano, EMU_CHAN_DCYSUSM, 1271 (chan->modulation.envelope.sustain_level << 8) | 1272 chan->modulation.envelope.decay_time); 1273 emuxki_write(sc, chano, EMU_CHAN_LFOVAL1, 1274 chan->modulation.LFO_state); 1275 emuxki_write(sc, chano, EMU_CHAN_LFOVAL2, 1276 chan->vibrato_LFO.state); 1277 emuxki_write(sc, chano, EMU_CHAN_FMMOD, 1278 (chan->vibrato_LFO.modulation_depth << 8) | 1279 chan->filter.LFO_modulation_depth); 1280 emuxki_write(sc, chano, EMU_CHAN_TREMFRQ, 1281 (chan->tremolo_depth << 8)); 1282 emuxki_write(sc, chano, EMU_CHAN_FM2FRQ2, 1283 (chan->vibrato_LFO.vibrato_depth << 8) | 1284 chan->vibrato_LFO.frequency); 1285 emuxki_write(sc, chano, EMU_CHAN_ENVVAL, 1286 chan->modulation.envelope.current_state); 1287 emuxki_write(sc, chano, EMU_CHAN_ATKHLDV, 1288 (chan->volume.envelope.hold_time << 8) | 1289 chan->volume.envelope.attack_time); 1290 emuxki_write(sc, chano, EMU_CHAN_ENVVOL, 1291 chan->volume.envelope.current_state); 1292 emuxki_write(sc, chano, EMU_CHAN_PEFE, 1293 (chan->pitch.envelope_amount << 8) | 1294 chan->filter.envelope_amount); 1295 } 1296 1297 static void 1298 emuxki_channel_start(struct emuxki_channel *chan) 1299 { 1300 struct emuxki_voice *voice; 1301 struct emuxki_softc *sc; 1302 u_int8_t cache_sample, cache_invalid_size, chano; 1303 u_int32_t sample; 1304 1305 voice = chan->voice; 1306 sc = voice->sc; 1307 chano = chan->num; 1308 cache_sample = voice->stereo ? 4 : 2; 1309 sample = voice->b16 ? 0x00000000 : 0x80808080; 1310 cache_invalid_size = (voice->stereo ? 28 : 30) * (voice->b16 + 1); 1311 1312 KASSERT(mutex_owned(&sc->sc_intr_lock)); 1313 while (cache_sample--) { 1314 emuxki_write(sc, chano, EMU_CHAN_CD0 + cache_sample, 1315 sample); 1316 } 1317 emuxki_write(sc, chano, EMU_CHAN_CCR_CACHEINVALIDSIZE, 0); 1318 emuxki_write(sc, chano, EMU_CHAN_CCR_READADDRESS, 64); 1319 emuxki_write(sc, chano, EMU_CHAN_CCR_CACHEINVALIDSIZE, 1320 cache_invalid_size); 1321 emuxki_write(sc, chano, EMU_CHAN_IFATN, 1322 (chan->filter.target_cutoff_frequency << 8) | 1323 chan->initial_attenuation); 1324 emuxki_write(sc, chano, EMU_CHAN_VTFT_VOLUMETARGET, 1325 chan->volume.target); 1326 emuxki_write(sc, chano, EMU_CHAN_CVCF_CURRVOL, 1327 chan->volume.current); 1328 emuxki_write(sc, 0, 1329 EMU_MKSUBREG(1, chano, EMU_SOLEL + (chano >> 5)), 1330 0); /* Clear stop on loop */ 1331 emuxki_write(sc, 0, 1332 EMU_MKSUBREG(1, chano, EMU_CLIEL + (chano >> 5)), 1333 0); /* Clear loop interrupt */ 1334 emuxki_write(sc, chano, EMU_CHAN_DCYSUSV, 1335 (chan->volume.envelope.sustain_level << 8) | 1336 chan->volume.envelope.decay_time); 1337 emuxki_write(sc, chano, EMU_CHAN_PTRX_PITCHTARGET, 1338 chan->pitch.target); 1339 emuxki_write(sc, chano, EMU_CHAN_CPF_PITCH, 1340 chan->pitch.current); 1341 emuxki_write(sc, chano, EMU_CHAN_IP, chan->pitch.initial); 1342 } 1343 1344 static void 1345 emuxki_channel_stop(struct emuxki_channel *chan) 1346 { 1347 struct emuxki_softc *sc; 1348 u_int8_t chano; 1349 1350 sc = chan->voice->sc; 1351 chano = chan->num; 1352 KASSERT(mutex_owned(&sc->sc_intr_lock)); 1353 emuxki_write(sc, chano, EMU_CHAN_PTRX_PITCHTARGET, 0); 1354 emuxki_write(sc, chano, EMU_CHAN_CPF_PITCH, 0); 1355 emuxki_write(sc, chano, EMU_CHAN_IFATN_ATTENUATION, 0xff); 1356 emuxki_write(sc, chano, EMU_CHAN_VTFT_VOLUMETARGET, 0); 1357 emuxki_write(sc, chano, EMU_CHAN_CVCF_CURRVOL, 0); 1358 emuxki_write(sc, chano, EMU_CHAN_IP, 0); 1359 } 1360 1361 /* 1362 * Voices management 1363 * emuxki_voice_dataloc : use(play or rec) independent dataloc union helpers 1364 * emuxki_voice_channel_* : play part of dataloc union helpers 1365 * emuxki_voice_recsrc_* : rec part of dataloc union helpers 1366 */ 1367 1368 /* Allocate channels for voice in case of play voice */ 1369 static int 1370 emuxki_voice_channel_create(struct emuxki_voice *voice) 1371 { 1372 struct emuxki_channel **channel; 1373 uint8_t i, stereo; 1374 1375 channel = voice->sc->channel; 1376 stereo = voice->stereo; 1377 for (i = 0; i < EMU_NUMCHAN - stereo; i += stereo + 1) { 1378 if ((stereo && (channel[i + 1] != NULL)) || 1379 (channel[i] != NULL)) /* Looking for free channels */ 1380 continue; 1381 1382 if (stereo) { 1383 voice->dataloc.chan[1] = 1384 emuxki_channel_new(voice, i + 1); 1385 if (voice->dataloc.chan[1] == NULL) 1386 return ENOMEM; 1387 } 1388 voice->dataloc.chan[0] = emuxki_channel_new(voice, i); 1389 if (voice->dataloc.chan[0] == NULL) { 1390 if (stereo) { 1391 emuxki_channel_delete(voice->dataloc.chan[1]); 1392 voice->dataloc.chan[1] = NULL; 1393 } 1394 return ENOMEM; 1395 } 1396 return 0; 1397 } 1398 return EAGAIN; 1399 } 1400 1401 /* When calling this function we assume no one can access the voice */ 1402 static void 1403 emuxki_voice_channel_destroy(struct emuxki_voice *voice) 1404 { 1405 1406 emuxki_channel_delete(voice->dataloc.chan[0]); 1407 voice->dataloc.chan[0] = NULL; 1408 if (voice->stereo) 1409 emuxki_channel_delete(voice->dataloc.chan[1]); 1410 voice->dataloc.chan[1] = NULL; 1411 } 1412 1413 /* 1414 * Will come back when used in voice_dataloc_create 1415 */ 1416 static int 1417 emuxki_recsrc_reserve(struct emuxki_voice *voice, emuxki_recsrc_t source) 1418 { 1419 1420 if (source >= EMU_NUMRECSRCS) { 1421 #ifdef EMUXKI_DEBUG 1422 printf("Tried to reserve invalid source: %d\n", source); 1423 #endif 1424 return EINVAL; 1425 } 1426 if (voice->sc->recsrc[source] == voice) 1427 return 0; /* XXX */ 1428 if (voice->sc->recsrc[source] != NULL) 1429 return EBUSY; 1430 voice->sc->recsrc[source] = voice; 1431 return 0; 1432 } 1433 1434 /* When calling this function we assume the voice is stopped */ 1435 static void 1436 emuxki_voice_recsrc_release(struct emuxki_softc *sc, emuxki_recsrc_t source) 1437 { 1438 1439 sc->recsrc[source] = NULL; 1440 } 1441 1442 static int 1443 emuxki_voice_dataloc_create(struct emuxki_voice *voice) 1444 { 1445 int error; 1446 1447 if (voice->use & EMU_VOICE_USE_PLAY) { 1448 if ((error = emuxki_voice_channel_create(voice))) 1449 return error; 1450 } else { 1451 if ((error = 1452 emuxki_recsrc_reserve(voice, voice->dataloc.source))) 1453 return error; 1454 } 1455 return 0; 1456 } 1457 1458 static void 1459 emuxki_voice_dataloc_destroy(struct emuxki_voice *voice) 1460 { 1461 1462 if (voice->use & EMU_VOICE_USE_PLAY) { 1463 if (voice->dataloc.chan[0] != NULL) 1464 emuxki_voice_channel_destroy(voice); 1465 } else { 1466 if (voice->dataloc.source != EMU_RECSRC_NOTSET) { 1467 emuxki_voice_recsrc_release(voice->sc, 1468 voice->dataloc.source); 1469 voice->dataloc.source = EMU_RECSRC_NOTSET; 1470 } 1471 } 1472 } 1473 1474 static struct emuxki_voice * 1475 emuxki_voice_new(struct emuxki_softc *sc, uint8_t use) 1476 { 1477 struct emuxki_voice *voice; 1478 1479 KASSERT(mutex_owned(&sc->sc_intr_lock)); 1480 1481 voice = sc->lvoice; 1482 sc->lvoice = NULL; 1483 1484 if (!voice) { 1485 mutex_exit(&sc->sc_intr_lock); 1486 voice = kmem_alloc(sizeof(*voice), KM_SLEEP); 1487 mutex_enter(&sc->sc_intr_lock); 1488 if (!voice) 1489 return NULL; 1490 } else if (voice->use != use) { 1491 mutex_exit(&sc->sc_intr_lock); 1492 emuxki_voice_dataloc_destroy(voice); 1493 mutex_enter(&sc->sc_intr_lock); 1494 } else 1495 goto skip_initialize; 1496 1497 voice->sc = sc; 1498 voice->state = !EMU_VOICE_STATE_STARTED; 1499 voice->stereo = EMU_VOICE_STEREO_NOTSET; 1500 voice->b16 = 0; 1501 voice->sample_rate = 0; 1502 if (use & EMU_VOICE_USE_PLAY) 1503 voice->dataloc.chan[0] = voice->dataloc.chan[1] = NULL; 1504 else 1505 voice->dataloc.source = EMU_RECSRC_NOTSET; 1506 voice->buffer = NULL; 1507 voice->blksize = 0; 1508 voice->trigblk = 0; 1509 voice->blkmod = 0; 1510 voice->inth = NULL; 1511 voice->inthparam = NULL; 1512 voice->use = use; 1513 1514 skip_initialize: 1515 LIST_INSERT_HEAD((&sc->voices), voice, next); 1516 1517 return voice; 1518 } 1519 1520 static void 1521 emuxki_voice_delete(struct emuxki_voice *voice) 1522 { 1523 struct emuxki_softc *sc; 1524 struct emuxki_voice *lvoice; 1525 1526 sc = voice->sc; 1527 if (voice->state & EMU_VOICE_STATE_STARTED) 1528 emuxki_voice_halt(voice); 1529 1530 LIST_REMOVE(voice, next); 1531 lvoice = sc->lvoice; 1532 sc->lvoice = voice; 1533 1534 if (lvoice) { 1535 mutex_exit(&sc->sc_lock); 1536 emuxki_voice_dataloc_destroy(lvoice); 1537 kmem_free(lvoice, sizeof(*lvoice)); 1538 mutex_enter(&sc->sc_lock); 1539 } 1540 } 1541 1542 static int 1543 emuxki_voice_set_stereo(struct emuxki_softc *sc, 1544 struct emuxki_voice *voice, uint8_t stereo) 1545 { 1546 int error; 1547 emuxki_recsrc_t source; 1548 struct emuxki_chanparms_fxsend fxsend; 1549 1550 source = 0; /* XXX: gcc */ 1551 if (! (voice->use & EMU_VOICE_USE_PLAY)) 1552 source = voice->dataloc.source; 1553 mutex_exit(&sc->sc_lock); 1554 emuxki_voice_dataloc_destroy(voice); 1555 if (! (voice->use & EMU_VOICE_USE_PLAY)) 1556 voice->dataloc.source = source; 1557 voice->stereo = stereo; 1558 error = emuxki_voice_dataloc_create(voice); 1559 mutex_enter(&sc->sc_lock); 1560 if (error) 1561 return error; 1562 if (voice->use & EMU_VOICE_USE_PLAY) { 1563 fxsend.a.dest = 0x0; 1564 fxsend.b.dest = 0x1; 1565 fxsend.c.dest = 0x2; 1566 fxsend.d.dest = 0x3; 1567 /* for audigy */ 1568 fxsend.e.dest = 0x4; 1569 fxsend.f.dest = 0x5; 1570 fxsend.g.dest = 0x6; 1571 fxsend.h.dest = 0x7; 1572 if (voice->stereo) { 1573 fxsend.a.level = fxsend.c.level = 0xc0; 1574 fxsend.b.level = fxsend.d.level = 0x00; 1575 fxsend.e.level = fxsend.g.level = 0xc0; 1576 fxsend.f.level = fxsend.h.level = 0x00; 1577 emuxki_channel_set_fxsend(voice->dataloc.chan[0], 1578 &fxsend); 1579 fxsend.a.level = fxsend.c.level = 0x00; 1580 fxsend.b.level = fxsend.d.level = 0xc0; 1581 fxsend.e.level = fxsend.g.level = 0x00; 1582 fxsend.f.level = fxsend.h.level = 0xc0; 1583 emuxki_channel_set_fxsend(voice->dataloc.chan[1], 1584 &fxsend); 1585 } /* No else : default is good for mono */ 1586 } 1587 return 0; 1588 } 1589 1590 static int 1591 emuxki_voice_set_srate(struct emuxki_voice *voice, uint32_t srate) 1592 { 1593 1594 if (voice->use & EMU_VOICE_USE_PLAY) { 1595 if ((srate < 4000) || (srate > 48000)) 1596 return EINVAL; 1597 voice->sample_rate = srate; 1598 emuxki_channel_set_srate(voice->dataloc.chan[0], srate); 1599 if (voice->stereo) 1600 emuxki_channel_set_srate(voice->dataloc.chan[1], 1601 srate); 1602 } else { 1603 if ((srate < 8000) || (srate > 48000)) 1604 return EINVAL; 1605 voice->sample_rate = srate; 1606 if (emuxki_voice_adc_rate(voice) < 0) { 1607 voice->sample_rate = 0; 1608 return EINVAL; 1609 } 1610 } 1611 return 0; 1612 } 1613 1614 static int 1615 emuxki_voice_set_audioparms(struct emuxki_softc *sc, 1616 struct emuxki_voice *voice, uint8_t stereo, uint8_t b16, uint32_t srate) 1617 { 1618 int error; 1619 1620 if (voice->stereo == stereo && voice->b16 == b16 && 1621 voice->sample_rate == srate) 1622 return 0; 1623 1624 #ifdef EMUXKI_DEBUG 1625 printf("Setting %s voice params : %s, %u bits, %u Hz\n", 1626 (voice->use & EMU_VOICE_USE_PLAY) ? "play" : "record", 1627 stereo ? "stereo" : "mono", (b16 + 1) * 8, srate); 1628 #endif 1629 error = 0; 1630 if (voice->stereo != stereo) { 1631 if ((error = emuxki_voice_set_stereo(sc, voice, stereo))) 1632 return error; 1633 } 1634 voice->b16 = b16; 1635 if (voice->sample_rate != srate) 1636 error = emuxki_voice_set_srate(voice, srate); 1637 return error; 1638 } 1639 1640 /* voice audio parms (see just before) must be set prior to this */ 1641 static int 1642 emuxki_voice_set_bufparms(struct emuxki_voice *voice, void *ptr, 1643 uint32_t bufsize, uint16_t blksize) 1644 { 1645 struct emuxki_mem *mem; 1646 struct emuxki_channel **chan; 1647 uint32_t start, end; 1648 uint8_t sample_size; 1649 int idx; 1650 int error; 1651 1652 error = EFAULT; 1653 LIST_FOREACH(mem, &voice->sc->mem, next) { 1654 if (KERNADDR(mem->dmamem) != ptr) 1655 continue; 1656 1657 voice->buffer = mem; 1658 sample_size = (voice->b16 + 1) * (voice->stereo + 1); 1659 voice->trigblk = 0; /* This shouldn't be needed */ 1660 voice->blkmod = bufsize / blksize; 1661 if (bufsize % blksize) /* This should not happen */ 1662 voice->blkmod++; 1663 error = 0; 1664 1665 if (voice->use & EMU_VOICE_USE_PLAY) { 1666 voice->blksize = blksize / sample_size; 1667 chan = voice->dataloc.chan; 1668 start = mem->ptbidx << 12; 1669 end = start + bufsize / sample_size; 1670 emuxki_channel_set_bufparms(chan[0], 1671 start, end); 1672 if (voice->stereo) 1673 emuxki_channel_set_bufparms(chan[1], 1674 start, end); 1675 voice->timerate = (uint32_t) 48000 * 1676 voice->blksize / voice->sample_rate; 1677 if (voice->timerate < 5) 1678 error = EINVAL; 1679 } else { 1680 voice->blksize = blksize; 1681 for(idx = sizeof(emuxki_recbuf_sz) / 1682 sizeof(emuxki_recbuf_sz[0]); --idx >= 0;) 1683 if (emuxki_recbuf_sz[idx] == bufsize) 1684 break; 1685 if (idx < 0) { 1686 #ifdef EMUXKI_DEBUG 1687 printf("Invalid bufsize: %d\n", bufsize); 1688 #endif 1689 return EINVAL; 1690 } 1691 emuxki_write(voice->sc, 0, 1692 emuxki_recsrc_szreg[voice->dataloc.source], idx); 1693 emuxki_write(voice->sc, 0, 1694 emuxki_recsrc_bufaddrreg[voice->dataloc.source], 1695 DMAADDR(mem->dmamem)); 1696 1697 /* Use timer to emulate DMA completion interrupt */ 1698 voice->timerate = (u_int32_t) 48000 * blksize / 1699 (voice->sample_rate * sample_size); 1700 if (voice->timerate < 5) { 1701 #ifdef EMUXKI_DEBUG 1702 printf("Invalid timerate: %d, blksize %d\n", 1703 voice->timerate, blksize); 1704 #endif 1705 error = EINVAL; 1706 } 1707 } 1708 1709 break; 1710 } 1711 1712 return error; 1713 } 1714 1715 static void 1716 emuxki_voice_commit_parms(struct emuxki_voice *voice) 1717 { 1718 if (voice->use & EMU_VOICE_USE_PLAY) { 1719 emuxki_channel_commit_parms(voice->dataloc.chan[0]); 1720 if (voice->stereo) 1721 emuxki_channel_commit_parms(voice->dataloc.chan[1]); 1722 } 1723 } 1724 1725 static uint32_t 1726 emuxki_voice_curaddr(struct emuxki_voice *voice) 1727 { 1728 int idxreg; 1729 int rv; 1730 1731 /* XXX different semantics in these cases */ 1732 if (voice->use & EMU_VOICE_USE_PLAY) { 1733 /* returns number of samples (an l/r pair counts 1) */ 1734 rv = emuxki_read(voice->sc, 1735 voice->dataloc.chan[0]->num, EMU_CHAN_CCCA_CURRADDR) - 1736 voice->dataloc.chan[0]->loop.start; 1737 } else { 1738 idxreg = 0; 1739 /* returns number of bytes */ 1740 switch (voice->dataloc.source) { 1741 case EMU_RECSRC_MIC: 1742 idxreg = (voice->sc->sc_type & EMUXKI_AUDIGY) ? 1743 EMU_A_MICIDX : EMU_MICIDX; 1744 break; 1745 case EMU_RECSRC_ADC: 1746 idxreg = (voice->sc->sc_type & EMUXKI_AUDIGY) ? 1747 EMU_A_ADCIDX : EMU_ADCIDX; 1748 break; 1749 case EMU_RECSRC_FX: 1750 idxreg = EMU_FXIDX; 1751 break; 1752 default: 1753 #ifdef EMUXKI_DEBUG 1754 printf("emu: bad recording source!\n"); 1755 #endif 1756 break; 1757 } 1758 rv = emuxki_read(voice->sc, 0, EMU_RECIDX(idxreg) 1759 & EMU_RECIDX_MASK); 1760 } 1761 return rv; 1762 } 1763 1764 static void 1765 emuxki_resched_timer(struct emuxki_softc *sc) 1766 { 1767 struct emuxki_voice *voice; 1768 uint16_t timerate; 1769 uint8_t active; 1770 1771 timerate = 1024; 1772 active = 0; 1773 KASSERT(mutex_owned(&sc->sc_intr_lock)); 1774 LIST_FOREACH(voice, &sc->voices, next) { 1775 if ((voice->state & EMU_VOICE_STATE_STARTED) == 0) 1776 continue; 1777 active = 1; 1778 if (voice->timerate < timerate) 1779 timerate = voice->timerate; 1780 } 1781 1782 if (timerate & ~EMU_TIMER_RATE_MASK) 1783 timerate = 0; 1784 bus_space_write_2(sc->sc_iot, sc->sc_ioh, EMU_TIMER, timerate); 1785 if (!active && (sc->timerstate & EMU_TIMER_STATE_ENABLED)) { 1786 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE, 1787 bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_INTE) & 1788 ~EMU_INTE_INTERTIMERENB); 1789 sc->timerstate &= ~EMU_TIMER_STATE_ENABLED; 1790 } else if (active && !(sc->timerstate & EMU_TIMER_STATE_ENABLED)) { 1791 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE, 1792 bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_INTE) | 1793 EMU_INTE_INTERTIMERENB); 1794 sc->timerstate |= EMU_TIMER_STATE_ENABLED; 1795 } 1796 } 1797 1798 static int 1799 emuxki_voice_adc_rate(struct emuxki_voice *voice) 1800 { 1801 1802 switch(voice->sample_rate) { 1803 case 48000: 1804 return EMU_ADCCR_SAMPLERATE_48; 1805 break; 1806 case 44100: 1807 return EMU_ADCCR_SAMPLERATE_44; 1808 break; 1809 case 32000: 1810 return EMU_ADCCR_SAMPLERATE_32; 1811 break; 1812 case 24000: 1813 return EMU_ADCCR_SAMPLERATE_24; 1814 break; 1815 case 22050: 1816 return EMU_ADCCR_SAMPLERATE_22; 1817 break; 1818 case 16000: 1819 return EMU_ADCCR_SAMPLERATE_16; 1820 break; 1821 case 12000: 1822 if(voice->sc->sc_type & EMUXKI_AUDIGY) 1823 return EMU_A_ADCCR_SAMPLERATE_12; 1824 else { 1825 #ifdef EMUXKI_DEBUG 1826 printf("recording sample_rate not supported : %u\n", voice->sample_rate); 1827 #endif 1828 return -1; 1829 } 1830 break; 1831 case 11000: 1832 if(voice->sc->sc_type & EMUXKI_AUDIGY) 1833 return EMU_A_ADCCR_SAMPLERATE_11; 1834 else 1835 return EMU_ADCCR_SAMPLERATE_11; 1836 break; 1837 case 8000: 1838 if(voice->sc->sc_type & EMUXKI_AUDIGY) 1839 return EMU_A_ADCCR_SAMPLERATE_8; 1840 else 1841 return EMU_ADCCR_SAMPLERATE_8; 1842 break; 1843 default: 1844 #ifdef EMUXKI_DEBUG 1845 printf("recording sample_rate not supported : %u\n", voice->sample_rate); 1846 #endif 1847 return -1; 1848 } 1849 return -1; /* shouldn't get here */ 1850 } 1851 1852 1853 static void 1854 emuxki_voice_start(struct emuxki_voice *voice, 1855 void (*inth) (void *), void *inthparam) 1856 { 1857 uint32_t val; 1858 1859 voice->inth = inth; 1860 voice->inthparam = inthparam; 1861 if (voice->use & EMU_VOICE_USE_PLAY) { 1862 voice->trigblk = 1; 1863 emuxki_channel_start(voice->dataloc.chan[0]); 1864 if (voice->stereo) 1865 emuxki_channel_start(voice->dataloc.chan[1]); 1866 } else { 1867 voice->trigblk = 1; 1868 switch (voice->dataloc.source) { 1869 case EMU_RECSRC_ADC: 1870 /* XXX need to program DSP to output L+R 1871 * XXX in monaural case? */ 1872 if (voice->sc->sc_type & EMUXKI_AUDIGY) { 1873 val = EMU_A_ADCCR_LCHANENABLE; 1874 if (voice->stereo) 1875 val |= EMU_A_ADCCR_RCHANENABLE; 1876 } else { 1877 val = EMU_ADCCR_LCHANENABLE; 1878 if (voice->stereo) 1879 val |= EMU_ADCCR_RCHANENABLE; 1880 } 1881 val |= emuxki_voice_adc_rate(voice); 1882 emuxki_write(voice->sc, 0, EMU_ADCCR, 0); 1883 emuxki_write(voice->sc, 0, EMU_ADCCR, val); 1884 break; 1885 case EMU_RECSRC_MIC: 1886 case EMU_RECSRC_FX: 1887 printf("unimplemented\n"); 1888 break; 1889 case EMU_RECSRC_NOTSET: 1890 default: 1891 printf("Bad dataloc.source %d\n", 1892 voice->dataloc.source); 1893 break; 1894 } 1895 #if 0 1896 switch (voice->dataloc.source) { 1897 case EMU_RECSRC_ADC: 1898 case EMU_RECSRC_FX: 1899 case EMU_RECSRC_MIC: 1900 /* DMA completion interrupt is useless; use timer */ 1901 KASSERT(mutex_owned(&sc->sc_intr_lock)); 1902 val = emu_rd(sc, INTE, 4); 1903 val |= emuxki_recsrc_intrmasks[voice->dataloc.source]; 1904 emu_wr(sc, INTE, val, 4); 1905 break; 1906 default: 1907 break; 1908 } 1909 #endif 1910 } 1911 voice->state |= EMU_VOICE_STATE_STARTED; 1912 emuxki_resched_timer(voice->sc); 1913 } 1914 1915 static void 1916 emuxki_voice_halt(struct emuxki_voice *voice) 1917 { 1918 1919 if (voice->use & EMU_VOICE_USE_PLAY) { 1920 emuxki_channel_stop(voice->dataloc.chan[0]); 1921 if (voice->stereo) 1922 emuxki_channel_stop(voice->dataloc.chan[1]); 1923 } else { 1924 switch (voice->dataloc.source) { 1925 case EMU_RECSRC_ADC: 1926 emuxki_write(voice->sc, 0, EMU_ADCCR, 0); 1927 break; 1928 case EMU_RECSRC_FX: 1929 case EMU_RECSRC_MIC: 1930 printf("unimplemented\n"); 1931 break; 1932 default: 1933 case EMU_RECSRC_NOTSET: 1934 printf("Bad dataloc.source %d\n", 1935 voice->dataloc.source); 1936 break; 1937 } 1938 1939 switch (voice->dataloc.source) { 1940 case EMU_RECSRC_ADC: 1941 case EMU_RECSRC_FX: 1942 case EMU_RECSRC_MIC: 1943 /* This should reset buffer pointer */ 1944 emuxki_write(voice->sc, 0, 1945 emuxki_recsrc_szreg[voice->dataloc.source], 1946 EMU_RECBS_BUFSIZE_NONE); 1947 #if 0 1948 KASSERT(mutex_owned(&sc->sc_intr_lock)); 1949 val = emu_rd(sc, INTE, 4); 1950 val &= ~emuxki_recsrc_intrmasks[voice->dataloc.source]; 1951 emu_wr(sc, INTE, val, 4); 1952 #endif 1953 break; 1954 default: 1955 break; 1956 } 1957 } 1958 voice->state &= ~EMU_VOICE_STATE_STARTED; 1959 emuxki_resched_timer(voice->sc); 1960 } 1961 1962 /* 1963 * The interrupt handler 1964 */ 1965 static int 1966 emuxki_intr(void *arg) 1967 { 1968 struct emuxki_softc *sc; 1969 struct emuxki_voice *voice; 1970 uint32_t ipr, curblk; 1971 int claim; 1972 1973 sc = arg; 1974 claim = 0; 1975 1976 mutex_spin_enter(&sc->sc_intr_lock); 1977 1978 while ((ipr = bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_IPR))) { 1979 if (ipr & EMU_IPR_INTERVALTIMER) { 1980 LIST_FOREACH(voice, &sc->voices, next) { 1981 if ((voice->state & 1982 EMU_VOICE_STATE_STARTED) == 0) 1983 continue; 1984 1985 curblk = emuxki_voice_curaddr(voice) / 1986 voice->blksize; 1987 #if 0 1988 if (curblk == voice->trigblk) { 1989 voice->inth(voice->inthparam); 1990 voice->trigblk++; 1991 voice->trigblk %= voice->blkmod; 1992 } 1993 #else 1994 while ((curblk >= voice->trigblk && 1995 curblk < (voice->trigblk + voice->blkmod / 2)) || 1996 ((int)voice->trigblk - (int)curblk) > 1997 (voice->blkmod / 2 + 1)) { 1998 voice->inth(voice->inthparam); 1999 voice->trigblk++; 2000 voice->trigblk %= voice->blkmod; 2001 } 2002 #endif 2003 } 2004 } 2005 2006 /* Got interrupt */ 2007 bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_IPR, ipr); 2008 2009 claim = 1; 2010 } 2011 2012 mutex_spin_exit(&sc->sc_intr_lock); 2013 2014 return claim; 2015 } 2016 2017 2018 /* 2019 * Audio Architecture callbacks 2020 */ 2021 2022 static int 2023 emuxki_open(void *addr, int flags) 2024 { 2025 struct emuxki_softc *sc; 2026 2027 sc = addr; 2028 #ifdef EMUXKI_DEBUG 2029 printf("%s: emuxki_open called\n", device_xname(sc->sc_dev)); 2030 #endif 2031 2032 /* 2033 * Multiple voice support would be added as soon as I find a way to 2034 * trick the audio arch into supporting multiple voices. 2035 * Or I might integrate a modified audio arch supporting 2036 * multiple voices. 2037 */ 2038 2039 /* 2040 * I did this because i have problems identifying the selected 2041 * recording source(s) which is necessary when setting recording 2042 * params This will be addressed very soon 2043 */ 2044 if (flags & AUOPEN_READ) { 2045 sc->rvoice = emuxki_voice_new(sc, 0 /* EMU_VOICE_USE_RECORD */); 2046 if (sc->rvoice == NULL) 2047 return EBUSY; 2048 2049 /* XXX Hardcode RECSRC_ADC for now */ 2050 sc->rvoice->dataloc.source = EMU_RECSRC_ADC; 2051 } 2052 2053 if (flags & AUOPEN_WRITE) { 2054 sc->pvoice = emuxki_voice_new(sc, EMU_VOICE_USE_PLAY); 2055 if (sc->pvoice == NULL) { 2056 if (sc->rvoice) { 2057 emuxki_voice_delete(sc->rvoice); 2058 sc->rvoice = NULL; 2059 } 2060 return EBUSY; 2061 } 2062 } 2063 2064 return 0; 2065 } 2066 2067 static void 2068 emuxki_close(void *addr) 2069 { 2070 struct emuxki_softc *sc; 2071 2072 sc = addr; 2073 #ifdef EMUXKI_DEBUG 2074 printf("%s: emu10K1_close called\n", device_xname(sc->sc_dev)); 2075 #endif 2076 2077 /* No multiple voice support for now */ 2078 if (sc->rvoice != NULL) { 2079 emuxki_voice_delete(sc->rvoice); 2080 sc->rvoice = NULL; 2081 } 2082 if (sc->pvoice != NULL) { 2083 emuxki_voice_delete(sc->pvoice); 2084 sc->pvoice = NULL; 2085 } 2086 } 2087 2088 static int 2089 emuxki_query_encoding(void *addr, struct audio_encoding *fp) 2090 { 2091 #ifdef EMUXKI_DEBUG 2092 struct emuxki_softc *sc; 2093 2094 sc = addr; 2095 printf("%s: emuxki_query_encoding called\n", device_xname(sc->sc_dev)); 2096 #endif 2097 2098 switch (fp->index) { 2099 case 0: 2100 strcpy(fp->name, AudioEulinear); 2101 fp->encoding = AUDIO_ENCODING_ULINEAR; 2102 fp->precision = 8; 2103 fp->flags = 0; 2104 break; 2105 case 1: 2106 strcpy(fp->name, AudioEmulaw); 2107 fp->encoding = AUDIO_ENCODING_ULAW; 2108 fp->precision = 8; 2109 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 2110 break; 2111 case 2: 2112 strcpy(fp->name, AudioEalaw); 2113 fp->encoding = AUDIO_ENCODING_ALAW; 2114 fp->precision = 8; 2115 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 2116 break; 2117 case 3: 2118 strcpy(fp->name, AudioEslinear); 2119 fp->encoding = AUDIO_ENCODING_SLINEAR; 2120 fp->precision = 8; 2121 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 2122 break; 2123 case 4: 2124 strcpy(fp->name, AudioEslinear_le); 2125 fp->encoding = AUDIO_ENCODING_SLINEAR_LE; 2126 fp->precision = 16; 2127 fp->flags = 0; 2128 break; 2129 case 5: 2130 strcpy(fp->name, AudioEulinear_le); 2131 fp->encoding = AUDIO_ENCODING_ULINEAR_LE; 2132 fp->precision = 16; 2133 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 2134 break; 2135 case 6: 2136 strcpy(fp->name, AudioEslinear_be); 2137 fp->encoding = AUDIO_ENCODING_SLINEAR_BE; 2138 fp->precision = 16; 2139 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 2140 break; 2141 case 7: 2142 strcpy(fp->name, AudioEulinear_be); 2143 fp->encoding = AUDIO_ENCODING_ULINEAR_BE; 2144 fp->precision = 16; 2145 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 2146 break; 2147 default: 2148 return EINVAL; 2149 } 2150 return 0; 2151 } 2152 2153 static int 2154 emuxki_set_vparms(struct emuxki_softc *sc, struct emuxki_voice *voice, 2155 const audio_params_t *p, stream_filter_list_t *fil) 2156 { 2157 int mode, i; 2158 2159 mode = (voice->use & EMU_VOICE_USE_PLAY) ? 2160 AUMODE_PLAY : AUMODE_RECORD; 2161 i = auconv_set_converter(emuxki_formats, EMUXKI_NFORMATS, 2162 mode, p, FALSE, fil); 2163 if (i < 0) 2164 return EINVAL; 2165 if (fil->req_size > 0) 2166 p = &fil->filters[0].param; 2167 return emuxki_voice_set_audioparms(sc, voice, p->channels == 2, 2168 p->precision == 16, p->sample_rate); 2169 } 2170 2171 static int 2172 emuxki_set_params(void *addr, int setmode, int usemode, audio_params_t *play, 2173 audio_params_t *rec, stream_filter_list_t *pfil, stream_filter_list_t *rfil) 2174 { 2175 struct emuxki_softc *sc; 2176 struct audio_params *p; 2177 struct emuxki_voice *v; 2178 stream_filter_list_t *fil; 2179 int mode, error; 2180 2181 sc = addr; 2182 for (mode = AUMODE_RECORD; mode != -1; 2183 mode = mode == AUMODE_RECORD ? AUMODE_PLAY : -1) { 2184 if ((usemode & setmode & mode) == 0) 2185 continue; 2186 2187 if (mode == AUMODE_PLAY) { 2188 p = play; 2189 fil = pfil; 2190 v = sc->pvoice; 2191 } else { 2192 p = rec; 2193 fil = rfil; 2194 v = sc->rvoice; 2195 } 2196 2197 if (v == NULL) { 2198 continue; 2199 } 2200 2201 /* No multiple voice support for now */ 2202 if ((error = emuxki_set_vparms(sc, v, p, fil))) 2203 return error; 2204 } 2205 2206 return 0; 2207 } 2208 2209 static int 2210 emuxki_halt_output(void *addr) 2211 { 2212 struct emuxki_softc *sc; 2213 2214 sc = addr; 2215 /* No multiple voice support for now */ 2216 if (sc->pvoice == NULL) 2217 return ENXIO; 2218 2219 emuxki_voice_halt(sc->pvoice); 2220 return 0; 2221 } 2222 2223 static int 2224 emuxki_halt_input(void *addr) 2225 { 2226 struct emuxki_softc *sc; 2227 2228 sc = addr; 2229 #ifdef EMUXKI_DEBUG 2230 printf("%s: emuxki_halt_input called\n", device_xname(sc->sc_dev)); 2231 #endif 2232 2233 /* No multiple voice support for now */ 2234 if (sc->rvoice == NULL) 2235 return ENXIO; 2236 emuxki_voice_halt(sc->rvoice); 2237 return 0; 2238 } 2239 2240 static int 2241 emuxki_getdev(void *addr, struct audio_device *dev) 2242 { 2243 struct emuxki_softc *sc; 2244 2245 sc = addr; 2246 *dev = sc->sc_audv; 2247 return 0; 2248 } 2249 2250 static int 2251 emuxki_set_port(void *addr, mixer_ctrl_t *mctl) 2252 { 2253 struct emuxki_softc *sc; 2254 2255 sc = addr; 2256 return sc->codecif->vtbl->mixer_set_port(sc->codecif, mctl); 2257 } 2258 2259 static int 2260 emuxki_get_port(void *addr, mixer_ctrl_t *mctl) 2261 { 2262 struct emuxki_softc *sc; 2263 2264 sc = addr; 2265 return sc->codecif->vtbl->mixer_get_port(sc->codecif, mctl); 2266 } 2267 2268 static int 2269 emuxki_query_devinfo(void *addr, mixer_devinfo_t *minfo) 2270 { 2271 struct emuxki_softc *sc; 2272 2273 sc = addr; 2274 return sc->codecif->vtbl->query_devinfo(sc->codecif, minfo); 2275 } 2276 2277 static void * 2278 emuxki_allocm(void *addr, int direction, size_t size) 2279 { 2280 if (direction == AUMODE_PLAY) 2281 return emuxki_pmem_alloc(addr, size); 2282 else 2283 return emuxki_rmem_alloc(addr, size); 2284 } 2285 2286 static void 2287 emuxki_freem(void *addr, void *ptr, size_t size) 2288 { 2289 struct emuxki_softc *sc; 2290 struct emuxki_mem *mem; 2291 uint32_t *ptb, silentpage; 2292 size_t numblocks; 2293 int i; 2294 2295 sc = addr; 2296 ptb = KERNADDR(sc->ptb); 2297 silentpage = DMAADDR(sc->silentpage) << 1; 2298 LIST_FOREACH(mem, &sc->mem, next) { 2299 if (KERNADDR(mem->dmamem) != ptr) 2300 continue; 2301 2302 mutex_spin_enter(&sc->sc_intr_lock); 2303 if (mem->ptbidx != EMU_RMEM) { 2304 numblocks = DMASIZE(mem->dmamem) / EMU_PTESIZE; 2305 if (DMASIZE(mem->dmamem) % EMU_PTESIZE) 2306 numblocks++; 2307 for (i = 0; i < numblocks; i++) 2308 ptb[mem->ptbidx + i] = 2309 htole32(silentpage | (mem->ptbidx + i)); 2310 } 2311 LIST_REMOVE(mem, next); 2312 mutex_spin_exit(&sc->sc_intr_lock); 2313 2314 emuxki_mem_delete(mem, size); 2315 break; 2316 } 2317 } 2318 2319 /* blocksize should be a divisor of allowable buffersize */ 2320 /* XXX probably this could be done better */ 2321 static int 2322 emuxki_round_blocksize(void *addr, int blksize, 2323 int mode, const audio_params_t* param) 2324 { 2325 #if 0 2326 struct emuxki_softc *sc; 2327 struct audio_softc *au; 2328 #endif 2329 int bufsize; 2330 #if 0 2331 sc = addr; 2332 if (sc == NULL) 2333 return blksize; 2334 2335 au = device_private(sc->sc_audev); 2336 if (au == NULL) 2337 return blksize; 2338 2339 bufsize = emuxki_round_buffersize(sc, AUMODE_RECORD, 2340 au->sc_rr.bufsize); 2341 #else 2342 bufsize = 65536; 2343 #endif 2344 2345 while (bufsize > blksize) 2346 bufsize /= 2; 2347 2348 return bufsize; 2349 } 2350 2351 static size_t 2352 emuxki_round_buffersize(void *addr, int direction, size_t bsize) 2353 { 2354 2355 if (direction == AUMODE_PLAY) { 2356 if (bsize < EMU_PTESIZE) 2357 bsize = EMU_PTESIZE; 2358 else if (bsize > (EMU_PTESIZE * EMU_MAXPTE)) 2359 bsize = EMU_PTESIZE * EMU_MAXPTE; 2360 /* Would be better if set to max available */ 2361 else if (bsize % EMU_PTESIZE) 2362 bsize = bsize - 2363 (bsize % EMU_PTESIZE) + 2364 EMU_PTESIZE; 2365 } else { 2366 int idx; 2367 2368 /* find nearest lower recbuf size */ 2369 for(idx = sizeof(emuxki_recbuf_sz) / 2370 sizeof(emuxki_recbuf_sz[0]); --idx >= 0; ) { 2371 if (bsize >= emuxki_recbuf_sz[idx]) { 2372 bsize = emuxki_recbuf_sz[idx]; 2373 break; 2374 } 2375 } 2376 2377 if (bsize == 0) 2378 bsize = 384; 2379 } 2380 2381 return bsize; 2382 } 2383 2384 static paddr_t 2385 emuxki_mappage(void *addr, void *ptr, off_t off, int prot) 2386 { 2387 struct emuxki_softc *sc; 2388 struct emuxki_mem *mem; 2389 2390 sc = addr; 2391 2392 mutex_exit(&sc->sc_lock); 2393 LIST_FOREACH(mem, &sc->mem, next) { 2394 if (KERNADDR(mem->dmamem) == ptr) { 2395 struct dmamem *dm = mem->dmamem; 2396 2397 return bus_dmamem_mmap(dm->dmat, dm->segs, dm->nsegs, 2398 off, prot, BUS_DMA_WAITOK); 2399 } 2400 } 2401 mutex_enter(&sc->sc_lock); 2402 2403 return -1; 2404 } 2405 2406 static int 2407 emuxki_get_props(void *addr) 2408 { 2409 return AUDIO_PROP_MMAP | AUDIO_PROP_INDEPENDENT | 2410 AUDIO_PROP_FULLDUPLEX; 2411 } 2412 2413 static int 2414 emuxki_trigger_output(void *addr, void *start, void *end, int blksize, 2415 void (*inth) (void *), void *inthparam, const audio_params_t *params) 2416 { 2417 struct emuxki_softc *sc; 2418 /* No multiple voice support for now */ 2419 struct emuxki_voice *voice; 2420 int error; 2421 2422 sc = addr; 2423 voice = sc->pvoice; 2424 if (voice == NULL) 2425 return ENXIO; 2426 if ((error = emuxki_voice_set_audioparms(sc, voice, params->channels == 2, 2427 params->precision == 16, params->sample_rate))) 2428 return error; 2429 if ((error = emuxki_voice_set_bufparms(voice, start, 2430 (char *)end - (char *)start, blksize))) 2431 return error; 2432 emuxki_voice_commit_parms(voice); 2433 emuxki_voice_start(voice, inth, inthparam); 2434 2435 return 0; 2436 } 2437 2438 static int 2439 emuxki_trigger_input(void *addr, void *start, void *end, int blksize, 2440 void (*inth) (void *), void *inthparam, const audio_params_t *params) 2441 { 2442 struct emuxki_softc *sc; 2443 /* No multiple voice support for now */ 2444 struct emuxki_voice *voice; 2445 int error; 2446 2447 sc = addr; 2448 voice = sc->rvoice; 2449 if (voice == NULL) 2450 return ENXIO; 2451 if ((error = emuxki_voice_set_audioparms(sc, voice, 2452 params->channels == 2, params->precision == 16, 2453 params->sample_rate))) 2454 return error; 2455 if ((error = emuxki_voice_set_bufparms(voice, start, 2456 (char *)end - (char *)start, blksize))) 2457 return error; 2458 emuxki_voice_start(voice, inth, inthparam); 2459 2460 return 0; 2461 } 2462 2463 /* 2464 * AC97 callbacks 2465 */ 2466 2467 static int 2468 emuxki_ac97_attach(void *arg, struct ac97_codec_if *codecif) 2469 { 2470 struct emuxki_softc *sc; 2471 2472 sc = arg; 2473 sc->codecif = codecif; 2474 return 0; 2475 } 2476 2477 static int 2478 emuxki_ac97_read(void *arg, uint8_t reg, uint16_t *val) 2479 { 2480 struct emuxki_softc *sc; 2481 2482 sc = arg; 2483 mutex_spin_enter(&sc->sc_ac97_index_lock); 2484 bus_space_write_1(sc->sc_iot, sc->sc_ioh, EMU_AC97ADDR, reg); 2485 *val = bus_space_read_2(sc->sc_iot, sc->sc_ioh, EMU_AC97DATA); 2486 mutex_spin_exit(&sc->sc_ac97_index_lock); 2487 2488 return 0; 2489 } 2490 2491 static int 2492 emuxki_ac97_write(void *arg, uint8_t reg, uint16_t val) 2493 { 2494 struct emuxki_softc *sc; 2495 2496 sc = arg; 2497 mutex_spin_enter(&sc->sc_ac97_index_lock); 2498 bus_space_write_1(sc->sc_iot, sc->sc_ioh, EMU_AC97ADDR, reg); 2499 bus_space_write_2(sc->sc_iot, sc->sc_ioh, EMU_AC97DATA, val); 2500 mutex_spin_exit(&sc->sc_ac97_index_lock); 2501 2502 return 0; 2503 } 2504 2505 static int 2506 emuxki_ac97_reset(void *arg) 2507 { 2508 2509 return 0; 2510 } 2511 2512 enum ac97_host_flags 2513 emuxki_ac97_flags(void *arg) 2514 { 2515 2516 return AC97_HOST_SWAPPED_CHANNELS; 2517 } 2518 2519 static void 2520 emuxki_get_locks(void *arg, kmutex_t **intr, kmutex_t **proc) 2521 { 2522 struct emuxki_softc *sc; 2523 2524 sc = arg; 2525 *intr = &sc->sc_intr_lock; 2526 *proc = &sc->sc_lock; 2527 } 2528