Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1542391

[RFC PATCH 4/4] staging: android: ion: Call dma_map_sg for syncing and mapping

Path csiph.com!1.us.feeder.erje.net!feeder.erje.net!1.eu.feeder.erje.net!weretis.net!feeder4.news.weretis.net!news.unit0.net!news.panservice.it!bofh.it!news.nic.it!robomod
From Laura Abbott <labbott@redhat.com>
Newsgroups linux.kernel
Subject [RFC PATCH 4/4] staging: android: ion: Call dma_map_sg for syncing and mapping
Date Thu, 15 Dec 2016 01:10:03 +0100
Message-ID <sOrMv-78L-69@gated-at.bofh.it> (permalink)
References <sOrMt-78L-9@gated-at.bofh.it>
X-Original-To Sumit Semwal <sumit.semwal@linaro.org>, Riley Andrews <riandrews@android.com>, arve@android.com
X-Google-Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=MwHhvXcE7bdao8E+S24I+wEEsJ97N2LVAqZk8OyEbgc=; b=GrtZpgQTR+4AW/10+5DTG/dfYwqvdst6UUHnzy62zjI3ZIadQ/poFhKGPvOnEwBkbk NyhzG3341IKLy+0G7/2w7erJbUordw3Z+D3fx5nL6onWke8G7c2ezvZ4Mb9AOn1sDARA Bw+5OyP9d+BsWM483abYUwHo+CK0bM1a/P/kRtnMMrjtZ8YpXydb+iKXcxihIABAMA8s 5gO11Tll0G0nGLsseP/EIBTOMh4TwcNxs6W2TZ+QXkhb9dFPWIsxYLiFejUOh98qk+R9 uMj+sZ/tIQo+pi8QhAOBXeuQsZGhNdYTTPMyEVQPVLWIh4q8ODN6ifI1IQPCf6gt9mkD ZjzA==
X-Gm-Message-State AKaTC01xgLOot5LehXRuy5XLRM328KKiYPaBFM1+y5wOKdRKc2YB400GIa1YuTvXMmIg+qCR
X-Received by 10.55.99.141 with SMTP id x135mr84821553qkb.147.1481760480648; Wed, 14 Dec 2016 16:08:00 -0800 (PST)
X-Mailer git-send-email 2.7.4
Sender robomod@news.nic.it
List-ID <linux-kernel.vger.kernel.org>
X-Mailing-List linux-kernel@vger.kernel.org
Approved robomod@news.nic.it
Lines 114
Organization linux.* mail to news gateway
X-Original-Cc Laura Abbott <labbott@redhat.com>, romlem@google.com, devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org, linaro-mm-sig@lists.linaro.org, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, linux-arm-kernel@lists.infradead.org, Bryan Huntsman <bryanh@codeaurora.org>, pratikp@codeaurora.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, Brian Starkey <brian.starkey@arm.com>
X-Original-Date Wed, 14 Dec 2016 16:07:43 -0800
X-Original-Message-ID <1481760463-3515-5-git-send-email-labbott@redhat.com>
X-Original-References <1481760463-3515-1-git-send-email-labbott@redhat.com>
X-Original-Sender linux-kernel-owner@vger.kernel.org
Xref csiph.com linux.kernel:1542391

Show key headers only | View raw


Technically, calling dma_buf_map_attachment should return a buffer
properly dma_mapped. Add calls to dma_map_sg to begin_cpu_access to
ensure this happens. As a side effect, this lets Ion buffers take
advantage of the dma_buf sync ioctls.

Not-signed-off-by: Laura Abbott <labbott@redhat.com>
---
 drivers/staging/android/ion/ion.c | 61 ++++++++++++++++++++++++++++++---------
 1 file changed, 47 insertions(+), 14 deletions(-)

diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c
index 86dba07..5177d79 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -776,6 +776,11 @@ static struct sg_table *dup_sg_table(struct sg_table *table)
 	return new_table;
 }
 
