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 ?

2) If SG_BUF makes continous virtual buffer

   why there is a 

     .pages=snd_pcm_sgbuf_ops_page 
 
   function needed ?
   what is the purpose of this ?  
 
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 ?

Thanx a lot.

mfg winfried

Anhang:

(test sg_memory)

  ...

  if((buf = snd_malloc_sgbuf_pages(hdspm->pci, wanted, dmab)) == NULL){
    snd_printd("playback SG-buffer allocating error\n");
    return -EINVAL;
  }

  snd_printd("area Start: %lx End:%lx diff=%ld\n",
             dmab->area,dmab->area+wanted-4,wanted-4);
  snd_printd("phys Start: %lx End:%lx diff=%ld\n",
             snd_pcm_sgbuf_get_addr(sgbuf,0),
             snd_pcm_sgbuf_get_addr(sgbuf,wanted-4),
             snd_pcm_sgbuf_get_addr(sgbuf,0)
             - snd_pcm_sgbuf_get_addr(sgbuf,wanted-4));

  snd_printd("bus_to_virt Start: %lx End:%lx diff=%ld\n",
             bus_to_virt(snd_pcm_sgbuf_get_addr(sgbuf,0)),
             bus_to_virt(snd_pcm_sgbuf_get_addr(sgbuf,wanted-4)),
             bus_to_virt(snd_pcm_sgbuf_get_addr(sgbuf,0))
             - bus_to_virt(snd_pcm_sgbuf_get_addr(sgbuf,wanted-4)));
  ....

> At Sun, 5 Oct 2003 21:01:58 +0200 (CEST),
> Jaroslav wrote:
> > 
> > On Sat, 4 Oct 2003, Winfried Ritsch wrote:
> > 
> > >
> > > Hello !
> > >
> > > (A question from an newbie-developer to make it perfect ;-)
> > >
> > > I am writing an ALSA-lowleveldriver for the RME HDSP-MADI card.
> > > (which have 64Audion in and out and an 128in64(= 8192Fader) Mixer
> > > see http://www.rme-audio.de/hdsp/hdspmadi.htm ) Coding is quite
> > > complete but I have trouble with the memory management.
> > >
> > > The Card uses ScatterGather Buffer, each channel 64kB and this
> > > has to be asigned (to be safe) before activation, so I want
> > > to allocate SGbuffer (64+64)*64*1024=8388608 in 4k-blocks.
> > >
> > > I do a
> > >
> > > snd_pcm_lib_preallocate_pci_pages_for_all(hdspm->pci,
> pcm,8388608l,8388608l)
> > >
> > > after making the pcm_device.
> > >
> > > Here the questions:
> > >
> > > 1) How can I get the sgbuf pointer ?
> > >
> > > ... since in the streams runtime is not set and therefore (besides
> the
> > > Documentation says is (snd_pcm_sgbuf_t*)substream->dma_private which
> I
> > > couldnt find)
> > >
> > >  sgbuf = (snd_pcm_sgbuf_t*)substream->runtime->dma_private;
> > >
> > > is not assigned.
> > >
> > > but when I activate the card (for MIDI for example) there must be
> > > memory asigned und I think doing it in hw_params is to late.
> > 
> > Note that ALSA has SG routines only for PCM streams and it's lifetime
> is
> > limited only for stream lifetime.
> 
> well, this is no longer true.  the sg-buffer allocation is handled
> generally in snd-page-alloc module (although only PCM handlers use it
> in practice :)
> and we have preallocation for sg PCM buffers now, too.
> 
> >  If hardware needs to allocate a big
> > buffer at the initialization phase, you have to do it yourself.
> 
> the SG buffers should be pre-allocated via
> snd_pcm_lib_preallocate_sg_pages() and _for_all() functions
> instead of snd_pcm_lib_preallocate_pci_pages() and co.
> in addition, in hw_params() callback, you'll need to map the sg-pages
> like below:
> 
>       struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream);
>       ...
>       for_all_pages { /* rewrite as you like */
>               /* get the physical address by snd_pcm_sgbuf_get_addr(). */
>               /* set this address on the hardware's address table */
>               do_my_mapping(snd_pcm_sgbuf_get_addr(sgbuf, offset));
>       }
> 
> check via82xx.c as an example (or emu10k1 driver as a more complex
> case).
> 
> you can find a brief information in my tutorial ("Non-Contiguous
> Buffers" section in "Buffer and Memory Management").
> 
> 
> 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
> 


-------------------------------------------------------
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