The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/sound/pci/emu10kx.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 575502b0babe99869201681370929e61


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.