On Thu, May 17, 2012 at 06:32:19AM -0600, Rob Clark wrote: > On Thu, May 17, 2012 at 4:31 AM, Dave Airlie <airlied at gmail.com> wrote: > > From: Dave Airlie <airlied at redhat.com> > > > > The main requirement I have for this interface is for scanning out > > using the USB gpu devices. Since these devices have to read the > > framebuffer on updates and linearly compress it, using kmaps > > is a major overhead for every update. > > > > v2: fix warn issues pointed out by Sylwester Nawrocki. > > > > Signed-off-by: Dave Airlie <airlied at redhat.com> > > --- > > ?drivers/base/dma-buf.c ?| ? 34 ++++++++++++++++++++++++++++++++++ > > ?include/linux/dma-buf.h | ? 14 ++++++++++++++ > > ?2 files changed, 48 insertions(+), 0 deletions(-) > > > > diff --git a/drivers/base/dma-buf.c b/drivers/base/dma-buf.c > > index 07cbbc6..750f92c 100644 > > --- a/drivers/base/dma-buf.c > > +++ b/drivers/base/dma-buf.c > > @@ -406,3 +406,37 @@ void dma_buf_kunmap(struct dma_buf *dmabuf, unsigned > > long page_num, > > ? ? ? ? ? ? ? ?dmabuf->ops->kunmap(dmabuf, page_num, vaddr); > > ?} > > ?EXPORT_SYMBOL_GPL(dma_buf_kunmap); > > + > > +/** > > + * dma_buf_vmap - Create virtual mapping for the buffer object into kernel > > address space. The same restrictions as for vmap and friends apply. > > + * @dma_buf: ? [in] ? ?buffer to vmap > > + * > > + * This call may fail due to lack of virtual mapping address space. > > + * These calls are optional in drivers. The intended use for them > > + * is for mapping objects linear in kernel space for high use objects. > > + * Please attempt to use kmap/kunmap before thinking about these > > interfaces. > > + */ > > +void *dma_buf_vmap(struct dma_buf *dmabuf) > > +{ > > + ? ? ? if (WARN_ON(!dmabuf)) > > + ? ? ? ? ? ? ? return NULL; > > + > > + ? ? ? if (dmabuf->ops->vmap) > > + ? ? ? ? ? ? ? return dmabuf->ops->vmap(dmabuf); > > + ? ? ? return NULL; > > +} > > +EXPORT_SYMBOL(dma_buf_vmap); > > + > > +/** > > + * dma_buf_vunmap - Unmap a vmap obtained by dma_buf_vmap. > > + * @dma_buf: ? [in] ? ?buffer to vmap > > + */ > > +void dma_buf_vunmap(struct dma_buf *dmabuf, void *vaddr) > > +{ > > + ? ? ? if (WARN_ON(!dmabuf)) > > + ? ? ? ? ? ? ? return; > > + > > + ? ? ? if (dmabuf->ops->vunmap) > > + ? ? ? ? ? ? ? dmabuf->ops->vunmap(dmabuf, vaddr); > > +} > > +EXPORT_SYMBOL(dma_buf_vunmap); > > diff --git a/include/linux/dma-buf.h b/include/linux/dma-buf.h > > index 3efbfc2..b92b6de 100644 > > --- a/include/linux/dma-buf.h > > +++ b/include/linux/dma-buf.h > > @@ -92,6 +92,9 @@ struct dma_buf_ops { > > ? ? ? ?void (*kunmap_atomic)(struct dma_buf *, unsigned long, void *); > > ? ? ? ?void *(*kmap)(struct dma_buf *, unsigned long); > > ? ? ? ?void (*kunmap)(struct dma_buf *, unsigned long, void *); > > + > > + ? ? ? void *(*vmap)(struct dma_buf *); > > + ? ? ? void (*vunmap)(struct dma_buf *, void *vaddr); > > ?}; > > > > ?/** > > @@ -167,6 +170,9 @@ void *dma_buf_kmap_atomic(struct dma_buf *, unsigned > > long); > > ?void dma_buf_kunmap_atomic(struct dma_buf *, unsigned long, void *); > > ?void *dma_buf_kmap(struct dma_buf *, unsigned long); > > ?void dma_buf_kunmap(struct dma_buf *, unsigned long, void *); > > + > > +void *dma_buf_vmap(struct dma_buf *); > > +void dma_buf_vunmap(struct dma_buf *, void *vaddr); > > ?#else > > > > ?static inline struct dma_buf_attachment *dma_buf_attach(struct dma_buf > > *dmabuf, > > @@ -248,6 +254,14 @@ static inline void dma_buf_kunmap(struct dma_buf > > *dmabuf, > > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?unsigned long pnum, void *vaddr) > > ?{ > > ?} > > + > > +static inline void *dma_buf_vmap(struct dma_buf *) > > +{ > > +} > > + > > +static inline void dma_buf_vunmap(struct dma_buf *, void *vaddr); > > +{ > > +} > > I think these two will cause compile issues for > !CONFIG_DMA_SHARED_BUFFER case due to no parameter name for first arg.
And because of ";" between ) and { :) Marcin