From: Leon Woestenberg on
Hello all,

can I use the UIO framework for the following?

The userspace portion of the driver allocates memory in user-space
using malloc() - usually resulting in a scatter pages in physical
memory.
The UIO kernel portion of the driver maps those using pci_map_sg().

Is this possible, or does the UIO framework assume memory for DMA is
allocated in kernel space?


Thanks,
--
Leon
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Hans J. Koch on
On Sat, Aug 07, 2010 at 08:38:30PM +0200, Leon Woestenberg wrote:
> Hello all,
>
> can I use the UIO framework for the following?
>
> The userspace portion of the driver allocates memory in user-space
> using malloc() - usually resulting in a scatter pages in physical
> memory.
> The UIO kernel portion of the driver maps those using pci_map_sg().
>
> Is this possible, or does the UIO framework assume memory for DMA is
> allocated in kernel space?

You would have to write your own mmap() function and and set the pointer
to it in struct uio_info->mmap. Have a look at uio_mmap() in
drivers/uio/uio.c to see when your function will be called, and what is
checked before that call.

If that works, we might invent a new UIO_MEM_* type, and move your function
over to the UIO core, if this is interesting for other people.

Anyway, sooner or later we should have a generic way of handling DMA in
UIO. The topic comes up every few month, but nobody came up with an
acceptable solution yet. It should probably be a separate uio_dma device,
e.g. for a /dev/uio0 you'll get a /dev/uio_dma0 if the driver sets a flag
indicating it needs DMA support. This new uio_dma device should then have
an API (to be defined, without ioctl if possible) that provides the
necessary functionality. But that's just a thought ATM. Ideas/patches are
welcome.

Thanks,
Hans

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Hans J. Koch on
On Mon, Aug 09, 2010 at 01:11:56PM +0200, Hans J. Koch wrote:
> On Sat, Aug 07, 2010 at 08:38:30PM +0200, Leon Woestenberg wrote:
> > Hello all,
> >
> > can I use the UIO framework for the following?
> >
> > The userspace portion of the driver allocates memory in user-space
> > using malloc() - usually resulting in a scatter pages in physical
> > memory.
> > The UIO kernel portion of the driver maps those using pci_map_sg().
> >
> > Is this possible, or does the UIO framework assume memory for DMA is
> > allocated in kernel space?
>
> You would have to write your own mmap() function and and set the pointer
> to it in struct uio_info->mmap. Have a look at uio_mmap() in

A few more thoughts about that: The UIO core currently doesn't support
dynamically allocated memory. That means, even if you manage to mmap your
memory allocated in userspace, it won't show up in sysfs. ATM, all UIO
supports is memory allocated at device creation time in kernel space.

So, what your trying to do is something that could probably work. The
uio_info->mmap pointer was made for unusual mappings. But it still causes
me some headaches. I'm not sure if this can be considered a clean solution.
An extension that makes UIO deal properly with dynamically allocated (DMA-)
memory would certainly be preferable.

Hans

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Leon Woestenberg on
Hello Hans,

On Tue, Aug 10, 2010 at 2:12 AM, Hans J. Koch <hjk(a)linutronix.de> wrote:
> On Mon, Aug 09, 2010 at 01:11:56PM +0200, Hans J. Koch wrote:
>> On Sat, Aug 07, 2010 at 08:38:30PM +0200, Leon Woestenberg wrote:
>> > Hello all,
>> >
>> > can I use the UIO framework for the following?
>> >
>> > The userspace portion of the driver allocates memory in user-space
>> > using malloc() - usually resulting in a scatter pages in physical
>> > memory.
>> > The UIO kernel portion of the driver maps those using pci_map_sg().
>> >
>> > Is this possible, or does the UIO framework assume memory for DMA is
>> > allocated in kernel space?
>>
>> You would have to write your own mmap() function and and set the pointer
>> to it in struct uio_info->mmap. Have a look at uio_mmap() in
>
Why would I need to mmap() the user space memory into kernel space?

Looking from a traditional device driver perspective the kernel space
only needs to know the virtual address and the length of the buffer,
and can then make up a scatter list.

After DMA finished, it needs to synchronize caches.

In fact, from my simplistic view, the kernel provides a few internal
house keeping tools, and we need to export this functionality into UIO
API's.

SGDMA to from user memory would be one of the uses.

In fact, when UIO started, I also expected the kernel buffers to be
user application managed, like the driver steering code.

> uio_info->mmap pointer was made for unusual mappings. But it still causes
> me some headaches. I'm not sure if this can be considered a clean solution.
> An extension that makes UIO deal properly with dynamically allocated (DMA-)
> memory would certainly be preferable.
>
Thanks for thinking along.

I am currently refraining from using UIO, as I don't like the head
ache feature :-)

Regards,
--
Leon
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
From: Hans J. Koch on
On Wed, Aug 11, 2010 at 08:42:35PM +0200, Leon Woestenberg wrote:
[...]
>
> I am currently refraining from using UIO, as I don't like the head
> ache feature :-)

Well, if you need feature X, capability Y, or usecase Z, feel free to send
patches.

I (and several of my colleagues) wrote quite a lot of UIO drivers for
various chips in the last 4 years. I never had a device that needed DMA
on my desk yet, otherwise support for it would be in mainline now.

UIO was mainly invented to prevent people from writing large character
device drivers that will never make it to mainline, and then having to
maintain them off-tree. It is not a general purpose driver interface
but a small framework to handle a special class of hardware that doesn't
fit into any other subsystem. If you've got such hardware, and you need
a certain feature, think about how it can be done, and let us know.

Thanks,
Hans

>
> Regards,
> --
> Leon
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo(a)vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/