[alsa-devel] mapping externally allocated Scatter Gather DMA buffers

Manu Abraham abraham.manu at gmail.com
Wed Oct 27 07:03:08 CEST 2010

On Tue, Oct 26, 2010 at 12:54 PM, Jaroslav Kysela <perex at perex.cz> wrote:

> On Tue, 26 Oct 2010, Manu Abraham wrote:
>  Hi,
>> I have been wondering how to interface a Scatter Gather region as a DMA
>> buffer for an Audio Grabbing device.
>> The device is a NOC type device, similar to a SOC, the audio grabber is a
>> part of it, for realizing the audio
>> capabilities on the device.
>> The hardware DMA is mostly a Scatter Gather based engine, and it can be
>> described thus, briefly.
> Use snd_pcm_lib_preallocate_pages_for_all() - type SNDRV_DMA_TYPE_DEV_SG
> and snd_pcm_sgbuf_* routines. Check hda_intel.c source for more details

Thanks. I did take a deeper look at it, from a few angles. However still I
am not very clear on some aspects, especially due to the multiple SG buffers
involved. Let me try to make it a bit more clear ..

1. I have exactly 1 stream to be handled/grabbed

2. This single stream consists of 8 SG page tables (buffers), each buffer
can contain multiple frames, but initially to keep code complexity down, I
will have only a single frame per buffer.

3. The Pages (PTE's) in each SG buffer are virtually contiguous, ie, say
buf_pages are vmalloc'd. But one buffer is discontiguous from the other.

4. On the 1st interrupt, likely I can read from the buffer1, on the next
interrupt from buffer2 and so on in a round robin fashion.

5. The SG buffers are allocated much earlier along with hardware
initialization, So these SG buffers do exist, and hence cannot be allocated

In such a circumstance, I wonder how I can populate runtime->dma_area.
Initially I thought that I would simply map the dmabuffer as it is, but
since they are 8 in number and discontiguous between the buffers, just
mapping the buffers alone wouldn't help. After a bit of thoughts, I came up
with a following thought.

A virtual map is created with 8 of these buffers and the base address of
this map is provided to runtime->dma_area

I wonder, whether such a concept will work ?

Best Regards,

More information about the Alsa-devel mailing list