Userspace DMA

From: Andrew Miklas
Date: Sun Nov 16 2003 - 18:44:03 EST


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
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/