Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1542391
| 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
[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