summaryrefslogtreecommitdiffstats
path: root/sys/dev/pci/auacerreg.h
blob: ade61b18e46e272481176d33033fbefdf26dc534 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*	$OpenBSD: auacerreg.h,v 1.1 2008/08/28 10:21:23 mikeb Exp $	*/
/*	$NetBSD: auacer.h,v 1.1 2004/10/10 16:37:07 augustss Exp $	*/

/*-
 * Copyright (c) 2004 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Lennart Augustsson.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _DEV_PCI_AUACERREG_H_
#define	_DEV_PCI_AUACERREG_H_

#define	ALI_SCR		0x00	/* System Control Register */
#define   ALI_SCR_RESET		(1<<31)	/* master reset */
#define   ALI_SCR_AC97_DBL	(1<<30)
#define   ALI_SCR_CODEC_SPDF	(3<<20)	/* 1=7/8, 2=6/9, 3=10/11 */
#define   ALI_SCR_IN_BITS	(3<<18)
#define   ALI_SCR_OUT_BITS	(3<<16)
#define   ALI_SCR_6CH_CFG	(3<<14)
#define   ALI_SCR_PCM_4		(1<<8)
#define   ALI_SCR_PCM_6		(2<<8)
#define   ALI_SCR_PCM_246_MASK	(ALI_SCR_PCM_4 | ALI_SCR_PCM_6)
#define	ALI_SSR		0x04	/* System Status Register  */
#define   ALI_SSR_SEC_ID	(3<<5)
#define   ALI_SSR_PRI_ID	(3<<3)
#define	ALI_DMACR	0x08	/* DMA Control Register */
#define   ALI_DMACR_PAUSE 16	/* offset for pause bits */
#define	ALI_FIFOCR1	0x0c	/* FIFO Control Register 1 */
#define	ALI_INTERFACECR	0x10	/* Interface Control Register */
#define	ALI_INTERRUPTCR	0x14	/* Interrupt Control Register */
#define	ALI_INTERRUPTSR	0x18	/* Interrupt Status Register */
#define   ALI_INT_MICIN2		(1<<26)
#define   ALI_INT_PCMIN2		(1<<25)
#define   ALI_INT_I2SIN			(1<<24)
#define   ALI_INT_SPDIFOUT		(1<<23)
#define   ALI_INT_SPDIFIN		(1<<22)
#define   ALI_INT_LFEOUT		(1<<21)
#define   ALI_INT_CENTEROUT		(1<<20)
#define   ALI_INT_CODECSPDIFOUT		(1<<19)
#define   ALI_INT_MICIN			(1<<18)
#define   ALI_INT_PCMOUT		(1<<17)
#define   ALI_INT_PCMIN			(1<<16)
#define   ALI_INT_CPRAIS		(1<<7)
#define   ALI_INT_SPRAIS		(1<<5)
#define   ALI_INT_GPIO			(1<<1)
#define	ALI_FIFOCR2	0x1c	/* FIFO Control Register 2 */
#define	ALI_CPR		0x20	/* Command Port Register */
#define   ALI_CPR_ADDR_SECONDARY	0x100
#define   ALI_CPR_ADDR_READ		0x80
#define	ALI_CPR_ADDR	0x22	/* AC97 write addr */
#define	ALI_SPR		0x24	/* Status Port Register */
#define	ALI_SPR_ADDR	0x26	/* AC97 read addr */
#define	ALI_FIFOCR3	0x2c	/* FIFO Control Register 3 */
#define	ALI_TTSR	0x30	/* Transmit Tag Slot Register */
#define	ALI_RTSR	0x34	/* Receive Tag Slot  Register */
#define	ALI_CSPSR	0x38	/* Command/Status Port Status Register */
#define   ALI_CSPSR_CODEC_READY	0x08
#define   ALI_CSPSR_READ_OK	0x02
#define   ALI_CSPSR_WRITE_OK	0x01
#define	ALI_CAS		0x3c	/* Codec Write Semaphore Register */
#define   ALI_CAS_SEM_BUSY	0x80000000
#define ALI_HWVOL	0xf0	/* hardware volume control/status */
#define ALI_I2SCR	0xf4	/* I2S control/status */
#define	ALI_SPDIFCSR	0xf8	/* SPDIF Channel Status Register  */
#define	ALI_SPDIFICS	0xfc	/* SPDIF Interface Control/Status  */


