All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ricky Liang <jcliang@chromium.org>
To: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Cc: linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org,
	Pawel Osciak <posciak@chromium.org>,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Kyungmin Park <kyungmin.park@samsung.com>,
	Hans Verkuil <hverkuil@xs4all.nl>,
	Sumit Semwal <sumit.semwal@linaro.org>,
	Rob Clark <robdclark@gmail.com>,
	Daniel Vetter <daniel.vetter@ffwll.ch>,
	Laura Abbott <labbott@redhat.com>,
	Sakari Ailus <sakari.ailus@linux.intel.com>
Subject: Re: [RFC, v2, 10/11] vb2: dma-contig: Let drivers decide DMA attrs of MMAP and USERPTR bufs
Date: Mon, 26 Dec 2016 15:58:07 +0800	[thread overview]
Message-ID: <CAAJzSMep+qccM+UV+T-wgpqTNPYD3yHWqpjJbhH5v4NLxjqZ=w@mail.gmail.com> (raw)
In-Reply-To: <20161216012425.11179-11-laurent.pinchart+renesas@ideasonboard.com>

Hi Laurent,

On Fri, Dec 16, 2016 at 9:24 AM, Laurent Pinchart
<laurent.pinchart+renesas@ideasonboard.com> wrote:
> From: Sakari Ailus <sakari.ailus@linux.intel.com>
>
> The desirable DMA attributes are not generic for all devices using
> Videobuf2 contiguous DMA ops. Let the drivers decide.
>
> This change also results in MMAP buffers always having an sg_table
> (dma_sgt field).
>
> Also arrange the header files alphabetically.
>
> As a result, also the DMA-BUF exporter must provide ops for synchronising
> the cache. This adds begin_cpu_access and end_cpu_access ops to
> vb2_dc_dmabuf_ops.
>
> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
> ---
>  drivers/media/v4l2-core/videobuf2-dma-contig.c | 66 ++++++++++++++++++++++----
>  1 file changed, 56 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/media/v4l2-core/videobuf2-dma-contig.c b/drivers/media/v4l2-core/videobuf2-dma-contig.c
> index d503647ea522..a0e88ad93f07 100644
> --- a/drivers/media/v4l2-core/videobuf2-dma-contig.c
> +++ b/drivers/media/v4l2-core/videobuf2-dma-contig.c
> @@ -11,11 +11,11 @@
>   */
>
>  #include <linux/dma-buf.h>
> +#include <linux/dma-mapping.h>
>  #include <linux/module.h>
>  #include <linux/scatterlist.h>
>  #include <linux/sched.h>
>  #include <linux/slab.h>
> -#include <linux/dma-mapping.h>
>
>  #include <media/videobuf2-v4l2.h>
>  #include <media/videobuf2-dma-contig.h>
> @@ -115,8 +115,11 @@ static void vb2_dc_prepare(void *buf_priv)
>         struct vb2_dc_buf *buf = buf_priv;
>         struct sg_table *sgt = buf->dma_sgt;
>
> -       /* DMABUF exporter will flush the cache for us */
> -       if (!buf->vec)
> +       /*
> +        * DMABUF exporter will flush the cache for us; only USERPTR
> +        * and MMAP buffers with non-coherent memory will be flushed.
> +        */
> +       if (!(buf->attrs & DMA_ATTR_NON_CONSISTENT))

Should here be "if (!buf->vec || !(buf->attrs & DMA_ATTR_NON_CONSISTENT))" ?

