Hi Tiago, Thanks for the patch!
On 12 August 2015 at 02:29, Tiago Vignatti <tiago.vignatti at intel.com> wrote: > From: Daniel Vetter <daniel.vetter at ffwll.ch> > > FIXME: Update kerneldoc for begin/end to make it clear that those are > for mmap too. I think if we're going to add this patch upstream, atleast the FIXMEs should be fixed. > > Open: Do we need a special indication that the begin/end is from > userspace mmap and not from kernel mmap? > > There's also the question already about kernel internal users - vmap > and kmap interfaces are much different ... We might need to add a > mapping enum to the begin/end dma-buf functions. Also, this looks like another thing that could be added right now while we're adding this change. > > v2 (Tiago): Fix header file type names (u64 -> __u64) > > Signed-off-by: Daniel Vetter <daniel.vetter at intel.com> > Signed-off-by: Tiago Vignatti <tiago.vignatti at intel.com> > --- > drivers/dma-buf/dma-buf.c | 47 > ++++++++++++++++++++++++++++++++++++++++++++ > include/uapi/linux/dma-buf.h | 39 ++++++++++++++++++++++++++++++++++++ > 2 files changed, 86 insertions(+) > create mode 100644 include/uapi/linux/dma-buf.h > > diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c > index 155c146..4820d61 100644 > --- a/drivers/dma-buf/dma-buf.c > +++ b/drivers/dma-buf/dma-buf.c > @@ -34,6 +34,8 @@ > #include <linux/poll.h> > #include <linux/reservation.h> > > +#include <uapi/linux/dma-buf.h> > + > static inline int is_dma_buf_file(struct file *); > > struct dma_buf_list { > @@ -251,11 +253,56 @@ out: > return events; > } > > +static long dma_buf_ioctl(struct file *file, > + unsigned int cmd, unsigned long arg) > +{ > + struct dma_buf *dmabuf; > + struct dma_buf_sync sync; > + enum dma_data_direction direction; > + > + dmabuf = file->private_data; > + > + if (!is_dma_buf_file(file)) > + return -EINVAL; > + > + switch (cmd) { > + case DMA_BUF_IOCTL_SYNC: > + if (copy_from_user(&sync, (void __user *) arg, sizeof(sync))) > + return -EFAULT; > + > + if (sync.flags & DMA_BUF_SYNC_RW) > + direction = DMA_BIDIRECTIONAL; > + else if (sync.flags & DMA_BUF_SYNC_READ) > + direction = DMA_FROM_DEVICE; > + else if (sync.flags & DMA_BUF_SYNC_WRITE) > + direction = DMA_TO_DEVICE; > + else > + return -EINVAL; > + > + if (sync.flags & ~DMA_BUF_SYNC_VALID_FLAGS_MASK) > + return -EINVAL; > + > + /* FIXME: Check for overflows in start/length. */ > + Even this for fixing in this patch itself. > + if (sync.flags & DMA_BUF_SYNC_END) > + dma_buf_end_cpu_access(dmabuf, sync.start, > + sync.length, direction); > + else > + dma_buf_begin_cpu_access(dmabuf, sync.start, > + sync.length, direction); > + > + return 0; > + default: > + return -ENOTTY; > + } > +} > + > static const struct file_operations dma_buf_fops = { > .release = dma_buf_release, > .mmap = dma_buf_mmap_internal, > .llseek = dma_buf_llseek, > .poll = dma_buf_poll, > + .unlocked_ioctl = dma_buf_ioctl, > }; > > /* > diff --git a/include/uapi/linux/dma-buf.h b/include/uapi/linux/dma-buf.h > new file mode 100644 > index 0000000..e5327df > --- /dev/null > +++ b/include/uapi/linux/dma-buf.h > @@ -0,0 +1,39 @@ > +/* > + * Framework for buffer objects that can be shared across devices/subsystems. > + * > + * Copyright(C) 2015 Intel Ltd > + * > + * This program is free software; you can redistribute it and/or modify it > + * under the terms of the GNU General Public License version 2 as published > by > + * the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, but > WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > + * more details. > + * > + * You should have received a copy of the GNU General Public License along > with > + * this program. If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#ifndef _DMA_BUF_UAPI_H_ > +#define _DMA_BUF_UAPI_H_ > + > +struct dma_buf_sync { > + __u64 flags; > + __u64 start; > + __u64 length; > +}; > + > +#define DMA_BUF_SYNC_READ (1 << 0) > +#define DMA_BUF_SYNC_WRITE (2 << 0) > +#define DMA_BUF_SYNC_RW (3 << 0) > +#define DMA_BUF_SYNC_START (0 << 2) > +#define DMA_BUF_SYNC_END (1 << 2) > +#define DMA_BUF_SYNC_VALID_FLAGS_MASK \ > + (DMA_BUF_SYNC_RW | DMA_BUF_SYNC_END) > + > +#define DMA_BUF_BASE 'b' > +#define DMA_BUF_IOCTL_SYNC _IOWR(DMA_BUF_BASE, 0, struct dma_buf_sync) > + > +#endif > -- > 2.1.0 > > _______________________________________________ > dri-devel mailing list > dri-devel at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel -- Thanks and regards, Sumit Semwal.