Subject: Re: how to allocate physically contiguous memory?
To: Andrew Gallatin <gallatin@cs.duke.edu>
From: Jason Thorpe <thorpej@nas.nasa.gov>
List: port-alpha
Date: 05/07/1997 16:59:50
On Wed, 7 May 1997 19:59:27 -0400 (EDT) 
 Andrew Gallatin <gallatin@cs.duke.edu> wrote:

 > I'm porting a device driver to NetBSD (and starting with NetBSD/alpha)
 > I would like to be able to allocate a large chunk (512k or so) of
 > physically contiguous memory in the driver. 
 > 
 > Other systems (OSF/1, BSDI) have something like contig_malloc() or
 > vm_page_alloc_contig() for this purpose.  Is there a way to do this in
 > NetBSD/alpha?

I have a sneaking suspicion I know what you want this for :-)

I'm working on the bus dma subsystem, and need this as part of it.  I
will send you, out of band, the diffs I have that implment more-or-less
what you want (the memory that is allocated is not mapped, and that's
a feature :-)  (I'm not ready to distribute them publicly yet.)

Eventually, you will call bus_dmamem_alloc() with the appropriate
constraints, and then bus_dmamem_map() to map it into kva space
(or allow the driver's mmap entry point to call bus_dmamem_mmap() to
map it into user space :-)

...but for now, you'll be calling vm_page_alloc_memory() and then
a loop around pmap_enter() (note, I don't call it contig anything,
since the API allows the caller to specifiy a maximum segment
count...)

Jason R. Thorpe                                       thorpej@nas.nasa.gov
NASA Ames Research Center                               Home: 408.866.1912
NAS: M/S 258-6                                          Work: 415.604.0935
Moffett Field, CA 94035                                Pager: 415.428.6939