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

Reply via email to