4 * The DMA buffer manager for digitized voice applications
7 * Copyright (C) by Hannu Savolainen 1993-1997
9 * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
10 * Version 2 (June 1991). See the "COPYING" file distributed with this software
13 * Thomas Sailer : moved several static variables into struct audio_operations
14 * (which is grossly misnamed btw.) because they have the same
15 * lifetime as the rest in there and dynamic allocation saves
17 * Thomas Sailer : remove {in,out}_sleep_flag. It was used for the sleeper to
18 * determine if it was woken up by the expiring timeout or by
19 * an explicit wake_up. The return value from schedule_timeout
20 * can be used instead; if 0, the wakeup was due to the timeout.
22 * Rob Riggs Added persistent DMA buffers (1998/10/17)
25 #define BE_CONSERVATIVE
26 #define SAMPLE_ROUNDUP 0
28 #include "sound_config.h"
30 #define DMAP_FREE_ON_CLOSE 0
31 #define DMAP_KEEP_ON_CLOSE 1
32 extern int sound_dmap_flag
;
34 static void dma_reset_output(int dev
);
35 static void dma_reset_input(int dev
);
36 static int local_start_dma(struct audio_operations
*adev
, unsigned long physaddr
, int count
, int dma_mode
);
40 static int debugmem
= 0; /* switched off by default */
41 static int dma_buffsize
= DSP_BUFFSIZE
;
43 static long dmabuf_timeout(struct dma_buffparms
*dmap
)
47 tmout
= (dmap
->fragment_size
* HZ
) / dmap
->data_rate
;
48 tmout
+= HZ
/ 5; /* Some safety distance */
56 static int sound_alloc_dmap(struct dma_buffparms
*dmap
)
58 char *start_addr
, *end_addr
;
62 dmap
->mapping_flags
&= ~DMA_MAP_MAPPED
;
64 if (dmap
->raw_buf
!= NULL
)
65 return 0; /* Already done */
66 if (dma_buffsize
< 4096)
68 dma_pagesize
= (dmap
->dma
< 4) ? (64 * 1024) : (128 * 1024);
71 * Now check for the Cyrix problem.
74 if(isa_dma_bridge_buggy
==2)
78 dmap
->buffsize
= dma_buffsize
;
79 if (dmap
->buffsize
> dma_pagesize
)
80 dmap
->buffsize
= dma_pagesize
;
83 * Now loop until we get a free buffer. Try to get smaller buffer if
84 * it fails. Don't accept smaller than 8k buffer for performance
87 while (start_addr
== NULL
&& dmap
->buffsize
> PAGE_SIZE
) {
88 for (sz
= 0, size
= PAGE_SIZE
; size
< dmap
->buffsize
; sz
++, size
<<= 1);
89 dmap
->buffsize
= PAGE_SIZE
* (1 << sz
);
90 start_addr
= (char *) __get_free_pages(GFP_ATOMIC
|GFP_DMA
, sz
);
91 if (start_addr
== NULL
)
95 if (start_addr
== NULL
) {
96 printk(KERN_WARNING
"Sound error: Couldn't allocate DMA buffer\n");
99 /* make some checks */
100 end_addr
= start_addr
+ dmap
->buffsize
- 1;
103 printk(KERN_DEBUG
"sound: start 0x%lx, end 0x%lx\n", (long) start_addr
, (long) end_addr
);
105 /* now check if it fits into the same dma-pagesize */
107 if (((long) start_addr
& ~(dma_pagesize
- 1)) != ((long) end_addr
& ~(dma_pagesize
- 1))
108 || end_addr
>= (char *) (MAX_DMA_ADDRESS
)) {
109 printk(KERN_ERR
"sound: Got invalid address 0x%lx for %db DMA-buffer\n", (long) start_addr
, dmap
->buffsize
);
113 dmap
->raw_buf
= start_addr
;
114 dmap
->raw_buf_phys
= virt_to_bus(start_addr
);
116 for (i
= MAP_NR(start_addr
); i
<= MAP_NR(end_addr
); i
++)
117 set_bit(PG_reserved
, &mem_map
[i
].flags
);;
121 static void sound_free_dmap(struct dma_buffparms
*dmap
)
124 unsigned long start_addr
, end_addr
;
126 if (dmap
->raw_buf
== NULL
)
128 if (dmap
->mapping_flags
& DMA_MAP_MAPPED
)
129 return; /* Don't free mmapped buffer. Will use it next time */
130 for (sz
= 0, size
= PAGE_SIZE
; size
< dmap
->buffsize
; sz
++, size
<<= 1);
132 start_addr
= (unsigned long) dmap
->raw_buf
;
133 end_addr
= start_addr
+ dmap
->buffsize
;
135 for (i
= MAP_NR(start_addr
); i
<= MAP_NR(end_addr
); i
++)
136 clear_bit(PG_reserved
, &mem_map
[i
].flags
);;
138 free_pages((unsigned long) dmap
->raw_buf
, sz
);
139 dmap
->raw_buf
= NULL
;
143 /* Intel version !!!!!!!!! */
145 static int sound_start_dma(struct dma_buffparms
*dmap
, unsigned long physaddr
, int count
, int dma_mode
)
148 int chan
= dmap
->dma
;
150 /* printk( "Start DMA%d %d, %d\n", chan, (int)(physaddr-dmap->raw_buf_phys), count); */
152 flags
= claim_dma_lock();
155 set_dma_mode(chan
, dma_mode
);
156 set_dma_addr(chan
, physaddr
);
157 set_dma_count(chan
, count
);
159 release_dma_lock(flags
);
164 static void dma_init_buffers(struct dma_buffparms
*dmap
)
166 dmap
->qlen
= dmap
->qhead
= dmap
->qtail
= dmap
->user_counter
= 0;
167 dmap
->byte_counter
= 0;
168 dmap
->max_byte_counter
= 8000 * 60 * 60;
169 dmap
->bytes_in_use
= dmap
->buffsize
;
171 dmap
->dma_mode
= DMODE_NONE
;
172 dmap
->mapping_flags
= 0;
173 dmap
->neutral_byte
= 0x80;
174 dmap
->data_rate
= 8000;
178 dmap
->flags
= DMA_BUSY
; /* Other flags off */
181 static int open_dmap(struct audio_operations
*adev
, int mode
, struct dma_buffparms
*dmap
)
185 if (dmap
->flags
& DMA_BUSY
)
187 if ((err
= sound_alloc_dmap(dmap
)) < 0)
190 if (dmap
->raw_buf
== NULL
) {
191 printk(KERN_WARNING
"Sound: DMA buffers not available\n");
192 return -ENOSPC
; /* Memory allocation failed during boot */
194 if (dmap
->dma
>= 0 && sound_open_dma(dmap
->dma
, adev
->name
)) {
195 printk(KERN_WARNING
"Unable to grab(2) DMA%d for the audio driver\n", dmap
->dma
);
198 dma_init_buffers(dmap
);
199 dmap
->open_mode
= mode
;
200 dmap
->subdivision
= dmap
->underrun_count
= 0;
201 dmap
->fragment_size
= 0;
202 dmap
->max_fragments
= 65536; /* Just a large value */
203 dmap
->byte_counter
= 0;
204 dmap
->max_byte_counter
= 8000 * 60 * 60;
205 dmap
->applic_profile
= APF_NORMAL
;
206 dmap
->needs_reorg
= 1;
207 dmap
->audio_callback
= NULL
;
208 dmap
->callback_parm
= 0;
212 static void close_dmap(struct audio_operations
*adev
, struct dma_buffparms
*dmap
)
216 if (dmap
->dma
>= 0) {
217 sound_close_dma(dmap
->dma
);
218 flags
=claim_dma_lock();
219 disable_dma(dmap
->dma
);
220 release_dma_lock(flags
);
222 if (dmap
->flags
& DMA_BUSY
)
223 dmap
->dma_mode
= DMODE_NONE
;
224 dmap
->flags
&= ~DMA_BUSY
;
226 if (sound_dmap_flag
== DMAP_FREE_ON_CLOSE
)
227 sound_free_dmap(dmap
);
231 static unsigned int default_set_bits(int dev
, unsigned int bits
)
233 mm_segment_t fs
= get_fs();
236 audio_devs
[dev
]->d
->ioctl(dev
, SNDCTL_DSP_SETFMT
, (caddr_t
)&bits
);
241 static int default_set_speed(int dev
, int speed
)
243 mm_segment_t fs
= get_fs();
246 audio_devs
[dev
]->d
->ioctl(dev
, SNDCTL_DSP_SPEED
, (caddr_t
)&speed
);
251 static short default_set_channels(int dev
, short channels
)
254 mm_segment_t fs
= get_fs();
257 audio_devs
[dev
]->d
->ioctl(dev
, SNDCTL_DSP_CHANNELS
, (caddr_t
)&c
);
262 static void check_driver(struct audio_driver
*d
)
264 if (d
->set_speed
== NULL
)
265 d
->set_speed
= default_set_speed
;
266 if (d
->set_bits
== NULL
)
267 d
->set_bits
= default_set_bits
;
268 if (d
->set_channels
== NULL
)
269 d
->set_channels
= default_set_channels
;
272 int DMAbuf_open(int dev
, int mode
)
274 struct audio_operations
*adev
= audio_devs
[dev
];
276 struct dma_buffparms
*dmap_in
= NULL
;
277 struct dma_buffparms
*dmap_out
= NULL
;
281 if (!(adev
->flags
& DMA_DUPLEX
))
282 adev
->dmap_in
= adev
->dmap_out
;
283 check_driver(adev
->d
);
285 if ((retval
= adev
->d
->open(dev
, mode
)) < 0)
287 dmap_out
= adev
->dmap_out
;
288 dmap_in
= adev
->dmap_in
;
289 if (dmap_in
== dmap_out
)
290 adev
->flags
&= ~DMA_DUPLEX
;
292 if (mode
& OPEN_WRITE
) {
293 if ((retval
= open_dmap(adev
, mode
, dmap_out
)) < 0) {
298 adev
->enable_bits
= mode
;
300 if (mode
== OPEN_READ
|| (mode
!= OPEN_WRITE
&& (adev
->flags
& DMA_DUPLEX
))) {
301 if ((retval
= open_dmap(adev
, mode
, dmap_in
)) < 0) {
303 if (mode
& OPEN_WRITE
)
304 close_dmap(adev
, dmap_out
);
308 adev
->open_mode
= mode
;
311 adev
->d
->set_bits(dev
, 8);
312 adev
->d
->set_channels(dev
, 1);
313 adev
->d
->set_speed(dev
, DSP_DEFAULT_SPEED
);
314 if (adev
->dmap_out
->dma_mode
== DMODE_OUTPUT
)
315 memset(adev
->dmap_out
->raw_buf
, adev
->dmap_out
->neutral_byte
,
316 adev
->dmap_out
->bytes_in_use
);
320 void DMAbuf_reset(int dev
)
322 if (audio_devs
[dev
]->open_mode
& OPEN_WRITE
)
323 dma_reset_output(dev
);
325 if (audio_devs
[dev
]->open_mode
& OPEN_READ
)
326 dma_reset_input(dev
);
329 static void dma_reset_output(int dev
)
331 struct audio_operations
*adev
= audio_devs
[dev
];
332 unsigned long flags
,f
;
333 struct dma_buffparms
*dmap
= adev
->dmap_out
;
335 if (!(dmap
->flags
& DMA_STARTED
)) /* DMA is not active */
339 * First wait until the current fragment has been played completely
343 adev
->dmap_out
->flags
|= DMA_SYNCING
;
345 adev
->dmap_out
->underrun_count
= 0;
346 if (!signal_pending(current
) && adev
->dmap_out
->qlen
&&
347 adev
->dmap_out
->underrun_count
== 0)
348 interruptible_sleep_on_timeout(&adev
->out_sleeper
,
349 dmabuf_timeout(dmap
));
350 adev
->dmap_out
->flags
&= ~(DMA_SYNCING
| DMA_ACTIVE
);
353 * Finally shut the device off
355 if (!(adev
->flags
& DMA_DUPLEX
) || !adev
->d
->halt_output
)
356 adev
->d
->halt_io(dev
);
358 adev
->d
->halt_output(dev
);
359 adev
->dmap_out
->flags
&= ~DMA_STARTED
;
362 clear_dma_ff(dmap
->dma
);
363 disable_dma(dmap
->dma
);
366 restore_flags(flags
);
367 dmap
->byte_counter
= 0;
368 reorganize_buffers(dev
, adev
->dmap_out
, 0);
369 dmap
->qlen
= dmap
->qhead
= dmap
->qtail
= dmap
->user_counter
= 0;
372 static void dma_reset_input(int dev
)
374 struct audio_operations
*adev
= audio_devs
[dev
];
376 struct dma_buffparms
*dmap
= adev
->dmap_in
;
380 if (!(adev
->flags
& DMA_DUPLEX
) || !adev
->d
->halt_input
)
381 adev
->d
->halt_io(dev
);
383 adev
->d
->halt_input(dev
);
384 adev
->dmap_in
->flags
&= ~DMA_STARTED
;
385 restore_flags(flags
);
387 dmap
->qlen
= dmap
->qhead
= dmap
->qtail
= dmap
->user_counter
= 0;
388 dmap
->byte_counter
= 0;
389 reorganize_buffers(dev
, adev
->dmap_in
, 1);
392 void DMAbuf_launch_output(int dev
, struct dma_buffparms
*dmap
)
394 struct audio_operations
*adev
= audio_devs
[dev
];
396 if (!((adev
->enable_bits
* adev
->go
) & PCM_ENABLE_OUTPUT
))
397 return; /* Don't start DMA yet */
398 dmap
->dma_mode
= DMODE_OUTPUT
;
400 if (!(dmap
->flags
& DMA_ACTIVE
) || !(adev
->flags
& DMA_AUTOMODE
) || (dmap
->flags
& DMA_NODMA
)) {
401 if (!(dmap
->flags
& DMA_STARTED
)) {
402 reorganize_buffers(dev
, dmap
, 0);
403 if (adev
->d
->prepare_for_output(dev
, dmap
->fragment_size
, dmap
->nbufs
))
405 if (!(dmap
->flags
& DMA_NODMA
))
406 local_start_dma(adev
, dmap
->raw_buf_phys
, dmap
->bytes_in_use
,DMA_MODE_WRITE
);
407 dmap
->flags
|= DMA_STARTED
;
409 if (dmap
->counts
[dmap
->qhead
] == 0)
410 dmap
->counts
[dmap
->qhead
] = dmap
->fragment_size
;
411 dmap
->dma_mode
= DMODE_OUTPUT
;
412 adev
->d
->output_block(dev
, dmap
->raw_buf_phys
+ dmap
->qhead
* dmap
->fragment_size
,
413 dmap
->counts
[dmap
->qhead
], 1);
414 if (adev
->d
->trigger
)
415 adev
->d
->trigger(dev
,adev
->enable_bits
* adev
->go
);
417 dmap
->flags
|= DMA_ACTIVE
;
420 int DMAbuf_sync(int dev
)
422 struct audio_operations
*adev
= audio_devs
[dev
];
425 struct dma_buffparms
*dmap
;
427 if (!adev
->go
&& !(adev
->enable_bits
& PCM_ENABLE_OUTPUT
))
430 if (adev
->dmap_out
->dma_mode
== DMODE_OUTPUT
) {
431 dmap
= adev
->dmap_out
;
434 if (dmap
->qlen
> 0 && !(dmap
->flags
& DMA_ACTIVE
))
435 DMAbuf_launch_output(dev
, dmap
);
436 adev
->dmap_out
->flags
|= DMA_SYNCING
;
437 adev
->dmap_out
->underrun_count
= 0;
438 while (!signal_pending(current
) && n
++ <= adev
->dmap_out
->nbufs
&&
439 adev
->dmap_out
->qlen
&& adev
->dmap_out
->underrun_count
== 0) {
440 long t
= dmabuf_timeout(dmap
);
441 t
= interruptible_sleep_on_timeout(&adev
->out_sleeper
,
444 adev
->dmap_out
->flags
&= ~DMA_SYNCING
;
445 restore_flags(flags
);
446 return adev
->dmap_out
->qlen
;
449 adev
->dmap_out
->flags
&= ~(DMA_SYNCING
| DMA_ACTIVE
);
450 restore_flags(flags
);
453 * Some devices such as GUS have huge amount of on board RAM for the
454 * audio data. We have to wait until the device has finished playing.
459 if (adev
->d
->local_qlen
) { /* Device has hidden buffers */
460 while (!signal_pending(current
) &&
461 adev
->d
->local_qlen(dev
))
462 interruptible_sleep_on_timeout(&adev
->out_sleeper
,
463 dmabuf_timeout(dmap
));
465 restore_flags(flags
);
467 adev
->dmap_out
->dma_mode
= DMODE_NONE
;
468 return adev
->dmap_out
->qlen
;
471 int DMAbuf_release(int dev
, int mode
)
473 struct audio_operations
*adev
= audio_devs
[dev
];
476 if (adev
->open_mode
& OPEN_WRITE
)
477 adev
->dmap_out
->closing
= 1;
478 if (adev
->open_mode
& OPEN_READ
)
479 adev
->dmap_in
->closing
= 1;
481 if (adev
->open_mode
& OPEN_WRITE
)
482 if (!(adev
->dmap_out
->mapping_flags
& DMA_MAP_MAPPED
))
483 if (!signal_pending(current
) && (adev
->dmap_out
->dma_mode
== DMODE_OUTPUT
))
485 if (adev
->dmap_out
->dma_mode
== DMODE_OUTPUT
)
486 memset(adev
->dmap_out
->raw_buf
, adev
->dmap_out
->neutral_byte
, adev
->dmap_out
->bytes_in_use
);
493 if (adev
->open_mode
& OPEN_WRITE
)
494 close_dmap(adev
, adev
->dmap_out
);
496 if (adev
->open_mode
== OPEN_READ
||
497 (adev
->open_mode
!= OPEN_WRITE
&&
498 (adev
->flags
& DMA_DUPLEX
)))
499 close_dmap(adev
, adev
->dmap_in
);
501 restore_flags(flags
);
505 int DMAbuf_activate_recording(int dev
, struct dma_buffparms
*dmap
)
507 struct audio_operations
*adev
= audio_devs
[dev
];
510 if (!(adev
->open_mode
& OPEN_READ
))
512 if (!(adev
->enable_bits
& PCM_ENABLE_INPUT
))
514 if (dmap
->dma_mode
== DMODE_OUTPUT
) { /* Direction change */
517 dmap
->dma_mode
= DMODE_NONE
;
519 if (!dmap
->dma_mode
) {
520 reorganize_buffers(dev
, dmap
, 1);
521 if ((err
= adev
->d
->prepare_for_input(dev
,
522 dmap
->fragment_size
, dmap
->nbufs
)) < 0)
524 dmap
->dma_mode
= DMODE_INPUT
;
526 if (!(dmap
->flags
& DMA_ACTIVE
)) {
527 if (dmap
->needs_reorg
)
528 reorganize_buffers(dev
, dmap
, 0);
529 local_start_dma(adev
, dmap
->raw_buf_phys
, dmap
->bytes_in_use
, DMA_MODE_READ
);
530 adev
->d
->start_input(dev
, dmap
->raw_buf_phys
+ dmap
->qtail
* dmap
->fragment_size
,
531 dmap
->fragment_size
, 0);
532 dmap
->flags
|= DMA_ACTIVE
;
533 if (adev
->d
->trigger
)
534 adev
->d
->trigger(dev
, adev
->enable_bits
* adev
->go
);
539 int DMAbuf_getrdbuffer(int dev
, char **buf
, int *len
, int dontblock
)
541 struct audio_operations
*adev
= audio_devs
[dev
];
544 struct dma_buffparms
*dmap
= adev
->dmap_in
;
547 if (!(adev
->open_mode
& OPEN_READ
))
549 if (dmap
->needs_reorg
)
550 reorganize_buffers(dev
, dmap
, 0);
553 if (adev
->dmap_in
->mapping_flags
& DMA_MAP_MAPPED
) {
554 /* printk(KERN_WARNING "Sound: Can't read from mmapped device (1)\n");*/
555 restore_flags(flags
);
557 } else while (dmap
->qlen
<= 0 && n
++ < 10) {
558 long timeout
= MAX_SCHEDULE_TIMEOUT
;
559 if (!(adev
->enable_bits
& PCM_ENABLE_INPUT
) || !adev
->go
) {
560 restore_flags(flags
);
563 if ((err
= DMAbuf_activate_recording(dev
, dmap
)) < 0) {
564 restore_flags(flags
);
567 /* Wait for the next block */
570 restore_flags(flags
);
574 timeout
= dmabuf_timeout(dmap
);
575 timeout
= interruptible_sleep_on_timeout(&adev
->in_sleeper
,
578 /* FIXME: include device name */
580 printk(KERN_WARNING
"Sound: DMA (input) timed out - IRQ/DRQ config error?\n");
581 dma_reset_input(dev
);
585 restore_flags(flags
);
588 return err
? err
: -EINTR
;
589 *buf
= &dmap
->raw_buf
[dmap
->qhead
* dmap
->fragment_size
+ dmap
->counts
[dmap
->qhead
]];
590 *len
= dmap
->fragment_size
- dmap
->counts
[dmap
->qhead
];
595 int DMAbuf_rmchars(int dev
, int buff_no
, int c
)
597 struct audio_operations
*adev
= audio_devs
[dev
];
598 struct dma_buffparms
*dmap
= adev
->dmap_in
;
599 int p
= dmap
->counts
[dmap
->qhead
] + c
;
601 if (dmap
->mapping_flags
& DMA_MAP_MAPPED
)
603 /* printk("Sound: Can't read from mmapped device (2)\n");*/
606 else if (dmap
->qlen
<= 0)
608 else if (p
>= dmap
->fragment_size
) { /* This buffer is completely empty */
609 dmap
->counts
[dmap
->qhead
] = 0;
611 dmap
->qhead
= (dmap
->qhead
+ 1) % dmap
->nbufs
;
613 else dmap
->counts
[dmap
->qhead
] = p
;
618 int DMAbuf_get_buffer_pointer(int dev
, struct dma_buffparms
*dmap
, int direction
)
621 * Try to approximate the active byte position of the DMA pointer within the
622 * buffer area as well as possible.
631 if (!(dmap
->flags
& DMA_ACTIVE
))
634 int chan
= dmap
->dma
;
639 if(!isa_dma_bridge_buggy
)
640 disable_dma(dmap
->dma
);
642 pos
= get_dma_residue(chan
);
644 pos
= dmap
->bytes_in_use
- pos
;
646 if (!(dmap
->mapping_flags
& DMA_MAP_MAPPED
)) {
647 if (direction
== DMODE_OUTPUT
) {
648 if (dmap
->qhead
== 0)
649 if (pos
> dmap
->fragment_size
)
652 if (dmap
->qtail
== 0)
653 if (pos
> dmap
->fragment_size
)
659 if (pos
>= dmap
->bytes_in_use
)
662 if(!isa_dma_bridge_buggy
)
663 enable_dma(dmap
->dma
);
667 restore_flags(flags
);
668 /* printk( "%04x ", pos); */
674 * DMAbuf_start_devices() is called by the /dev/music driver to start
675 * one or more audio devices at desired moment.
678 void DMAbuf_start_devices(unsigned int devmask
)
680 struct audio_operations
*adev
;
683 for (dev
= 0; dev
< num_audiodevs
; dev
++) {
684 if (!(devmask
& (1 << dev
)))
686 if (!(adev
= audio_devs
[dev
]))
688 if (adev
->open_mode
== 0)
692 /* OK to start the device */
694 if (adev
->d
->trigger
)
695 adev
->d
->trigger(dev
,adev
->enable_bits
* adev
->go
);
699 int DMAbuf_space_in_queue(int dev
)
701 struct audio_operations
*adev
= audio_devs
[dev
];
703 struct dma_buffparms
*dmap
= adev
->dmap_out
;
704 int lim
= dmap
->nbufs
;
709 if (dmap
->qlen
>= lim
) /* No space at all */
713 * Verify that there are no more pending buffers than the limit
714 * defined by the process.
717 max
= dmap
->max_fragments
;
722 if (adev
->d
->local_qlen
) {
723 tmp
= adev
->d
->local_qlen(dev
);
725 tmp
--; /* This buffer has been counted twice */
728 if (dmap
->byte_counter
% dmap
->fragment_size
) /* There is a partial fragment */
736 static int output_sleep(int dev
, int dontblock
)
738 struct audio_operations
*adev
= audio_devs
[dev
];
740 struct dma_buffparms
*dmap
= adev
->dmap_out
;
746 if (!(adev
->enable_bits
& PCM_ENABLE_OUTPUT
))
750 * Wait for free space
752 if (signal_pending(current
))
754 timeout
= (adev
->go
&& !(dmap
->flags
& DMA_NOTIMEOUT
));
756 timeout_value
= dmabuf_timeout(dmap
);
758 timeout_value
= MAX_SCHEDULE_TIMEOUT
;
759 timeout_value
= interruptible_sleep_on_timeout(&adev
->out_sleeper
,
761 if (timeout
!= MAX_SCHEDULE_TIMEOUT
&& !timeout_value
) {
762 printk(KERN_WARNING
"Sound: DMA (output) timed out - IRQ/DRQ config error?\n");
763 dma_reset_output(dev
);
765 if (signal_pending(current
))
771 static int find_output_space(int dev
, char **buf
, int *size
)
773 struct audio_operations
*adev
= audio_devs
[dev
];
774 struct dma_buffparms
*dmap
= adev
->dmap_out
;
776 unsigned long active_offs
;
779 int occupied_bytes
= (dmap
->user_counter
% dmap
->fragment_size
);
781 *buf
= dmap
->raw_buf
;
782 if (!(maxfrags
= DMAbuf_space_in_queue(dev
)) && !occupied_bytes
)
787 #ifdef BE_CONSERVATIVE
788 active_offs
= dmap
->byte_counter
+ dmap
->qhead
* dmap
->fragment_size
;
790 active_offs
= DMAbuf_get_buffer_pointer(dev
, dmap
, DMODE_OUTPUT
);
791 /* Check for pointer wrapping situation */
792 if (active_offs
< 0 || active_offs
>= dmap
->bytes_in_use
)
794 active_offs
+= dmap
->byte_counter
;
797 offs
= (dmap
->user_counter
% dmap
->bytes_in_use
) & ~SAMPLE_ROUNDUP
;
798 if (offs
< 0 || offs
>= dmap
->bytes_in_use
) {
799 restore_flags(flags
);
800 printk(KERN_ERR
"Sound: Got unexpected offs %ld. Giving up.\n", offs
);
801 printk("Counter = %ld, bytes=%d\n", dmap
->user_counter
, dmap
->bytes_in_use
);
804 *buf
= dmap
->raw_buf
+ offs
;
806 len
= active_offs
+ dmap
->bytes_in_use
- dmap
->user_counter
; /* Number of unused bytes in buffer */
808 if ((offs
+ len
) > dmap
->bytes_in_use
)
809 len
= dmap
->bytes_in_use
- offs
;
811 restore_flags(flags
);
814 if (len
> ((maxfrags
* dmap
->fragment_size
) - occupied_bytes
))
815 len
= (maxfrags
* dmap
->fragment_size
) - occupied_bytes
;
816 *size
= len
& ~SAMPLE_ROUNDUP
;
817 restore_flags(flags
);
821 int DMAbuf_getwrbuffer(int dev
, char **buf
, int *size
, int dontblock
)
823 struct audio_operations
*adev
= audio_devs
[dev
];
826 struct dma_buffparms
*dmap
= adev
->dmap_out
;
828 if (dmap
->needs_reorg
)
829 reorganize_buffers(dev
, dmap
, 0);
831 if (dmap
->mapping_flags
& DMA_MAP_MAPPED
) {
832 /* printk(KERN_DEBUG "Sound: Can't write to mmapped device (3)\n");*/
835 if (dmap
->dma_mode
== DMODE_INPUT
) { /* Direction change */
837 dmap
->dma_mode
= DMODE_NONE
;
839 dmap
->dma_mode
= DMODE_OUTPUT
;
843 while (find_output_space(dev
, buf
, size
) <= 0) {
844 if ((err
= output_sleep(dev
, dontblock
)) < 0) {
845 restore_flags(flags
);
849 restore_flags(flags
);
854 int DMAbuf_move_wrpointer(int dev
, int l
)
856 struct audio_operations
*adev
= audio_devs
[dev
];
857 struct dma_buffparms
*dmap
= adev
->dmap_out
;
858 unsigned long ptr
= (dmap
->user_counter
/ dmap
->fragment_size
) * dmap
->fragment_size
;
859 unsigned long end_ptr
, p
;
860 int post
= (dmap
->flags
& DMA_POST
);
862 dmap
->flags
&= ~DMA_POST
;
864 dmap
->user_counter
+= l
;
865 dmap
->flags
|= DMA_DIRTY
;
867 if (dmap
->byte_counter
>= dmap
->max_byte_counter
) {
868 /* Wrap the byte counters */
869 long decr
= dmap
->byte_counter
;
870 dmap
->byte_counter
= (dmap
->byte_counter
% dmap
->bytes_in_use
);
871 decr
-= dmap
->byte_counter
;
872 dmap
->user_counter
-= decr
;
874 end_ptr
= (dmap
->user_counter
/ dmap
->fragment_size
) * dmap
->fragment_size
;
876 p
= (dmap
->user_counter
- 1) % dmap
->bytes_in_use
;
877 dmap
->neutral_byte
= dmap
->raw_buf
[p
];
879 /* Update the fragment based bookkeeping too */
880 while (ptr
< end_ptr
) {
881 dmap
->counts
[dmap
->qtail
] = dmap
->fragment_size
;
882 dmap
->qtail
= (dmap
->qtail
+ 1) % dmap
->nbufs
;
884 ptr
+= dmap
->fragment_size
;
887 dmap
->counts
[dmap
->qtail
] = dmap
->user_counter
- ptr
;
890 * Let the low level driver to perform some postprocessing to
893 if (adev
->d
->postprocess_write
)
894 adev
->d
->postprocess_write(dev
);
896 if (!(dmap
->flags
& DMA_ACTIVE
))
897 if (dmap
->qlen
> 1 || (dmap
->qlen
> 0 && (post
|| dmap
->qlen
>= dmap
->nbufs
- 1)))
898 DMAbuf_launch_output(dev
, dmap
);
902 int DMAbuf_start_dma(int dev
, unsigned long physaddr
, int count
, int dma_mode
)
904 struct audio_operations
*adev
= audio_devs
[dev
];
905 struct dma_buffparms
*dmap
= (dma_mode
== DMA_MODE_WRITE
) ? adev
->dmap_out
: adev
->dmap_in
;
907 if (dmap
->raw_buf
== NULL
) {
908 printk(KERN_ERR
"sound: DMA buffer(1) == NULL\n");
909 printk("Device %d, chn=%s\n", dev
, (dmap
== adev
->dmap_out
) ? "out" : "in");
914 sound_start_dma(dmap
, physaddr
, count
, dma_mode
);
918 static int local_start_dma(struct audio_operations
*adev
, unsigned long physaddr
, int count
, int dma_mode
)
920 struct dma_buffparms
*dmap
= (dma_mode
== DMA_MODE_WRITE
) ? adev
->dmap_out
: adev
->dmap_in
;
922 if (dmap
->raw_buf
== NULL
) {
923 printk(KERN_ERR
"sound: DMA buffer(2) == NULL\n");
924 printk(KERN_ERR
"Device %s, chn=%s\n", adev
->name
, (dmap
== adev
->dmap_out
) ? "out" : "in");
927 if (dmap
->flags
& DMA_NODMA
)
931 sound_start_dma(dmap
, dmap
->raw_buf_phys
, dmap
->bytes_in_use
, dma_mode
| DMA_AUTOINIT
);
932 dmap
->flags
|= DMA_STARTED
;
936 static void finish_output_interrupt(int dev
, struct dma_buffparms
*dmap
)
938 struct audio_operations
*adev
= audio_devs
[dev
];
940 if (dmap
->audio_callback
!= NULL
)
941 dmap
->audio_callback(dev
, dmap
->callback_parm
);
942 wake_up(&adev
->out_sleeper
);
943 wake_up(&adev
->poll_sleeper
);
946 static void do_outputintr(int dev
, int dummy
)
948 struct audio_operations
*adev
= audio_devs
[dev
];
950 struct dma_buffparms
*dmap
= adev
->dmap_out
;
953 if (dmap
->raw_buf
== NULL
) {
954 printk(KERN_ERR
"Sound: Error. Audio interrupt (%d) after freeing buffers.\n", dev
);
957 if (dmap
->mapping_flags
& DMA_MAP_MAPPED
) { /* Virtual memory mapped access */
959 dmap
->qhead
= (dmap
->qhead
+ 1) % dmap
->nbufs
;
960 if (dmap
->qhead
== 0) { /* Wrapped */
961 dmap
->byte_counter
+= dmap
->bytes_in_use
;
962 if (dmap
->byte_counter
>= dmap
->max_byte_counter
) { /* Overflow */
963 long decr
= dmap
->byte_counter
;
964 dmap
->byte_counter
= (dmap
->byte_counter
% dmap
->bytes_in_use
);
965 decr
-= dmap
->byte_counter
;
966 dmap
->user_counter
-= decr
;
969 dmap
->qlen
++; /* Yes increment it (don't decrement) */
970 if (!(adev
->flags
& DMA_AUTOMODE
))
971 dmap
->flags
&= ~DMA_ACTIVE
;
972 dmap
->counts
[dmap
->qhead
] = dmap
->fragment_size
;
973 DMAbuf_launch_output(dev
, dmap
);
974 finish_output_interrupt(dev
, dmap
);
981 this_fragment
= dmap
->qhead
;
982 dmap
->qhead
= (dmap
->qhead
+ 1) % dmap
->nbufs
;
984 if (dmap
->qhead
== 0) { /* Wrapped */
985 dmap
->byte_counter
+= dmap
->bytes_in_use
;
986 if (dmap
->byte_counter
>= dmap
->max_byte_counter
) { /* Overflow */
987 long decr
= dmap
->byte_counter
;
988 dmap
->byte_counter
= (dmap
->byte_counter
% dmap
->bytes_in_use
);
989 decr
-= dmap
->byte_counter
;
990 dmap
->user_counter
-= decr
;
993 if (!(adev
->flags
& DMA_AUTOMODE
))
994 dmap
->flags
&= ~DMA_ACTIVE
;
997 * This is dmap->qlen <= 0 except when closing when
1001 while (dmap
->qlen
<= -dmap
->closing
) {
1002 dmap
->underrun_count
++;
1004 if ((dmap
->flags
& DMA_DIRTY
) && dmap
->applic_profile
!= APF_CPUINTENS
) {
1005 dmap
->flags
&= ~DMA_DIRTY
;
1006 memset(adev
->dmap_out
->raw_buf
, adev
->dmap_out
->neutral_byte
,
1007 adev
->dmap_out
->buffsize
);
1009 dmap
->user_counter
+= dmap
->fragment_size
;
1010 dmap
->qtail
= (dmap
->qtail
+ 1) % dmap
->nbufs
;
1013 DMAbuf_launch_output(dev
, dmap
);
1014 restore_flags(flags
);
1015 finish_output_interrupt(dev
, dmap
);
1018 void DMAbuf_outputintr(int dev
, int notify_only
)
1020 struct audio_operations
*adev
= audio_devs
[dev
];
1021 unsigned long flags
;
1022 struct dma_buffparms
*dmap
= adev
->dmap_out
;
1026 if (!(dmap
->flags
& DMA_NODMA
)) {
1027 int chan
= dmap
->dma
, pos
, n
;
1032 if(!isa_dma_bridge_buggy
)
1033 disable_dma(dmap
->dma
);
1035 pos
= dmap
->bytes_in_use
- get_dma_residue(chan
);
1036 if(!isa_dma_bridge_buggy
)
1037 enable_dma(dmap
->dma
);
1038 release_dma_lock(f
);
1040 pos
= pos
/ dmap
->fragment_size
; /* Actual qhead */
1041 if (pos
< 0 || pos
>= dmap
->nbufs
)
1044 while (dmap
->qhead
!= pos
&& n
++ < dmap
->nbufs
)
1045 do_outputintr(dev
, notify_only
);
1048 do_outputintr(dev
, notify_only
);
1049 restore_flags(flags
);
1052 static void do_inputintr(int dev
)
1054 struct audio_operations
*adev
= audio_devs
[dev
];
1055 struct dma_buffparms
*dmap
= adev
->dmap_in
;
1057 if (dmap
->raw_buf
== NULL
) {
1058 printk(KERN_ERR
"Sound: Fatal error. Audio interrupt after freeing buffers.\n");
1061 if (dmap
->mapping_flags
& DMA_MAP_MAPPED
) {
1062 dmap
->qtail
= (dmap
->qtail
+ 1) % dmap
->nbufs
;
1063 if (dmap
->qtail
== 0) { /* Wrapped */
1064 dmap
->byte_counter
+= dmap
->bytes_in_use
;
1065 if (dmap
->byte_counter
>= dmap
->max_byte_counter
) { /* Overflow */
1066 long decr
= dmap
->byte_counter
;
1067 dmap
->byte_counter
= (dmap
->byte_counter
% dmap
->bytes_in_use
) + dmap
->bytes_in_use
;
1068 decr
-= dmap
->byte_counter
;
1069 dmap
->user_counter
-= decr
;
1074 if (!(adev
->flags
& DMA_AUTOMODE
)) {
1075 if (dmap
->needs_reorg
)
1076 reorganize_buffers(dev
, dmap
, 0);
1077 local_start_dma(adev
, dmap
->raw_buf_phys
, dmap
->bytes_in_use
,DMA_MODE_READ
);
1078 adev
->d
->start_input(dev
, dmap
->raw_buf_phys
+ dmap
->qtail
* dmap
->fragment_size
,
1079 dmap
->fragment_size
, 1);
1080 if (adev
->d
->trigger
)
1081 adev
->d
->trigger(dev
, adev
->enable_bits
* adev
->go
);
1083 dmap
->flags
|= DMA_ACTIVE
;
1084 } else if (dmap
->qlen
>= (dmap
->nbufs
- 1)) {
1085 printk(KERN_WARNING
"Sound: Recording overrun\n");
1086 dmap
->underrun_count
++;
1088 /* Just throw away the oldest fragment but keep the engine running */
1089 dmap
->qhead
= (dmap
->qhead
+ 1) % dmap
->nbufs
;
1090 dmap
->qtail
= (dmap
->qtail
+ 1) % dmap
->nbufs
;
1091 } else if (dmap
->qlen
>= 0 && dmap
->qlen
< dmap
->nbufs
) {
1093 dmap
->qtail
= (dmap
->qtail
+ 1) % dmap
->nbufs
;
1094 if (dmap
->qtail
== 0) { /* Wrapped */
1095 dmap
->byte_counter
+= dmap
->bytes_in_use
;
1096 if (dmap
->byte_counter
>= dmap
->max_byte_counter
) { /* Overflow */
1097 long decr
= dmap
->byte_counter
;
1098 dmap
->byte_counter
= (dmap
->byte_counter
% dmap
->bytes_in_use
) + dmap
->bytes_in_use
;
1099 decr
-= dmap
->byte_counter
;
1100 dmap
->user_counter
-= decr
;
1104 if (!(adev
->flags
& DMA_AUTOMODE
) || (dmap
->flags
& DMA_NODMA
)) {
1105 local_start_dma(adev
, dmap
->raw_buf_phys
, dmap
->bytes_in_use
, DMA_MODE_READ
);
1106 adev
->d
->start_input(dev
, dmap
->raw_buf_phys
+ dmap
->qtail
* dmap
->fragment_size
, dmap
->fragment_size
, 1);
1107 if (adev
->d
->trigger
)
1108 adev
->d
->trigger(dev
,adev
->enable_bits
* adev
->go
);
1110 dmap
->flags
|= DMA_ACTIVE
;
1113 wake_up(&adev
->in_sleeper
);
1114 wake_up(&adev
->poll_sleeper
);
1118 void DMAbuf_inputintr(int dev
)
1120 struct audio_operations
*adev
= audio_devs
[dev
];
1121 struct dma_buffparms
*dmap
= adev
->dmap_in
;
1122 unsigned long flags
;
1127 if (!(dmap
->flags
& DMA_NODMA
)) {
1128 int chan
= dmap
->dma
, pos
, n
;
1132 if(!isa_dma_bridge_buggy
)
1133 disable_dma(dmap
->dma
);
1135 pos
= dmap
->bytes_in_use
- get_dma_residue(chan
);
1136 if(!isa_dma_bridge_buggy
)
1137 enable_dma(dmap
->dma
);
1138 release_dma_lock(f
);
1140 pos
= pos
/ dmap
->fragment_size
; /* Actual qhead */
1141 if (pos
< 0 || pos
>= dmap
->nbufs
)
1145 while (dmap
->qtail
!= pos
&& ++n
< dmap
->nbufs
)
1149 restore_flags(flags
);
1152 int DMAbuf_open_dma(int dev
)
1155 * NOTE! This routine opens only the primary DMA channel (output).
1157 struct audio_operations
*adev
= audio_devs
[dev
];
1160 if ((err
= open_dmap(adev
, OPEN_READWRITE
, adev
->dmap_out
)) < 0)
1162 dma_init_buffers(adev
->dmap_out
);
1163 adev
->dmap_out
->flags
|= DMA_ALLOC_DONE
;
1164 adev
->dmap_out
->fragment_size
= adev
->dmap_out
->buffsize
;
1166 if (adev
->dmap_out
->dma
>= 0) {
1167 unsigned long flags
;
1169 flags
=claim_dma_lock();
1170 clear_dma_ff(adev
->dmap_out
->dma
);
1171 disable_dma(adev
->dmap_out
->dma
);
1172 release_dma_lock(flags
);
1177 void DMAbuf_close_dma(int dev
)
1179 close_dmap(audio_devs
[dev
], audio_devs
[dev
]->dmap_out
);
1182 void DMAbuf_init(int dev
, int dma1
, int dma2
)
1184 struct audio_operations
*adev
= audio_devs
[dev
];
1186 * NOTE! This routine could be called several times.
1189 /* drag in audio_syms.o */
1191 extern char audio_syms_symbol
;
1192 audio_syms_symbol
= 0;
1195 if (adev
&& adev
->dmap_out
== NULL
) {
1196 if (adev
->d
== NULL
)
1197 panic("OSS: audio_devs[%d]->d == NULL\n", dev
);
1199 if (adev
->parent_dev
) { /* Use DMA map of the parent dev */
1200 int parent
= adev
->parent_dev
- 1;
1201 adev
->dmap_out
= audio_devs
[parent
]->dmap_out
;
1202 adev
->dmap_in
= audio_devs
[parent
]->dmap_in
;
1204 adev
->dmap_out
= adev
->dmap_in
= &adev
->dmaps
[0];
1205 adev
->dmap_out
->dma
= dma1
;
1206 if (adev
->flags
& DMA_DUPLEX
) {
1207 adev
->dmap_in
= &adev
->dmaps
[1];
1208 adev
->dmap_in
->dma
= dma2
;
1211 /* Persistent DMA buffers allocated here */
1212 if (sound_dmap_flag
== DMAP_KEEP_ON_CLOSE
) {
1213 if (adev
->dmap_in
->raw_buf
== NULL
)
1214 sound_alloc_dmap(adev
->dmap_in
);
1215 if (adev
->dmap_out
->raw_buf
== NULL
)
1216 sound_alloc_dmap(adev
->dmap_out
);
1221 /* No kernel lock - DMAbuf_activate_recording protected by global cli/sti */
1222 static unsigned int poll_input(struct file
* file
, int dev
, poll_table
*wait
)
1224 struct audio_operations
*adev
= audio_devs
[dev
];
1225 struct dma_buffparms
*dmap
= adev
->dmap_in
;
1227 if (!(adev
->open_mode
& OPEN_READ
))
1229 if (dmap
->mapping_flags
& DMA_MAP_MAPPED
) {
1231 return POLLIN
| POLLRDNORM
;
1234 if (dmap
->dma_mode
!= DMODE_INPUT
) {
1235 if (dmap
->dma_mode
== DMODE_NONE
&&
1236 adev
->enable_bits
& PCM_ENABLE_INPUT
&&
1237 !dmap
->qlen
&& adev
->go
) {
1238 unsigned long flags
;
1242 DMAbuf_activate_recording(dev
, dmap
);
1243 restore_flags(flags
);
1249 return POLLIN
| POLLRDNORM
;
1252 static unsigned int poll_output(struct file
* file
, int dev
, poll_table
*wait
)
1254 struct audio_operations
*adev
= audio_devs
[dev
];
1255 struct dma_buffparms
*dmap
= adev
->dmap_out
;
1257 if (!(adev
->open_mode
& OPEN_WRITE
))
1259 if (dmap
->mapping_flags
& DMA_MAP_MAPPED
) {
1261 return POLLOUT
| POLLWRNORM
;
1264 if (dmap
->dma_mode
== DMODE_INPUT
)
1266 if (dmap
->dma_mode
== DMODE_NONE
)
1267 return POLLOUT
| POLLWRNORM
;
1268 if (!DMAbuf_space_in_queue(dev
))
1270 return POLLOUT
| POLLWRNORM
;
1273 unsigned int DMAbuf_poll(struct file
* file
, int dev
, poll_table
*wait
)
1275 struct audio_operations
*adev
= audio_devs
[dev
];
1276 poll_wait(file
, &adev
->poll_sleeper
, wait
);
1277 return poll_input(file
, dev
, wait
) | poll_output(file
, dev
, wait
);
1280 void DMAbuf_deinit(int dev
)
1282 struct audio_operations
*adev
= audio_devs
[dev
];
1283 /* This routine is called when driver is being unloaded */
1287 /* Persistent DMA buffers deallocated here */
1288 if (sound_dmap_flag
== DMAP_KEEP_ON_CLOSE
) {
1289 sound_free_dmap(adev
->dmap_out
);
1290 if (adev
->flags
& DMA_DUPLEX
)
1291 sound_free_dmap(adev
->dmap_in
);