From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Tomasz Stanislawski <t.stanislaws@samsung.com>
Cc: linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org,
airlied@redhat.com, m.szyprowski@samsung.com,
kyungmin.park@samsung.com, sumit.semwal@ti.com,
daeinki@gmail.com, daniel.vetter@ffwll.ch, robdclark@gmail.com,
pawel@osciak.com, linaro-mm-sig@lists.linaro.org,
hverkuil@xs4all.nl, remi@remlab.net, subashrp@gmail.com,
mchehab@redhat.com, zhangfei.gao@gmail.com,
s.nawrocki@samsung.com, k.debski@samsung.com
Subject: Re: [PATCHv10 20/26] v4l: vb2-dma-contig: add support for DMABUF exporting
Date: Thu, 11 Oct 2012 23:46:09 +0200 [thread overview]
Message-ID: <1719968.vb7xbO4pZc@avalon> (raw)
In-Reply-To: <1349880405-26049-21-git-send-email-t.stanislaws@samsung.com>
Hi Tomasz,
On Wednesday 10 October 2012 16:46:39 Tomasz Stanislawski wrote:
> This patch adds support for exporting a dma-contig buffer using
> DMABUF interface.
>
> Signed-off-by: Tomasz Stanislawski <t.stanislaws@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
> drivers/media/v4l2-core/videobuf2-dma-contig.c | 200 +++++++++++++++++++++
> 1 file changed, 200 insertions(+)
>
> diff --git a/drivers/media/v4l2-core/videobuf2-dma-contig.c
> b/drivers/media/v4l2-core/videobuf2-dma-contig.c index 0e065ce..b138b5c
> 100644
> --- a/drivers/media/v4l2-core/videobuf2-dma-contig.c
> +++ b/drivers/media/v4l2-core/videobuf2-dma-contig.c
> @@ -36,6 +36,7 @@ struct vb2_dc_buf {
> /* MMAP related */
> struct vb2_vmarea_handler handler;
> atomic_t refcount;
> + struct sg_table *sgt_base;
>
> /* USERPTR related */
> struct vm_area_struct *vma;
> @@ -142,6 +143,10 @@ static void vb2_dc_put(void *buf_priv)
> if (!atomic_dec_and_test(&buf->refcount))
> return;
>
> + if (buf->sgt_base) {
> + sg_free_table(buf->sgt_base);
> + kfree(buf->sgt_base);
> + }
> dma_free_coherent(buf->dev, buf->size, buf->vaddr, buf->dma_addr);
> kfree(buf);
> }
> @@ -213,6 +218,200 @@ static int vb2_dc_mmap(void *buf_priv, struct
> vm_area_struct *vma) }
>
> /*********************************************/
> +/* DMABUF ops for exporters */
> +/*********************************************/
> +
> +struct vb2_dc_attachment {
> + struct sg_table sgt;
> + enum dma_data_direction dir;
> +};
> +
> +static int vb2_dc_dmabuf_ops_attach(struct dma_buf *dbuf, struct device
> *dev, + struct dma_buf_attachment *dbuf_attach)
> +{
> + struct vb2_dc_attachment *attach;
> + unsigned int i;
> + struct scatterlist *rd, *wr;
> + struct sg_table *sgt;
> + struct vb2_dc_buf *buf = dbuf->priv;
> + int ret;
> +
> + attach = kzalloc(sizeof(*attach), GFP_KERNEL);
> + if (!attach)
> + return -ENOMEM;
> +
> + sgt = &attach->sgt;
> + /* Copy the buf->base_sgt scatter list to the attachment, as we can't
> + * map the same scatter list to multiple attachments at the same time.
> + */
> + ret = sg_alloc_table(sgt, buf->sgt_base->orig_nents, GFP_KERNEL);
> + if (ret) {
> + kfree(attach);
> + return -ENOMEM;
> + }
> +
> + rd = buf->sgt_base->sgl;
> + wr = sgt->sgl;
> + for (i = 0; i < sgt->orig_nents; ++i) {
> + sg_set_page(wr, sg_page(rd), rd->length, rd->offset);
> + rd = sg_next(rd);
> + wr = sg_next(wr);
> + }
> +
> + attach->dir = DMA_NONE;
> + dbuf_attach->priv = attach;
> +
> + return 0;
> +}
> +
> +static void vb2_dc_dmabuf_ops_detach(struct dma_buf *dbuf,
> + struct dma_buf_attachment *db_attach)
> +{
> + struct vb2_dc_attachment *attach = db_attach->priv;
> + struct sg_table *sgt;
> +
> + if (!attach)
> + return;
> +
> + sgt = &attach->sgt;
> +
> + /* release the scatterlist cache */
> + if (attach->dir != DMA_NONE)
> + dma_unmap_sg(db_attach->dev, sgt->sgl, sgt->orig_nents,
> + attach->dir);
> + sg_free_table(sgt);
> + kfree(attach);
> + db_attach->priv = NULL;
> +}
> +
> +static struct sg_table *vb2_dc_dmabuf_ops_map(
> + struct dma_buf_attachment *db_attach, enum dma_data_direction dir)
> +{
> + struct vb2_dc_attachment *attach = db_attach->priv;
> + /* stealing dmabuf mutex to serialize map/unmap operations */
> + struct mutex *lock = &db_attach->dmabuf->lock;
> + struct sg_table *sgt;
> + int ret;
> +
> + mutex_lock(lock);
> +
> + sgt = &attach->sgt;
> + /* return previously mapped sg table */
> + if (attach->dir == dir) {
> + mutex_unlock(lock);
> + return sgt;
> + }
> +
> + /* release any previous cache */
> + if (attach->dir != DMA_NONE) {
> + dma_unmap_sg(db_attach->dev, sgt->sgl, sgt->orig_nents,
> + attach->dir);
> + attach->dir = DMA_NONE;
> + }
> +
> + /* mapping to the client with new direction */
> + ret = dma_map_sg(db_attach->dev, sgt->sgl, sgt->orig_nents, dir);
> + if (ret <= 0) {
> + pr_err("failed to map scatterlist\n");
> + mutex_unlock(lock);
> + return ERR_PTR(-EIO);
> + }
> +
> + attach->dir = dir;
> +
> + mutex_unlock(lock);
> +
> + return sgt;
> +}
> +
> +static void vb2_dc_dmabuf_ops_unmap(struct dma_buf_attachment *db_attach,
> + struct sg_table *sgt, enum dma_data_direction dir)
> +{
> + /* nothing to be done here */
> +}
> +
> +static void vb2_dc_dmabuf_ops_release(struct dma_buf *dbuf)
> +{
> + /* drop reference obtained in vb2_dc_get_dmabuf */
> + vb2_dc_put(dbuf->priv);
> +}
> +
> +static void *vb2_dc_dmabuf_ops_kmap(struct dma_buf *dbuf, unsigned long
> pgnum) +{
> + struct vb2_dc_buf *buf = dbuf->priv;
> +
> + return buf->vaddr + pgnum * PAGE_SIZE;
> +}
> +
> +static void *vb2_dc_dmabuf_ops_vmap(struct dma_buf *dbuf)
> +{
> + struct vb2_dc_buf *buf = dbuf->priv;
> +
> + return buf->vaddr;
> +}
> +
> +static int vb2_dc_dmabuf_ops_mmap(struct dma_buf *dbuf,
> + struct vm_area_struct *vma)
> +{
> + return vb2_dc_mmap(dbuf->priv, vma);
> +}
> +
> +static struct dma_buf_ops vb2_dc_dmabuf_ops = {
> + .attach = vb2_dc_dmabuf_ops_attach,
> + .detach = vb2_dc_dmabuf_ops_detach,
> + .map_dma_buf = vb2_dc_dmabuf_ops_map,
> + .unmap_dma_buf = vb2_dc_dmabuf_ops_unmap,
> + .kmap = vb2_dc_dmabuf_ops_kmap,
> + .kmap_atomic = vb2_dc_dmabuf_ops_kmap,
> + .vmap = vb2_dc_dmabuf_ops_vmap,
> + .mmap = vb2_dc_dmabuf_ops_mmap,
> + .release = vb2_dc_dmabuf_ops_release,
> +};
> +
> +static struct sg_table *vb2_dc_get_base_sgt(struct vb2_dc_buf *buf)
> +{
> + int ret;
> + struct sg_table *sgt;
> +
> + sgt = kmalloc(sizeof(*sgt), GFP_KERNEL);
> + if (!sgt) {
> + dev_err(buf->dev, "failed to alloc sg table\n");
> + return NULL;
> + }
> +
> + ret = dma_get_sgtable(buf->dev, sgt, buf->vaddr, buf->dma_addr,
> + buf->size);
> + if (ret < 0) {
> + dev_err(buf->dev, "failed to get scatterlist from DMA API\n");
> + kfree(sgt);
> + return NULL;
> + }
> +
> + return sgt;
> +}
> +
> +static struct dma_buf *vb2_dc_get_dmabuf(void *buf_priv)
> +{
> + struct vb2_dc_buf *buf = buf_priv;
> + struct dma_buf *dbuf;
> +
> + if (!buf->sgt_base)
> + buf->sgt_base = vb2_dc_get_base_sgt(buf);
> +
> + if (WARN_ON(!buf->sgt_base))
> + return NULL;
> +
> + dbuf = dma_buf_export(buf, &vb2_dc_dmabuf_ops, buf->size, 0);
> + if (IS_ERR(dbuf))
> + return NULL;
> +
> + /* dmabuf keeps reference to vb2 buffer */
> + atomic_inc(&buf->refcount);
> +
> + return dbuf;
> +}
> +
> +/*********************************************/
> /* callbacks for USERPTR buffers */
> /*********************************************/
>
> @@ -519,6 +718,7 @@ static void *vb2_dc_attach_dmabuf(void *alloc_ctx,
> struct dma_buf *dbuf, const struct vb2_mem_ops vb2_dma_contig_memops = {
> .alloc = vb2_dc_alloc,
> .put = vb2_dc_put,
> + .get_dmabuf = vb2_dc_get_dmabuf,
> .cookie = vb2_dc_cookie,
> .vaddr = vb2_dc_vaddr,
> .mmap = vb2_dc_mmap,
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2012-10-11 21:46 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-10 14:46 [PATCHv10 00/26] Integration of videobuf2 with DMABUF Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 01/26] v4l: Add DMABUF as a memory type Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 02/26] Documentation: media: description of DMABUF importing in V4L2 Tomasz Stanislawski
2012-10-15 7:53 ` Hans Verkuil
2012-10-10 14:46 ` [PATCHv10 03/26] v4l: vb2: add support for shared buffer (dma_buf) Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 04/26] v4l: vb: remove warnings about MEMORY_DMABUF Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 05/26] v4l: vb2-dma-contig: shorten vb2_dma_contig prefix to vb2_dc Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 06/26] v4l: vb2-dma-contig: remove reference of alloc_ctx from a buffer Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 07/26] v4l: vb2-dma-contig: reorder functions Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 08/26] v4l: vb2-dma-contig: add support for scatterlist in userptr mode Tomasz Stanislawski
2012-10-26 16:24 ` Pawel Osciak
2012-10-30 6:43 ` Marek Szyprowski
2012-10-10 14:46 ` [PATCHv10 09/26] v4l: vb2: add prepare/finish callbacks to allocators Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 10/26] v4l: vb2-dma-contig: add prepare/finish to dma-contig allocator Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 11/26] v4l: vb2-dma-contig: add support for dma_buf importing Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 12/26] v4l: vb2-vmalloc: add support for dmabuf importing Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 13/26] v4l: vivi: " Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 14/26] v4l: s5p-tv: mixer: " Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 15/26] v4l: s5p-fimc: " Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 16/26] v4l: vb2-dma-contig: let mmap method to use dma_mmap_coherent call Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 17/26] Documentation: media: description of DMABUF exporting in V4L2 Tomasz Stanislawski
2012-10-15 7:59 ` Hans Verkuil
2012-10-10 14:46 ` [PATCHv10 18/26] v4l: add buffer exporting via dmabuf Tomasz Stanislawski
2012-10-15 8:01 ` Hans Verkuil
2012-10-10 14:46 ` [PATCHv10 19/26] v4l: vb2: " Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 20/26] v4l: vb2-dma-contig: add support for DMABUF exporting Tomasz Stanislawski
2012-10-11 21:46 ` Laurent Pinchart [this message]
2012-10-10 14:46 ` [PATCHv10 21/26] v4l: vb2-dma-contig: add reference counting for a device from allocator context Tomasz Stanislawski
2012-10-11 21:49 ` Laurent Pinchart
2012-10-12 6:28 ` Tomasz Stanislawski
2012-10-12 9:32 ` Laurent Pinchart
2012-10-10 14:46 ` [PATCHv10 22/26] v4l: vb2-dma-contig: fail if user ptr buffer is not correctly aligned Tomasz Stanislawski
2012-10-11 21:36 ` Laurent Pinchart
2012-10-12 7:44 ` Tomasz Stanislawski
2012-10-12 7:58 ` Hans Verkuil
2012-10-12 9:34 ` Laurent Pinchart
2012-10-10 14:46 ` [PATCHv10 23/26] v4l: vb2-dma-contig: align buffer size to PAGE_SIZE Tomasz Stanislawski
2012-10-11 21:31 ` Laurent Pinchart
2012-10-12 8:24 ` Tomasz Stanislawski
2012-10-16 12:22 ` Laurent Pinchart
2012-10-10 14:46 ` [PATCHv10 24/26] v4l: s5p-fimc: support for dmabuf exporting Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 25/26] v4l: s5p-tv: mixer: " Tomasz Stanislawski
2012-10-10 14:46 ` [PATCHv10 26/26] v4l: s5p-mfc: " Tomasz Stanislawski
2012-11-08 12:05 ` [PATCH 27/26] v4l: vb2: Set data_offset to 0 for single-plane buffers Laurent Pinchart
2012-11-08 12:13 ` Marek Szyprowski
2012-11-08 12:19 ` Laurent Pinchart
2012-11-08 15:28 ` Tomasz Stanislawski
2012-11-08 16:36 ` Laurent Pinchart
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=1719968.vb7xbO4pZc@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=airlied@redhat.com \
--cc=daeinki@gmail.com \
--cc=daniel.vetter@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=hverkuil@xs4all.nl \
--cc=k.debski@samsung.com \
--cc=kyungmin.park@samsung.com \
--cc=linaro-mm-sig@lists.linaro.org \
--cc=linux-media@vger.kernel.org \
--cc=m.szyprowski@samsung.com \
--cc=mchehab@redhat.com \
--cc=pawel@osciak.com \
--cc=remi@remlab.net \
--cc=robdclark@gmail.com \
--cc=s.nawrocki@samsung.com \
--cc=subashrp@gmail.com \
--cc=sumit.semwal@ti.com \
--cc=t.stanislaws@samsung.com \
--cc=zhangfei.gao@gmail.com \
/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.