>                 return;
>
>         dma_sync_sg_for_device(buf->dev, sgt->sgl, sgt->orig_nents,
> @@ -128,8 +131,11 @@ static void vb2_dc_finish(void *buf_priv)
>         struct vb2_dc_buf *buf = buf_priv;
>         struct sg_table *sgt = buf->dma_sgt;
>
> -       /* DMABUF exporter will flush the cache for us */
> -       if (!buf->vec)
> +       /*
> +        * DMABUF exporter will flush the cache for us; only USERPTR
> +        * and MMAP buffers with non-coherent memory will be flushed.
> +        */
> +       if (!(buf->attrs & DMA_ATTR_NON_CONSISTENT))
>                 return;
>
>         dma_sync_sg_for_cpu(buf->dev, sgt->sgl, sgt->orig_nents, buf->dma_dir);
> @@ -172,13 +178,22 @@ static void *vb2_dc_alloc(struct device *dev, unsigned long attrs,
>         if (attrs)
>                 buf->attrs = attrs;
>         buf->cookie = dma_alloc_attrs(dev, size, &buf->dma_addr,
> -                                       GFP_KERNEL | gfp_flags, buf->attrs);
> +                                    GFP_KERNEL | gfp_flags, buf->attrs);
>         if (!buf->cookie) {
> -               dev_err(dev, "dma_alloc_coherent of size %ld failed\n", size);
> +               dev_err(dev, "dma_alloc_attrs of size %ld failed\n", size);
>                 kfree(buf);
>                 return ERR_PTR(-ENOMEM);
>         }
>
> +       if (buf->attrs & DMA_ATTR_NON_CONSISTENT) {
> +               buf->dma_sgt = vb2_dc_get_base_sgt(buf);
> +               if (!buf->dma_sgt) {
> +                       dma_free_attrs(dev, size, buf->cookie, buf->dma_addr,
> +                                      buf->attrs);
> +                       return ERR_PTR(-ENOMEM);
> +               }
> +       }
> +
>         if ((buf->attrs & DMA_ATTR_NO_KERNEL_MAPPING) == 0)
>                 buf->vaddr = buf->cookie;
>
> @@ -359,6 +374,34 @@ static void *vb2_dc_dmabuf_ops_kmap(struct dma_buf *dbuf, unsigned long pgnum)
>         return buf->vaddr ? buf->vaddr + pgnum * PAGE_SIZE : NULL;
>  }
>
> +static int vb2_dc_dmabuf_ops_begin_cpu_access(struct dma_buf *dbuf,
> +                                             enum dma_data_direction direction)
> +{
> +       struct vb2_dc_buf *buf = dbuf->priv;
> +       struct sg_table *sgt = buf->dma_sgt;
> +
> +       if (!(buf->attrs & DMA_ATTR_NON_CONSISTENT))
> +               return 0;
> +
> +       dma_sync_sg_for_cpu(buf->dev, sgt->sgl, sgt->nents, buf->dma_dir);
> +
> +       return 0;
> +}
> +
> +static int vb2_dc_dmabuf_ops_end_cpu_access(struct dma_buf *dbuf,
> +                                           enum dma_data_direction direction)
> +{
> +       struct vb2_dc_buf *buf = dbuf->priv;
> +       struct sg_table *sgt = buf->dma_sgt;
> +
> +       if (!(buf->attrs & DMA_ATTR_NON_CONSISTENT))
> +               return 0;
> +
> +       dma_sync_sg_for_device(buf->dev, sgt->sgl, sgt->nents, buf->dma_dir);
> +
> +       return 0;
> +}
> +
>  static void *vb2_dc_dmabuf_ops_vmap(struct dma_buf *dbuf)
>  {
>         struct vb2_dc_buf *buf = dbuf->priv;
> @@ -379,6 +422,8 @@ static struct dma_buf_ops vb2_dc_dmabuf_ops = {
>         .unmap_dma_buf = vb2_dc_dmabuf_ops_unmap,
>         .kmap = vb2_dc_dmabuf_ops_kmap,
>         .kmap_atomic = vb2_dc_dmabuf_ops_kmap,
> +       .begin_cpu_access = vb2_dc_dmabuf_ops_begin_cpu_access,
> +       .end_cpu_access = vb2_dc_dmabuf_ops_end_cpu_access,
>         .vmap = vb2_dc_dmabuf_ops_vmap,
>         .mmap = vb2_dc_dmabuf_ops_mmap,
>         .release = vb2_dc_dmabuf_ops_release,
> @@ -424,11 +469,12 @@ static void vb2_dc_put_userptr(void *buf_priv)
>
>         if (sgt) {
>                 /*
> -                * No need to sync to CPU, it's already synced to the CPU
> -                * since the finish() memop will have been called before this.
> +                * Don't ask to skip cache sync in case if the user
> +                * did ask to skip cache flush the last time the
> +                * buffer was dequeued.
>                  */
>                 dma_unmap_sg_attrs(buf->dev, sgt->sgl, sgt->orig_nents,
> -                                  buf->dma_dir, DMA_ATTR_SKIP_CPU_SYNC);
> +                                  buf->dma_dir, 0);
>                 pages = frame_vector_pages(buf->vec);
>                 /* sgt should exist only if vector contains pages... */
>                 BUG_ON(IS_ERR(pages));

  reply	other threads:[~2016-12-26  7:58 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-16  1:24 [RFC v2 00/11] vb2: Handle user cache hints, allow drivers to choose cache coherency Laurent Pinchart
2016-12-16  1:24 ` Laurent Pinchart
2016-12-16  1:24 ` [RFC v2 01/11] vb2: Rename confusingly named internal buffer preparation functions Laurent Pinchart
2016-12-16  1:24 ` [RFC v2 02/11] vb2: Move buffer cache synchronisation to prepare from queue Laurent Pinchart
2016-12-16  1:24 ` [RFC v2 03/11] vb2: Move cache synchronisation from buffer done to dqbuf handler Laurent Pinchart
2017-03-27 21:27   ` Shuah Khan
2017-03-28 12:31     ` Laurent Pinchart
2017-03-28 12:31       ` Laurent Pinchart
2016-12-16  1:24 ` [RFC v2 04/11] v4l: Unify cache management hint buffer flags Laurent Pinchart
2016-12-16  1:24 ` [RFC v2 05/11] v4l2-core: Don't sync cache for a buffer if so requested Laurent Pinchart
2017-03-27 22:08   ` Shuah Khan
2016-12-16  1:24 ` [RFC v2 06/11] vb2: Improve struct vb2_mem_ops documentation; alloc and put are for MMAP Laurent Pinchart
2016-12-16  1:24 ` [RFC v2 07/11] vb2: dma-contig: Remove redundant sgt_base field Laurent Pinchart
2017-03-27 22:51   ` Shuah Khan
2017-04-07 12:37     ` Sakari Ailus
2016-12-16  1:24 ` [RFC v2 08/11] vb2: dma-contig: Don't warn on failure in obtaining scatterlist Laurent Pinchart
2016-12-16  1:24   ` Laurent Pinchart
2016-12-16  1:24 ` [RFC v2 09/11] vb2: dma-contig: Move vb2_dc_get_base_sgt() up Laurent Pinchart
2016-12-16  1:24 ` [RFC v2 10/11] vb2: dma-contig: Let drivers decide DMA attrs of MMAP and USERPTR bufs Laurent Pinchart
2016-12-26  7:58   ` Ricky Liang [this message]
2017-04-05 13:13     ` [RFC, v2, " Sakari Ailus
2017-04-07 11:42     ` Laurent Pinchart
2016-12-16  1:24 ` [RFC v2 11/11] vb2: dma-contig: Add WARN_ON_ONCE() to check for potential bugs Laurent Pinchart
2016-12-16 12:06 ` [RFC v2 00/11] vb2: Handle user cache hints, allow drivers to choose cache coherency Hans Verkuil
2016-12-16 12:06   ` Hans Verkuil

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAAJzSMep+qccM+UV+T-wgpqTNPYD3yHWqpjJbhH5v4NLxjqZ=w@mail.gmail.com' \
    --to=jcliang@chromium.org \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hverkuil@xs4all.nl \
    --cc=kyungmin.park@samsung.com \
    --cc=labbott@redhat.com \
    --cc=laurent.pinchart+renesas@ideasonboard.com \
    --cc=linux-media@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=posciak@chromium.org \
    --cc=robdclark@gmail.com \
    --cc=sakari.ailus@linux.intel.com \
    --cc=sumit.semwal@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.