2003-11-16 23:42:37

by Andrew Miklas

[permalink] [raw]
Subject: Userspace DMA

Hi,


Is there an accepted way of doing userspace DMA with Linux?

I've gone over a large number of posts, and all seem to recommend something
different, and each method seems to involve certain drawbacks.

What I'd like to do is allow a process to be able to do operations like
pci_alloc_consistent and pci_free_consistent. I'm trying to do this to allow
a driver running under the Bochs emulator to interact with its (non-emulated)
hardware using DMA.

I was originally going to do a pci_alloc_consistent and then mmap the space
into the emulator's process. The process would then get the physical address
of the memory through an ioctl, or I would leave the physical address at the
start of the allocated buffer for the process to later retrieve.

However, it appears that remap_page_range won't work with addresses obtained
from pci_alloc_consistent. I've also read that using the nopage callback can
cause issues if the range I need to allocate is greater than one page.

Most of the approaches I've found seem to require that the hardware be capable
of scatter-gather DMA (video4linux and bttv, for ex.). I've also seen one
solution that had the driver do a pci_alloc_consistent on a certain ioctl,
and then return the physical address of the buffer. The process would then
mmap /dev/mem to access the buffer. However, someone warned that this method
could have coherency issues.

Is there some other method that I should be looking at to accomplish this?



Thanks,


Andrew


2003-11-17 04:34:20

by Peter Chubb

[permalink] [raw]
Subject: Re: Userspace DMA

>>>>> "Andrew" == Andrew Miklas <[email protected]> writes:

Andrew> Hi, Is there an accepted way of doing userspace DMA with
Andrew> Linux?

I'm currently working on a framework for user-space device drivers,
that allow suitably privileged user-space programs to set up and tear
down dma regions -- essentially exposing pci_alloc_consistent and
pci_{un}map_sg to userspace -- and also to handle interrupts in user
space. The framework is implemented as a pair of filesystems, one for
interrupts (actually, I hijack /proc/interrupts/*) and one for
mappings --- mainly to allow easy cleanup when the userspace program
dies.

It's not yet in a fit state to release, but contact me offline if
you'd like a copy.

--
Dr Peter Chubb http://www.gelato.unsw.edu.au peterc AT gelato.unsw.edu.au
The technical we do immediately, the political takes *forever*


2003-11-18 15:09:26

by Alex Bennee

[permalink] [raw]
Subject: Re: Userspace DMA

Now my mailer is fixed :-)

-----Forwarded Message-----
> From: Alex Bennee <[email protected]>
> To: Peter Chubb <[email protected]>
> Cc: [email protected], Linux Mailing List <[email protected]>
> Subject: Re: Userspace DMA
> Date: Mon, 17 Nov 2003 10:37:40 +0000
>
> On Mon, 2003-11-17 at 04:34, Peter Chubb wrote:
> > >>>>> "Andrew" == Andrew Miklas <[email protected]> writes:
> > Andrew> Hi, Is there an accepted way of doing userspace DMA with
> > Andrew> Linux?
> >
> > I'm currently working on a framework for user-space device drivers,
> > that allow suitably privileged user-space programs to set up and tear
> > down dma regions
>
> Hi,
>
> I've also been doing some work on allowing user processes to access the
> DMA hardware facilities of the processor platform. This is not actually
> aimed at pci stuff but used for other devices on the embedded SH board I
> use. It works using a packetised writev interface to send DMA requests
> to kernel space where the mapping of memory is done. It really works
> best with scatter gather dma as user-pages can be spread out all over
> the place.
>
> Whether there is any overlap between my approach, what your doing and
> what Andrew is looking for I have no idea :-) I'm certainly interested
> in seeing any code if only for ideas.
>
> You can find an alpha (but working on my system) copy of the code at:
>
> http://www.bennee.com/~alex/software/kernel/index.php
--
Alex, homepage: http://www.bennee.com/~alex/
I used to get high on life but lately I've built up a resistance.