+static void free_duped_table(struct sg_table *table)
+{
+	sg_free_table(table);
+	kfree(table);
+}
 
 static struct sg_table *ion_map_dma_buf(struct dma_buf_attachment *attachment,
 					enum dma_data_direction direction)
@@ -784,15 +789,29 @@ static struct sg_table *ion_map_dma_buf(struct dma_buf_attachment *attachment,
 	struct ion_buffer *buffer = dmabuf->priv;
 	struct sg_table *table;
 
-	return dup_sg_table(buffer->sg_table);
+	/*
+	 * TODO: Need to sync wrt CPU or device completely owning?
+	 */
+
+	table = dup_sg_table(buffer->sg_table);
+
+	if (!dma_map_sg(attachment->dev, table->sgl, table->nents,
+			direction)){
+		ret = -ENOMEM;
+		goto err;
+	}
+
+err:
+	free_duped_table(table);
+	return ERR_PTR(ret);
 }
 
 static void ion_unmap_dma_buf(struct dma_buf_attachment *attachment,
 			      struct sg_table *table,
 			      enum dma_data_direction direction)
 {
-	sg_free_table(table);
-	kfree(table);
+	dma_unmap_sg(attachment->dev, table->sgl, table->nents, direction);
+	free_duped_table(table);
 }
 
 struct ion_vma_list {
@@ -889,16 +908,24 @@ static int ion_dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
 	struct ion_buffer *buffer = dmabuf->priv;
 	void *vaddr;
 
-	if (!buffer->heap->ops->map_kernel) {
-		pr_err("%s: map kernel is not implemented by this heap.\n",
-		       __func__);
-		return -ENODEV;
+	/*
+	 * TODO: Move this elsewhere because we don't always need a vaddr
+	 */
+	if (buffer->heap->ops->map_kernel) {
+		mutex_lock(&buffer->lock);
+		vaddr = ion_buffer_kmap_get(buffer);
+		mutex_unlock(&buffer->lock);
 	}
 
-	mutex_lock(&buffer->lock);
-	vaddr = ion_buffer_kmap_get(buffer);
-	mutex_unlock(&buffer->lock);
-	return PTR_ERR_OR_ZERO(vaddr);
+	/*
+	 * Close enough right now? Flag to skip sync?
+	 */
+	if (!dma_map_sg(buffer->dev->dev.this_device, buffer->sg_table->sgl,
+			buffer->sg_table->nents,
+                        DMA_BIDIRECTIONAL))
+		return -ENOMEM;
+
+	return 0;
 }
 
 static int ion_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
@@ -906,9 +933,15 @@ static int ion_dma_buf_end_cpu_access(struct dma_buf *dmabuf,
 {
 	struct ion_buffer *buffer = dmabuf->priv;
 
-	mutex_lock(&buffer->lock);
-	ion_buffer_kmap_put(buffer);
-	mutex_unlock(&buffer->lock);
+	if (buffer->heap->ops->map_kernel) {
+		mutex_lock(&buffer->lock);
+		ion_buffer_kmap_put(buffer);
+		mutex_unlock(&buffer->lock);
+	}
+
+	dma_unmap_sg(buffer->dev->dev.this_device, buffer->sg_table->sgl,
+			buffer->sg_table->nents,
+			DMA_BIDIRECTIONAL);
 
 	return 0;
 }
-- 
2.7.4

Back to linux.kernel | Previous | Next — Previous in thread | Find similar | Unroll thread


Thread

[RFC PATCH 0/4] Ion caching (yet again) proof of concept Laura Abbott <labbott@redhat.com> - 2016-12-15 01:10 +0100
  [RFC PATCH 1/4] staging: android: ion: Some cleanup Laura Abbott <labbott@redhat.com> - 2016-12-15 01:10 +0100
  [RFC PATCH 3/4] staging: android: ion: Remove page faulting support Laura Abbott <labbott@redhat.com> - 2016-12-15 01:10 +0100
  [RFC PATCH 4/4] staging: android: ion: Call dma_map_sg for syncing and mapping Laura Abbott <labbott@redhat.com> - 2016-12-15 01:10 +0100

csiph-web