Annotation of sys/dev/pci/ydsreg.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: ydsreg.h,v 1.5 2004/12/20 12:29:36 deraadt Exp $ */
2: /* $NetBSD$ */
3:
4: /*
5: * Copyright (c) 2000, 2001 Kazuki Sakamoto and Minoura Makoto.
6: * All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: *
17: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27: */
28:
29: /*
30: * YMF724/740/744/754 registers
31: */
32:
33: #ifndef _DEV_PCI_YDSREG_H_
34: #define _DEV_PCI_YDSREG_H_
35:
36: /*
37: * PCI Config Registers
38: */
39: #define YDS_PCI_MBA 0x10
40: #define YDS_PCI_LEGACY 0x40
41: # define YDS_PCI_LEGACY_SBEN 0x0001
42: # define YDS_PCI_LEGACY_FMEN 0x0002
43: # define YDS_PCI_LEGACY_JPEN 0x0004
44: # define YDS_PCI_LEGACY_MEN 0x0008
45: # define YDS_PCI_LEGACY_MIEN 0x0010
46: # define YDS_PCI_LEGACY_IO 0x0020
47: # define YDS_PCI_LEGACY_SDMA0 0x0000
48: # define YDS_PCI_LEGACY_SDMA1 0x0040
49: # define YDS_PCI_LEGACY_SDMA3 0x00c0
50: # define YDS_PCI_LEGACY_SBIRQ5 0x0000
51: # define YDS_PCI_LEGACY_SBIRQ7 0x0100
52: # define YDS_PCI_LEGACY_SBIRQ9 0x0200
53: # define YDS_PCI_LEGACY_SBIRQ10 0x0300
54: # define YDS_PCI_LEGACY_SBIRQ11 0x0400
55: # define YDS_PCI_LEGACY_MPUIRQ5 0x0000
56: # define YDS_PCI_LEGACY_MPUIRQ7 0x0800
57: # define YDS_PCI_LEGACY_MPUIRQ9 0x1000
58: # define YDS_PCI_LEGACY_MPUIRQ10 0x1800
59: # define YDS_PCI_LEGACY_MPUIRQ11 0x2000
60: # define YDS_PCI_LEGACY_SIEN 0x4000
61: # define YDS_PCI_LEGACY_LAD 0x8000
62:
63: # define YDS_PCI_EX_LEGACY_FMIO_388 (0x0000 << 16)
64: # define YDS_PCI_EX_LEGACY_FMIO_398 (0x0001 << 16)
65: # define YDS_PCI_EX_LEGACY_FMIO_3A0 (0x0002 << 16)
66: # define YDS_PCI_EX_LEGACY_FMIO_3A8 (0x0003 << 16)
67: # define YDS_PCI_EX_LEGACY_SBIO_220 (0x0000 << 16)
68: # define YDS_PCI_EX_LEGACY_SBIO_240 (0x0004 << 16)
69: # define YDS_PCI_EX_LEGACY_SBIO_260 (0x0008 << 16)
70: # define YDS_PCI_EX_LEGACY_SBIO_280 (0x000c << 16)
71: # define YDS_PCI_EX_LEGACY_MPUIO_330 (0x0000 << 16)
72: # define YDS_PCI_EX_LEGACY_MPUIO_300 (0x0010 << 16)
73: # define YDS_PCI_EX_LEGACY_MPUIO_332 (0x0020 << 16)
74: # define YDS_PCI_EX_LEGACY_MPUIO_334 (0x0030 << 16)
75: # define YDS_PCI_EX_LEGACY_JSIO_201 (0x0000 << 16)
76: # define YDS_PCI_EX_LEGACY_JSIO_202 (0x0040 << 16)
77: # define YDS_PCI_EX_LEGACY_JSIO_204 (0x0080 << 16)
78: # define YDS_PCI_EX_LEGACY_JSIO_205 (0x00c0 << 16)
79: # define YDS_PCI_EX_LEGACY_MAIM (0x0100 << 16)
80: # define YDS_PCI_EX_LEGACY_SMOD_PCI (0x0000 << 16)
81: # define YDS_PCI_EX_LEGACY_SMOD_DISABLE (0x0800 << 16)
82: # define YDS_PCI_EX_LEGACY_SMOD_DDMA (0x1000 << 16)
83: # define YDS_PCI_EX_LEGACY_SBVER_3 (0x0000 << 16)
84: # define YDS_PCI_EX_LEGACY_SBVER_2 (0x2000 << 16)
85: # define YDS_PCI_EX_LEGACY_SBVER_1 (0x4000 << 16)
86: # define YDS_PCI_EX_LEGACY_IMOD (0x8000 << 16)
87:
88: #define YDS_PCI_DSCTRL 0x48
89: # define YDS_DSCTRL_CRST 0x00000001
90: # define YDS_DSCTRL_WRST 0x00000004
91:
92: #define YDS_PCI_FM_BA 0x60
93: #define YDS_PCI_SB_BA 0x62
94: #define YDS_PCI_MPU_BA 0x64
95: #define YDS_PCI_JS_BA 0x66
96:
97: /*
98: * DS-1 PCI Audio part registers
99: */
100: #define YDS_INTERRUPT_FLAGS 0x0004
101: #define YDS_INTERRUPT_FLAGS_TI 0x0001
102: #define YDS_ACTIVITY 0x0006
103: # define YDS_ACTIVITY_DOCKA 0x0010
104: #define YDS_GLOBAL_CONTROL 0x0008
105: # define YDS_GLCTRL_HVE 0x0001
106: # define YDS_GLCTRL_HVIE 0x0002
107:
108: #define YDS_GPIO_IIF 0x0050
109: # define YDS_GPIO_GIO0 0x0001
110: # define YDS_GPIO_GIO1 0x0002
111: # define YDS_GPIO_GIO2 0x0004
112: #define YDS_GPIO_IIE 0x0052
113: # define YDS_GPIO_GIE0 0x0001
114: # define YDS_GPIO_GIE1 0x0002
115: # define YDS_GPIO_GIE2 0x0004
116: #define YDS_GPIO_ISTAT 0x0054
117: # define YDS_GPIO_GPI0 0x0001
118: # define YDS_GPIO_GPI1 0x0002
119: # define YDS_GPIO_GPI2 0x0004
120: #define YDS_GPIO_OCTRL 0x0056
121: # define YDS_GPIO_GPO0 0x0001
122: # define YDS_GPIO_GPO1 0x0002
123: # define YDS_GPIO_GPO2 0x0004
124: #define YDS_GPIO_FUNCE 0x0058
125: # define YDS_GPIO_GPC0 0x0001
126: # define YDS_GPIO_GPC1 0x0002
127: # define YDS_GPIO_GPC2 0x0004
128: # define YDS_GPIO_GPE0 0x0010
129: # define YDS_GPIO_GPE1 0x0020
130: # define YDS_GPIO_GPE2 0x0040
131: #define YDS_GPIO_ITYPE 0x005a
132: # define YDS_GPIO_GPT0_LEVEL 0x0000
133: # define YDS_GPIO_GPT0_RISE 0x0001
134: # define YDS_GPIO_GPT0_FALL 0x0002
135: # define YDS_GPIO_GPT0_BOTH 0x0003
136: # define YDS_GPIO_GPT0_MASK 0x0003
137: # define YDS_GPIO_GPT1_LEVEL 0x0004
138: # define YDS_GPIO_GPT1_RISE 0x0005
139: # define YDS_GPIO_GPT1_FALL 0x0006
140: # define YDS_GPIO_GPT1_BOTH 0x0007
141: # define YDS_GPIO_GPT1_MASK 0x0007
142: # define YDS_GPIO_GPT2_LEVEL 0x0000
143: # define YDS_GPIO_GPT2_RISE 0x0010
144: # define YDS_GPIO_GPT2_FALL 0x0020
145: # define YDS_GPIO_GPT2_BOTH 0x0030
146: # define YDS_GPIO_GPT2_MASK 0x0030
147:
148: #define YDS_GLOBAL_CONTROL 0x0008
149: # define YDS_GLCTRL_HVE 0x0001
150: # define YDS_GLCTRL_HVIE 0x0002
151:
152: #define AC97_CMD_DATA 0x0060
153: #define AC97_CMD_ADDR 0x0062
154: # define AC97_ID(id) ((id) << 8)
155: # define AC97_CMD_READ 0x8000
156: # define AC97_CMD_WRITE 0x0000
157: #define AC97_STAT_DATA1 0x0064
158: #define AC97_STAT_ADDR1 0x0066
159: #define AC97_STAT_DATA2 0x0068
160: #define AC97_STAT_ADDR2 0x006a
161: # define AC97_BUSY 0x8000
162:
163: #define YDS_LEGACY_OUT_VOLUME 0x0080
164: #define YDS_DAC_OUT_VOLUME 0x0084
165: #define YDS_DAC_OUT_VOL_L 0x0084
166: #define YDS_DAC_OUT_VOL_R 0x0086
167: #define YDS_ZV_OUT_VOLUME 0x0088
168: #define YDS_2ND_OUT_VOLUME 0x008C
169: #define YDS_ADC_OUT_VOLUME 0x0090
170: #define YDS_LEGACY_REC_VOLUME 0x0094
171: #define YDS_DAC_REC_VOLUME 0x0098
172: #define YDS_ZV_REC_VOLUME 0x009C
173: #define YDS_2ND_REC_VOLUME 0x00A0
174: #define YDS_ADC_REC_VOLUME 0x00A4
175: #define YDS_ADC_IN_VOLUME 0x00A8
176: #define YDS_REC_IN_VOLUME 0x00AC
177: #define YDS_P44_OUT_VOLUME 0x00B0
178: #define YDS_P44_REC_VOLUME 0x00B4
179: #define YDS_SPDIFIN_OUT_VOLUME 0x00B8
180: #define YDS_SPDIFIN_REC_VOLUME 0x00BC
181:
182: #define YDS_ADC_SAMPLE_RATE 0x00c0
183: #define YDS_REC_SAMPLE_RATE 0x00c4
184: #define YDS_ADC_FORMAT 0x00c8
185: #define YDS_REC_FORMAT 0x00cc
186: # define YDS_FORMAT_8BIT 0x01
187: # define YDS_FORMAT_STEREO 0x02
188:
189: #define YDS_STATUS 0x0100
190: # define YDS_STAT_ACT 0x00000001
191: # define YDS_STAT_WORK 0x00000002
192: # define YDS_STAT_TINT 0x00008000
193: # define YDS_STAT_INT 0x80000000
194: #define YDS_CONTROL_SELECT 0x0104
195: # define YDS_CSEL 0x00000001
196: #define YDS_MODE 0x0108
197: # define YDS_MODE_ACTV 0x00000001
198: # define YDS_MODE_ACTV2 0x00000002
199: # define YDS_MODE_TOUT 0x00008000
200: # define YDS_MODE_RESET 0x00010000
201: # define YDS_MODE_AC3 0x40000000
202: # define YDS_MODE_MUTE 0x80000000
203:
204: #define YDS_CONFIG 0x0114
205: # define YDS_DSP_DISABLE 0
206: # define YDS_DSP_SETUP 0x00000001
207:
208: #define YDS_PLAY_CTRLSIZE 0x0140
209: #define YDS_REC_CTRLSIZE 0x0144
210: #define YDS_EFFECT_CTRLSIZE 0x0148
211: #define YDS_WORK_SIZE 0x014c
212: #define YDS_MAPOF_REC 0x0150
213: # define YDS_RECSLOT_VALID 0x00000001
214: # define YDS_ADCSLOT_VALID 0x00000002
215: #define YDS_MAPOF_EFFECT 0x0154
216: # define YDS_DL_VALID 0x00000001
217: # define YDS_DR_VALID 0x00000002
218: # define YDS_EFFECT1_VALID 0x00000004
219: # define YDS_EFFECT2_VALID 0x00000008
220: # define YDS_EFFECT3_VALID 0x00000010
221:
222: #define YDS_PLAY_CTRLBASE 0x0158
223: #define YDS_REC_CTRLBASE 0x015c
224: #define YDS_EFFECT_CTRLBASE 0x0160
225: #define YDS_WORK_BASE 0x0164
226:
227: #define YDS_DSP_INSTRAM 0x1000
228: #define YDS_CTRL_INSTRAM 0x4000
229:
230: typedef enum {
231: YDS_DS_1,
232: YDS_DS_1E
233: } yds_dstype_t;
234:
235: #define AC97_TIMEOUT 1000
236: #define YDS_WORK_TIMEOUT 250000
237:
238: /* slot control data structures */
239: #define MAX_PLAY_SLOT_CTRL 64
240: #define N_PLAY_SLOT_CTRL_BANK 2
241: #define N_REC_SLOT_CTRL 2
242: #define N_REC_SLOT_CTRL_BANK 2
243:
244: /*
245: * play slot
246: */
247: union play_slot_table {
248: u_int32_t numofplay;
249: u_int32_t slotbase;
250: };
251:
252: struct play_slot_ctrl_bank {
253: u_int32_t format;
254: #define PSLT_FORMAT_STEREO 0x00010000
255: #define PSLT_FORMAT_8BIT 0x80000000
256: #define PSLT_FORMAT_SRC441 0x10000000
257: #define PSLT_FORMAT_RCH 0x00000001
258: u_int32_t loopdefault;
259: u_int32_t pgbase;
260: u_int32_t pgloop;
261: u_int32_t pgloopend;
262: u_int32_t pgloopfrac;
263: u_int32_t pgdeltaend;
264: u_int32_t lpfkend;
265: u_int32_t eggainend;
266: u_int32_t lchgainend;
267: u_int32_t rchgainend;
268: u_int32_t effect1gainend;
269: u_int32_t effect2gainend;
270: u_int32_t effect3gainend;
271: u_int32_t lpfq;
272: u_int32_t status;
273: #define PSLT_STATUS_DEND 0x00000001
274: u_int32_t numofframes;
275: u_int32_t loopcount;
276: u_int32_t pgstart;
277: u_int32_t pgstartfrac;
278: u_int32_t pgdelta;
279: u_int32_t lpfk;
280: u_int32_t eggain;
281: u_int32_t lchgain;
282: u_int32_t rchgain;
283: u_int32_t effect1gain;
284: u_int32_t effect2gain;
285: u_int32_t effect3gain;
286: u_int32_t lpfd1;
287: u_int32_t lpfd2;
288: };
289:
290: /*
291: * rec slot
292: */
293: struct rec_slot_ctrl_bank {
294: u_int32_t pgbase;
295: u_int32_t pgloopendadr;
296: u_int32_t pgstartadr;
297: u_int32_t numofloops;
298: };
299:
300: struct rec_slot {
301: struct rec_slot_ctrl {
302: struct rec_slot_ctrl_bank bank[N_REC_SLOT_CTRL_BANK];
303: } ctrl[N_REC_SLOT_CTRL];
304: };
305:
306: /*
307: * effect slot
308: */
309: struct effect_slot_ctrl_bank {
310: u_int32_t pgbase;
311: u_int32_t pgloopend;
312: u_int32_t pgstart;
313: u_int32_t temp;
314: };
315:
316: #define N_PLAY_SLOTS 2 /* We use only 2 (R and L) */
317: #define N_PLAY_SLOT_CTRL 2
318: #define WORK_SIZE 0x0400
319:
320: /*
321: * softc
322: */
323: struct yds_dma {
324: bus_dmamap_t map;
325: caddr_t addr; /* VA */
326: bus_dma_segment_t segs[1];
327: int nsegs;
328: size_t size;
329: struct yds_dma *next;
330: };
331:
332: struct yds_codec_softc {
333: struct device sc_dev; /* base device */
334: struct yds_softc *sc;
335: int id;
336: int status_data;
337: int status_addr;
338: struct ac97_host_if host_if;
339: struct ac97_codec_if *codec_if;
340: };
341:
342: struct yds_softc {
343: struct device sc_dev; /* base device */
344: pci_chipset_tag_t sc_pc;
345: pcitag_t sc_pcitag;
346: pcireg_t sc_id;
347: int sc_revision;
348: void *sc_ih; /* interrupt vectoring */
349: bus_space_tag_t memt;
350: bus_space_handle_t memh;
351: bus_dma_tag_t sc_dmatag; /* DMA tag */
352: u_int sc_flags;
353:
354: struct yds_codec_softc sc_codec[2]; /* Primary/Secondary AC97 */
355:
356: struct yds_dma *sc_dmas; /* List of DMA handles */
357:
358: /*
359: * Play/record status
360: */
361: struct {
362: void (*intr)(void *); /* rint/pint */
363: void *intr_arg; /* arg for intr */
364: u_int offset; /* filled up to here */
365: u_int blksize;
366: u_int factor; /* byte per sample */
367: u_int length; /* ring buffer length */
368: struct yds_dma *dma; /* DMA handle for ring buf */
369: } sc_play, sc_rec;
370:
371: /*
372: * DSP control data
373: *
374: * Work space, play control data table, play slot control data,
375: * rec slot control data and effect slot control data are
376: * stored in a single memory segment in this order.
377: */
378: struct yds_dma sc_ctrldata;
379: /* KVA and offset in buffer of play ctrl data tbl */
380: u_int32_t *ptbl;
381: off_t ptbloff;
382: /* KVA and offset in buffer of rec slot ctrl data */
383: struct rec_slot_ctrl_bank *rbank;
384: off_t rbankoff;
385: /* Array of KVA pointers and offset of play slot control data */
386: struct play_slot_ctrl_bank *pbankp[N_PLAY_SLOT_CTRL_BANK
387: *N_PLAY_SLOTS];
388: off_t pbankoff;
389:
390: /*
391: * Legacy support
392: */
393: bus_space_tag_t sc_legacy_iot;
394: bus_space_handle_t sc_opl_ioh;
395: struct device *sc_mpu;
396: bus_space_handle_t sc_mpu_ioh;
397:
398: /*
399: * Suspend/resume support
400: */
401: void *powerhook;
402: int suspend;
403: };
404: #define sc_opl_iot sc_legacy_iot
405: #define sc_mpu_iot sc_legacy_iot
406:
407: #endif /* _DEV_PCI_YDSREG_H_ */
CVSweb