[alsa-devel] Allocating DMA buffer for non-PCM
Takashi Iwai
tiwai at suse.de
Fri Feb 15 07:22:25 CET 2013
At Thu, 14 Feb 2013 18:26:53 +0100,
Adrian Knoth wrote:
>
> On 02/14/2013 06:14 PM, Takashi Iwai wrote:
>
> >> /* allocate level buffer */
> >> err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG,
> >> snd_dma_pci_data(hdspm->pci),
> >> MADIFX_LEVEL_BUFFER_SIZE, &hdspm->dmaLevelBuffer);
> >> if (err < 0) {
> >> /* error */ [..]
> >> }
> >>
> >> hdspm->level_buffer = snd_sgbuf_get_ptr(&(hdspm->dmaLevelBuffer), 0);
> >
> > hdspm->level_buffer = (u32*)hdspm.dmaLevelBuffer.area;
>
> Looks good, TNX.
>
> >> This used to work on my development machine (kernel 3.6.x), but now a
> >> kernel 3.2.0 user reports a NULL pointer dereference of
> >> hdspm->level_buffer, so apparently, snd_sgbuf_get_ptr() returned NULL
> >> for him.
> > What's level_buffer?
>
> The card does hardware metering and stores RMS/peak values in a DMA
> buffer. I want to later pass this to userspace to show signal levels,
> either via memcpy()ing the DMA buffer or maybe via mmap(). But since I
> no longer have access to such a card, work on this is on halt atm.
>
> > Is a SG-buffer for the audio stream?
>
> The audio buffers use
>
> snd_pcm_lib_preallocate_pages_for_all(pcm,
> SNDRV_DMA_TYPE_DEV_SG,
> snd_dma_pci_data(hdspm->pci),
>
>
> so they're SG, yes.
But isn't the level meter buffer a single page? If the buffer is only
for peak meters, it can't be that big even for multi-channel cards.
If so, SNDRV_DMA_TYPE_DEV_SG is utterly nonsense. Otherwise, if it's
a SG buffer, you'll have to some code to set up TLB in anyway.
Takashi
More information about the Alsa-devel
mailing list