At Mon, 06 Oct 2003 19:19:08 +0200 (CEST),
[EMAIL PROTECTED] wrote:
> 
> Thanx that cleared a lot.
> 
> I thought so, 
> 
> since I want to allocate once and then leave it, (because I dont want an exlusiv
> use of capture and playback ...)
> 
> Please three more questions:
> 
> 1) I found also the function:
> 
>  snd_malloc_sgbuf_pages(hdspm->pci, wanted, dmab)
> 
> Can I allocate memory with these before initializing a substream and
> write it to hardware and then set all the buffer data in the 
> substream:
> 
>   runtime->dma_area = hdspm->p_dmab.area;
>   runtime->dma_addr =  hdspm->p_dmab.addr;
>   runtime->dma_private =  hdspm->p_dmab.private_data;
>   runtime->dma_bytes = hdspm->p_dmab.bytes;
> 
>   Do I miss something ?

the above is doable, but the preallocation mechanism is exactly what
you want here.  i'd recommend to simply pre-allocate the buffers and
use snd_pcm_lib_malloc_pages() and snd_pcm_lib_free_pages() in
hw_params and hw_free callbacks.

> 
> 2) If SG_BUF makes continous virtual buffer
> 
>    why there is a 
> 
>      .pages=snd_pcm_sgbuf_ops_page 
       ^^^^^^
       .page  (without 's')
>  
>    function needed ?
>    what is the purpose of this ?  

this is mandatory to handle nopage callback in the mmap.
check pcm_native.c.

> 3) Just for my understanding:
> 
> SG allocates scattered physical memory and maps it to
> continous virtual:
> 
> when I allocate via 
> 
>  snd_malloc_sgbuf_pages(hdspm->pci, wanted, dmab)
> 
> I test the memory so get a syslog:
> 
> hdspm.c:2788: Preallocated 8192 kBytes
> hdspm.c:2831: dmab(d27b7a84): area=e2db1000, addr=0, bytes = 0 (wanted 4194304),
> private=ce4a25c0
> 
> hdspm.c:2834: area Start: e2db1000 End:e31b0ffc diff=4194300
> hdspm.c:2839: phys Start: b65b000 End:f6acffc diff=-67444732
> hdspm.c:2845: bus_to_virt Start: cb65b000 End:cf6acffc diff=-67444732
> 
> (src of this see at  the end)
> 
> 
> Which tells me 
> - virt is ok 4194304 
> - phys is scattered so also any diff number is ok.
> - but bus_to_virt of physical adress should make a continous, but it doesnt - Why ?

you cannot calculate the virtual address from the physical address
uniquely.  a physical page can be mapped to different multiple virtual
pages.  (the ALSA's sg-buffer handler uses the vmap() for the virtual
areas, btw.)


Takashi


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to