]>
Commit | Line | Data |
---|---|---|
2538a4f5 DR |
1 | /* |
2 | * Common defines for the alsa driver code base for HD Audio. | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or modify it | |
5 | * under the terms of the GNU General Public License as published by the Free | |
6 | * Software Foundation; either version 2 of the License, or (at your option) | |
7 | * any later version. | |
8 | * | |
9 | * This program is distributed in the hope that it will be useful, but WITHOUT | |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
12 | * more details. | |
13 | */ | |
14 | ||
15 | #ifndef __SOUND_HDA_PRIV_H | |
16 | #define __SOUND_HDA_PRIV_H | |
17 | ||
18 | #include <linux/clocksource.h> | |
19 | #include <sound/core.h> | |
20 | #include <sound/pcm.h> | |
21 | ||
22 | /* | |
23 | * registers | |
24 | */ | |
fb1d8ac2 TI |
25 | #define AZX_REG_GCAP 0x00 |
26 | #define AZX_GCAP_64OK (1 << 0) /* 64bit address support */ | |
27 | #define AZX_GCAP_NSDO (3 << 1) /* # of serial data out signals */ | |
28 | #define AZX_GCAP_BSS (31 << 3) /* # of bidirectional streams */ | |
29 | #define AZX_GCAP_ISS (15 << 8) /* # of input streams */ | |
30 | #define AZX_GCAP_OSS (15 << 12) /* # of output streams */ | |
31 | #define AZX_REG_VMIN 0x02 | |
32 | #define AZX_REG_VMAJ 0x03 | |
33 | #define AZX_REG_OUTPAY 0x04 | |
34 | #define AZX_REG_INPAY 0x06 | |
35 | #define AZX_REG_GCTL 0x08 | |
36 | #define AZX_GCTL_RESET (1 << 0) /* controller reset */ | |
37 | #define AZX_GCTL_FCNTRL (1 << 1) /* flush control */ | |
38 | #define AZX_GCTL_UNSOL (1 << 8) /* accept unsol. response enable */ | |
39 | #define AZX_REG_WAKEEN 0x0c | |
40 | #define AZX_REG_STATESTS 0x0e | |
41 | #define AZX_REG_GSTS 0x10 | |
42 | #define AZX_GSTS_FSTS (1 << 1) /* flush status */ | |
43 | #define AZX_REG_INTCTL 0x20 | |
44 | #define AZX_REG_INTSTS 0x24 | |
45 | #define AZX_REG_WALLCLK 0x30 /* 24Mhz source */ | |
46 | #define AZX_REG_OLD_SSYNC 0x34 /* SSYNC for old ICH */ | |
47 | #define AZX_REG_SSYNC 0x38 | |
48 | #define AZX_REG_CORBLBASE 0x40 | |
49 | #define AZX_REG_CORBUBASE 0x44 | |
50 | #define AZX_REG_CORBWP 0x48 | |
51 | #define AZX_REG_CORBRP 0x4a | |
52 | #define AZX_CORBRP_RST (1 << 15) /* read pointer reset */ | |
53 | #define AZX_REG_CORBCTL 0x4c | |
54 | #define AZX_CORBCTL_RUN (1 << 1) /* enable DMA */ | |
55 | #define AZX_CORBCTL_CMEIE (1 << 0) /* enable memory error irq */ | |
56 | #define AZX_REG_CORBSTS 0x4d | |
57 | #define AZX_CORBSTS_CMEI (1 << 0) /* memory error indication */ | |
58 | #define AZX_REG_CORBSIZE 0x4e | |
59 | ||
60 | #define AZX_REG_RIRBLBASE 0x50 | |
61 | #define AZX_REG_RIRBUBASE 0x54 | |
62 | #define AZX_REG_RIRBWP 0x58 | |
63 | #define AZX_RIRBWP_RST (1 << 15) /* write pointer reset */ | |
64 | #define AZX_REG_RINTCNT 0x5a | |
65 | #define AZX_REG_RIRBCTL 0x5c | |
66 | #define AZX_RBCTL_IRQ_EN (1 << 0) /* enable IRQ */ | |
67 | #define AZX_RBCTL_DMA_EN (1 << 1) /* enable DMA */ | |
68 | #define AZX_RBCTL_OVERRUN_EN (1 << 2) /* enable overrun irq */ | |
69 | #define AZX_REG_RIRBSTS 0x5d | |
70 | #define AZX_RBSTS_IRQ (1 << 0) /* response irq */ | |
71 | #define AZX_RBSTS_OVERRUN (1 << 2) /* overrun irq */ | |
72 | #define AZX_REG_RIRBSIZE 0x5e | |
73 | ||
74 | #define AZX_REG_IC 0x60 | |
75 | #define AZX_REG_IR 0x64 | |
76 | #define AZX_REG_IRS 0x68 | |
77 | #define AZX_IRS_VALID (1<<1) | |
78 | #define AZX_IRS_BUSY (1<<0) | |
79 | ||
80 | #define AZX_REG_DPLBASE 0x70 | |
81 | #define AZX_REG_DPUBASE 0x74 | |
82 | #define AZX_DPLBASE_ENABLE 0x1 /* Enable position buffer */ | |
2538a4f5 DR |
83 | |
84 | /* SD offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */ | |
85 | enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 }; | |
86 | ||
87 | /* stream register offsets from stream base */ | |
fb1d8ac2 TI |
88 | #define AZX_REG_SD_CTL 0x00 |
89 | #define AZX_REG_SD_STS 0x03 | |
90 | #define AZX_REG_SD_LPIB 0x04 | |
91 | #define AZX_REG_SD_CBL 0x08 | |
92 | #define AZX_REG_SD_LVI 0x0c | |
93 | #define AZX_REG_SD_FIFOW 0x0e | |
94 | #define AZX_REG_SD_FIFOSIZE 0x10 | |
95 | #define AZX_REG_SD_FORMAT 0x12 | |
96 | #define AZX_REG_SD_BDLPL 0x18 | |
97 | #define AZX_REG_SD_BDLPU 0x1c | |
2538a4f5 DR |
98 | |
99 | /* PCI space */ | |
fb1d8ac2 | 100 | #define AZX_PCIREG_TCSEL 0x44 |
2538a4f5 DR |
101 | |
102 | /* | |
103 | * other constants | |
104 | */ | |
105 | ||
2538a4f5 DR |
106 | /* max number of fragments - we may use more if allocating more pages for BDL */ |
107 | #define BDL_SIZE 4096 | |
108 | #define AZX_MAX_BDL_ENTRIES (BDL_SIZE / 16) | |
109 | #define AZX_MAX_FRAG 32 | |
110 | /* max buffer size - no h/w limit, you can increase as you like */ | |
111 | #define AZX_MAX_BUF_SIZE (1024*1024*1024) | |
112 | ||
113 | /* RIRB int mask: overrun[2], response[0] */ | |
114 | #define RIRB_INT_RESPONSE 0x01 | |
115 | #define RIRB_INT_OVERRUN 0x04 | |
116 | #define RIRB_INT_MASK 0x05 | |
117 | ||
118 | /* STATESTS int mask: S3,SD2,SD1,SD0 */ | |
119 | #define AZX_MAX_CODECS 8 | |
120 | #define AZX_DEFAULT_CODECS 4 | |
121 | #define STATESTS_INT_MASK ((1 << AZX_MAX_CODECS) - 1) | |
122 | ||
123 | /* SD_CTL bits */ | |
124 | #define SD_CTL_STREAM_RESET 0x01 /* stream reset bit */ | |
125 | #define SD_CTL_DMA_START 0x02 /* stream DMA start bit */ | |
126 | #define SD_CTL_STRIPE (3 << 16) /* stripe control */ | |
127 | #define SD_CTL_TRAFFIC_PRIO (1 << 18) /* traffic priority */ | |
128 | #define SD_CTL_DIR (1 << 19) /* bi-directional stream */ | |
129 | #define SD_CTL_STREAM_TAG_MASK (0xf << 20) | |
130 | #define SD_CTL_STREAM_TAG_SHIFT 20 | |
131 | ||
132 | /* SD_CTL and SD_STS */ | |
133 | #define SD_INT_DESC_ERR 0x10 /* descriptor error interrupt */ | |
134 | #define SD_INT_FIFO_ERR 0x08 /* FIFO error interrupt */ | |
135 | #define SD_INT_COMPLETE 0x04 /* completion interrupt */ | |
136 | #define SD_INT_MASK (SD_INT_DESC_ERR|SD_INT_FIFO_ERR|\ | |
137 | SD_INT_COMPLETE) | |
138 | ||
139 | /* SD_STS */ | |
140 | #define SD_STS_FIFO_READY 0x20 /* FIFO ready */ | |
141 | ||
142 | /* INTCTL and INTSTS */ | |
fb1d8ac2 TI |
143 | #define AZX_INT_ALL_STREAM 0xff /* all stream interrupts */ |
144 | #define AZX_INT_CTRL_EN 0x40000000 /* controller interrupt enable bit */ | |
145 | #define AZX_INT_GLOBAL_EN 0x80000000 /* global interrupt enable bit */ | |
2538a4f5 DR |
146 | |
147 | /* below are so far hardcoded - should read registers in future */ | |
fb1d8ac2 TI |
148 | #define AZX_MAX_CORB_ENTRIES 256 |
149 | #define AZX_MAX_RIRB_ENTRIES 256 | |
2538a4f5 DR |
150 | |
151 | /* driver quirks (capabilities) */ | |
152 | /* bits 0-7 are used for indicating driver type */ | |
153 | #define AZX_DCAPS_NO_TCSEL (1 << 8) /* No Intel TCSEL bit */ | |
154 | #define AZX_DCAPS_NO_MSI (1 << 9) /* No MSI support */ | |
155 | #define AZX_DCAPS_ATI_SNOOP (1 << 10) /* ATI snoop enable */ | |
156 | #define AZX_DCAPS_NVIDIA_SNOOP (1 << 11) /* Nvidia snoop enable */ | |
157 | #define AZX_DCAPS_SCH_SNOOP (1 << 12) /* SCH/PCH snoop enable */ | |
158 | #define AZX_DCAPS_RIRB_DELAY (1 << 13) /* Long delay in read loop */ | |
159 | #define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14) /* Put a delay before read */ | |
160 | #define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */ | |
161 | #define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */ | |
162 | #define AZX_DCAPS_POSFIX_VIA (1 << 17) /* Use VIACOMBO as default */ | |
163 | #define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */ | |
164 | #define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */ | |
165 | #define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */ | |
166 | #define AZX_DCAPS_BUFSIZE (1 << 21) /* no buffer size alignment */ | |
167 | #define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */ | |
168 | #define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */ | |
cd50065b | 169 | #define AZX_DCAPS_REVERSE_ASSIGN (1 << 24) /* Assign devices in reverse order */ |
2538a4f5 DR |
170 | #define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */ |
171 | #define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */ | |
172 | #define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 powerwell support */ | |
6ba736dd | 173 | #define AZX_DCAPS_CORBRP_SELF_CLEAR (1 << 28) /* CORBRP clears itself after reset */ |
db79afa1 | 174 | #define AZX_DCAPS_NO_MSI64 (1 << 29) /* Stick to 32-bit MSIs */ |
2538a4f5 | 175 | |
2538a4f5 DR |
176 | /* HD Audio class code */ |
177 | #define PCI_CLASS_MULTIMEDIA_HD_AUDIO 0x0403 | |
178 | ||
179 | struct azx_dev { | |
180 | struct snd_dma_buffer bdl; /* BDL buffer */ | |
181 | u32 *posbuf; /* position buffer pointer */ | |
182 | ||
183 | unsigned int bufsize; /* size of the play buffer in bytes */ | |
184 | unsigned int period_bytes; /* size of the period in bytes */ | |
185 | unsigned int frags; /* number for period in the play buffer */ | |
186 | unsigned int fifo_size; /* FIFO size */ | |
187 | unsigned long start_wallclk; /* start + minimum wallclk */ | |
188 | unsigned long period_wallclk; /* wallclk for period */ | |
189 | ||
190 | void __iomem *sd_addr; /* stream descriptor pointer */ | |
191 | ||
192 | u32 sd_int_sta_mask; /* stream int status mask */ | |
193 | ||
194 | /* pcm support */ | |
195 | struct snd_pcm_substream *substream; /* assigned substream, | |
196 | * set in PCM open | |
197 | */ | |
198 | unsigned int format_val; /* format value to be set in the | |
199 | * controller and the codec | |
200 | */ | |
201 | unsigned char stream_tag; /* assigned stream */ | |
202 | unsigned char index; /* stream index */ | |
203 | int assigned_key; /* last device# key assigned to */ | |
204 | ||
205 | unsigned int opened:1; | |
206 | unsigned int running:1; | |
207 | unsigned int irq_pending:1; | |
208 | unsigned int prepared:1; | |
209 | unsigned int locked:1; | |
210 | /* | |
211 | * For VIA: | |
212 | * A flag to ensure DMA position is 0 | |
213 | * when link position is not greater than FIFO size | |
214 | */ | |
215 | unsigned int insufficient:1; | |
216 | unsigned int wc_marked:1; | |
217 | unsigned int no_period_wakeup:1; | |
218 | ||
219 | struct timecounter azx_tc; | |
220 | struct cyclecounter azx_cc; | |
221 | ||
222 | int delay_negative_threshold; | |
223 | ||
224 | #ifdef CONFIG_SND_HDA_DSP_LOADER | |
225 | /* Allows dsp load to have sole access to the playback stream. */ | |
226 | struct mutex dsp_mutex; | |
227 | #endif | |
228 | }; | |
229 | ||
230 | /* CORB/RIRB */ | |
231 | struct azx_rb { | |
232 | u32 *buf; /* CORB/RIRB buffer | |
233 | * Each CORB entry is 4byte, RIRB is 8byte | |
234 | */ | |
235 | dma_addr_t addr; /* physical address of CORB/RIRB buffer */ | |
236 | /* for RIRB */ | |
237 | unsigned short rp, wp; /* read/write pointers */ | |
238 | int cmds[AZX_MAX_CODECS]; /* number of pending requests */ | |
239 | u32 res[AZX_MAX_CODECS]; /* last read value */ | |
240 | }; | |
241 | ||
f46ea609 DR |
242 | struct azx; |
243 | ||
40830813 DR |
244 | /* Functions to read/write to hda registers. */ |
245 | struct hda_controller_ops { | |
246 | /* Register Access */ | |
db291e36 DR |
247 | void (*reg_writel)(u32 value, u32 __iomem *addr); |
248 | u32 (*reg_readl)(u32 __iomem *addr); | |
249 | void (*reg_writew)(u16 value, u16 __iomem *addr); | |
250 | u16 (*reg_readw)(u16 __iomem *addr); | |
251 | void (*reg_writeb)(u8 value, u8 __iomem *addr); | |
252 | u8 (*reg_readb)(u8 __iomem *addr); | |
f46ea609 DR |
253 | /* Disable msi if supported, PCI only */ |
254 | int (*disable_msi_reset_irq)(struct azx *); | |
b419b35b DR |
255 | /* Allocation ops */ |
256 | int (*dma_alloc_pages)(struct azx *chip, | |
257 | int type, | |
258 | size_t size, | |
259 | struct snd_dma_buffer *buf); | |
260 | void (*dma_free_pages)(struct azx *chip, struct snd_dma_buffer *buf); | |
261 | int (*substream_alloc_pages)(struct azx *chip, | |
262 | struct snd_pcm_substream *substream, | |
263 | size_t size); | |
264 | int (*substream_free_pages)(struct azx *chip, | |
265 | struct snd_pcm_substream *substream); | |
8769b278 DR |
266 | void (*pcm_mmap_prepare)(struct snd_pcm_substream *substream, |
267 | struct vm_area_struct *area); | |
7ca954a8 DR |
268 | /* Check if current position is acceptable */ |
269 | int (*position_check)(struct azx *chip, struct azx_dev *azx_dev); | |
40830813 DR |
270 | }; |
271 | ||
2538a4f5 DR |
272 | struct azx_pcm { |
273 | struct azx *chip; | |
274 | struct snd_pcm *pcm; | |
275 | struct hda_codec *codec; | |
276 | struct hda_pcm_stream *hinfo[2]; | |
277 | struct list_head list; | |
278 | }; | |
279 | ||
b6050ef6 TI |
280 | typedef unsigned int (*azx_get_pos_callback_t)(struct azx *, struct azx_dev *); |
281 | typedef int (*azx_get_delay_callback_t)(struct azx *, struct azx_dev *, unsigned int pos); | |
282 | ||
2538a4f5 DR |
283 | struct azx { |
284 | struct snd_card *card; | |
285 | struct pci_dev *pci; | |
286 | int dev_index; | |
287 | ||
288 | /* chip type specific */ | |
289 | int driver_type; | |
290 | unsigned int driver_caps; | |
291 | int playback_streams; | |
292 | int playback_index_offset; | |
293 | int capture_streams; | |
294 | int capture_index_offset; | |
295 | int num_streams; | |
749ee287 | 296 | const int *jackpoll_ms; /* per-card jack poll interval */ |
2538a4f5 | 297 | |
40830813 DR |
298 | /* Register interaction. */ |
299 | const struct hda_controller_ops *ops; | |
300 | ||
b6050ef6 TI |
301 | /* position adjustment callbacks */ |
302 | azx_get_pos_callback_t get_position[2]; | |
303 | azx_get_delay_callback_t get_delay[2]; | |
304 | ||
2538a4f5 DR |
305 | /* pci resources */ |
306 | unsigned long addr; | |
307 | void __iomem *remap_addr; | |
308 | int irq; | |
309 | ||
310 | /* locks */ | |
311 | spinlock_t reg_lock; | |
312 | struct mutex open_mutex; /* Prevents concurrent open/close operations */ | |
2538a4f5 DR |
313 | |
314 | /* streams (x num_streams) */ | |
315 | struct azx_dev *azx_dev; | |
316 | ||
317 | /* PCM */ | |
318 | struct list_head pcm_list; /* azx_pcm list */ | |
319 | ||
320 | /* HD codec */ | |
321 | unsigned short codec_mask; | |
322 | int codec_probe_mask; /* copied from probe_mask option */ | |
323 | struct hda_bus *bus; | |
324 | unsigned int beep_mode; | |
325 | ||
326 | /* CORB/RIRB */ | |
327 | struct azx_rb corb; | |
328 | struct azx_rb rirb; | |
329 | ||
330 | /* CORB/RIRB and position buffers */ | |
331 | struct snd_dma_buffer rb; | |
332 | struct snd_dma_buffer posbuf; | |
333 | ||
334 | #ifdef CONFIG_SND_HDA_PATCH_LOADER | |
335 | const struct firmware *fw; | |
336 | #endif | |
337 | ||
338 | /* flags */ | |
9cdc0115 | 339 | const int *bdl_pos_adj; |
2538a4f5 DR |
340 | int poll_count; |
341 | unsigned int running:1; | |
342 | unsigned int initialized:1; | |
343 | unsigned int single_cmd:1; | |
344 | unsigned int polling_mode:1; | |
345 | unsigned int msi:1; | |
2538a4f5 DR |
346 | unsigned int probing:1; /* codec probing phase */ |
347 | unsigned int snoop:1; | |
348 | unsigned int align_buffer_size:1; | |
349 | unsigned int region_requested:1; | |
2538a4f5 DR |
350 | unsigned int disabled:1; /* disabled by VGA-switcher */ |
351 | ||
352 | /* for debugging */ | |
353 | unsigned int last_cmd[AZX_MAX_CODECS]; | |
354 | ||
2538a4f5 DR |
355 | /* reboot notifier (for mysterious hangup problem at power-down) */ |
356 | struct notifier_block reboot_notifier; | |
357 | ||
2538a4f5 DR |
358 | #ifdef CONFIG_SND_HDA_DSP_LOADER |
359 | struct azx_dev saved_azx_dev; | |
360 | #endif | |
2538a4f5 DR |
361 | }; |
362 | ||
2538a4f5 DR |
363 | #ifdef CONFIG_X86 |
364 | #define azx_snoop(chip) ((chip)->snoop) | |
365 | #else | |
366 | #define azx_snoop(chip) true | |
367 | #endif | |
368 | ||
40830813 DR |
369 | /* |
370 | * macros for easy use | |
371 | */ | |
372 | ||
373 | #define azx_writel(chip, reg, value) \ | |
fb1d8ac2 | 374 | ((chip)->ops->reg_writel(value, (chip)->remap_addr + AZX_REG_##reg)) |
40830813 | 375 | #define azx_readl(chip, reg) \ |
fb1d8ac2 | 376 | ((chip)->ops->reg_readl((chip)->remap_addr + AZX_REG_##reg)) |
40830813 | 377 | #define azx_writew(chip, reg, value) \ |
fb1d8ac2 | 378 | ((chip)->ops->reg_writew(value, (chip)->remap_addr + AZX_REG_##reg)) |
40830813 | 379 | #define azx_readw(chip, reg) \ |
fb1d8ac2 | 380 | ((chip)->ops->reg_readw((chip)->remap_addr + AZX_REG_##reg)) |
40830813 | 381 | #define azx_writeb(chip, reg, value) \ |
fb1d8ac2 | 382 | ((chip)->ops->reg_writeb(value, (chip)->remap_addr + AZX_REG_##reg)) |
40830813 | 383 | #define azx_readb(chip, reg) \ |
fb1d8ac2 | 384 | ((chip)->ops->reg_readb((chip)->remap_addr + AZX_REG_##reg)) |
40830813 DR |
385 | |
386 | #define azx_sd_writel(chip, dev, reg, value) \ | |
fb1d8ac2 | 387 | ((chip)->ops->reg_writel(value, (dev)->sd_addr + AZX_REG_##reg)) |
40830813 | 388 | #define azx_sd_readl(chip, dev, reg) \ |
fb1d8ac2 | 389 | ((chip)->ops->reg_readl((dev)->sd_addr + AZX_REG_##reg)) |
40830813 | 390 | #define azx_sd_writew(chip, dev, reg, value) \ |
fb1d8ac2 | 391 | ((chip)->ops->reg_writew(value, (dev)->sd_addr + AZX_REG_##reg)) |
40830813 | 392 | #define azx_sd_readw(chip, dev, reg) \ |
fb1d8ac2 | 393 | ((chip)->ops->reg_readw((dev)->sd_addr + AZX_REG_##reg)) |
40830813 | 394 | #define azx_sd_writeb(chip, dev, reg, value) \ |
fb1d8ac2 | 395 | ((chip)->ops->reg_writeb(value, (dev)->sd_addr + AZX_REG_##reg)) |
40830813 | 396 | #define azx_sd_readb(chip, dev, reg) \ |
fb1d8ac2 | 397 | ((chip)->ops->reg_readb((dev)->sd_addr + AZX_REG_##reg)) |
40830813 | 398 | |
2538a4f5 | 399 | #endif /* __SOUND_HDA_PRIV_H */ |