#define ALI_OFF_BDBAR	0x00	/* Buffer Descriptor list Base Address */
#define ALI_OFF_CIV	0x04	/* Current Index Value */
#define ALI_OFF_LVI	0x05	/* Last Valid Index */
#define   ALI_LVI_MASK	0x1f
#define ALI_OFF_SR	0x06	/* Status Register */
#define   ALI_SR_DMA_INT_FIFO	  (1<<4) /* fifo under/over flow */
#define   ALI_SR_DMA_INT_COMPLETE (1<<3) /* buffer read/write complete and ioc set */
#define   ALI_SR_DMA_INT_LVI	  (1<<2) /* last valid done */
#define   ALI_SR_DMA_INT_CELV	  (1<<1) /* last valid is current */
#define   ALI_SR_DMA_INT_DCH	  (1<<0) /* DMA Controller Halted (happens on LVI interrupts) */
#define   ALI_SR_W1TC (ALI_SR_DMA_INT_LVI | ALI_SR_DMA_INT_COMPLETE | ALI_SR_DMA_INT_FIFO | ALI_SR_DMA_INT_CELV)
#define ALI_OFF_PICB	0x08	/* Position In Current Buffer */
#define	ALI_PIV		0x0a	/* 5 bits prefetched index value */
#define ALI_OFF_CR	0x0b	/* Control Register */
#define   ALI_CR_IOCE	0x10	/* Int On Completion Enable */
#define	  ALI_CR_FEIE	0x08	/* Fifo Error Int Enable */
#define	  ALI_CR_LVBIE	0x04	/* Last Valid Buf Int Enable */
#define	  ALI_CR_RR	0x02	/* 1 - Reset Regs */
#define	  ALI_CR_RPBM	0x01	/* 1 - Run, 0 - Pause */

#define ALI_BASE_PI		0x40	/* PCM In */
#define ALI_BASE_PO		0x50	/* PCM Out */
#define ALI_BASE_MC		0x60	/* Mic In */
#define ALI_BASE_CODEC_SPDIFO	0x70	/* Codec SPDIF Out  */
#define ALI_BASE_CENTER		0x80	/* Center out */
#define ALI_BASE_LFE		0x90	/* ? */
#define ALI_BASE_CTL_SPDIFI	0xa0	/* Controller SPDIF In */
#define ALI_BASE_CTL_SPDIFO	0xb0	/* Controller SPDIF Out */

#define ALI_PORT2SLOT(port) (((port) - 0x40) / 0x10)
#define ALI_PORT2INTR(port) (ALI_PORT2SLOT(port) + 16)

#define ALI_IF_AC97SP		(1<<21)
#define ALI_IF_MC		(1<<20)
#define ALI_IF_PI		(1<<19)
#define ALI_IF_MC2		(1<<18)
#define ALI_IF_PI2		(1<<17)
#define ALI_IF_LINE_SRC		(1<<15)	/* 0/1 = slot 3/6 */
#define ALI_IF_MIC_SRC		(1<<14)	/* 0/1 = slot 3/6 */
#define ALI_IF_SPDF_SRC		(3<<12)	/* 00 = PCM, 01 = AC97-in, 10 = spdif-in, 11 = i2s */
#define ALI_IF_AC97_OUT	(3<<8)	/* 00 = PCM, 10 = spdif-in, 11 = i2s */
#define ALI_IF_PO_SPDF	(1<<3)
#define ALI_IF_PO		(1<<1)

#define ALI_INT_MASK		(ALI_INT_SPDIFOUT|ALI_INT_CODECSPDIFOUT|ALI_INT_MICIN|ALI_INT_PCMOUT|ALI_INT_PCMIN)

#define ALI_SAMPLE_SIZE 2


/*
 * according to the dev/audiovar.h AU_RING_SIZE is 2^16, what fits
 * in our limits perfectly, i.e. setting it to higher value
 * in your kernel config would improve perfomance, still 2^21 is the max
 */
#define	ALI_DMALIST_MAX	32
#define	ALI_DMASEG_MAX	(65536*2)	/* 64k samples, 2x16 bit samples */
struct auacer_dmalist {
	u_int32_t	base;
	u_int32_t	len;
#define	ALI_DMAF_IOC	0x80000000	/* 1-int on complete */
#define	ALI_DMAF_BUP	0x40000000	/* 0-retrans last, 1-transmit 0 */
};

#endif /* _DEV_PCI_AUACERREG_H_ */