aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2017-12-13 06:25:14 -0500
committerThierry Reding <treding@nvidia.com>2018-03-16 19:04:20 -0400
commit27e92f1f1600c214bf649daddb9b88b68330a8d1 (patch)
tree335e19386efa2e99e5edc2a9cd4a69e3961f0b9d /drivers
parentbd43c9f0fa1f664b58eefdc8aab7ac3c8b2026ec (diff)
drm/tegra: prime: Implement ->{begin,end}_cpu_access()
These callbacks allow the exporter to swap in and pin the backing storage for buffers as well as invalidate the cache in preparation for accessing the buffer from the CPU, and flush the cache and unpin the backing storage when the CPU is done modifying the buffer. Signed-off-by: Thierry Reding <treding@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/tegra/gem.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c
index 8fc5860ab19a..8b0b4ff64bb4 100644
--- a/drivers/gpu/drm/tegra/gem.c
+++ b/drivers/gpu/drm/tegra/gem.c
@@ -568,6 +568,34 @@ static void tegra_gem_prime_release(struct dma_buf *buf)
568 drm_gem_dmabuf_release(buf); 568 drm_gem_dmabuf_release(buf);
569} 569}
570 570
571static int tegra_gem_prime_begin_cpu_access(struct dma_buf *buf,
572 enum dma_data_direction direction)
573{
574 struct drm_gem_object *gem = buf->priv;
575 struct tegra_bo *bo = to_tegra_bo(gem);
576 struct drm_device *drm = gem->dev;
577
578 if (bo->pages)
579 dma_sync_sg_for_cpu(drm->dev, bo->sgt->sgl, bo->sgt->nents,
580 DMA_FROM_DEVICE);
581
582 return 0;
583}
584
585static int tegra_gem_prime_end_cpu_access(struct dma_buf *buf,
586 enum dma_data_direction direction)
587{
588 struct drm_gem_object *gem = buf->priv;
589 struct tegra_bo *bo = to_tegra_bo(gem);
590 struct drm_device *drm = gem->dev;
591
592 if (bo->pages)
593 dma_sync_sg_for_device(drm->dev, bo->sgt->sgl, bo->sgt->nents,
594 DMA_TO_DEVICE);
595
596 return 0;
597}
598
571static void *tegra_gem_prime_kmap_atomic(struct dma_buf *buf, 599static void *tegra_gem_prime_kmap_atomic(struct dma_buf *buf,
572 unsigned long page) 600 unsigned long page)
573{ 601{
@@ -618,6 +646,8 @@ static const struct dma_buf_ops tegra_gem_prime_dmabuf_ops = {
618 .map_dma_buf = tegra_gem_prime_map_dma_buf, 646 .map_dma_buf = tegra_gem_prime_map_dma_buf,
619 .unmap_dma_buf = tegra_gem_prime_unmap_dma_buf, 647 .unmap_dma_buf = tegra_gem_prime_unmap_dma_buf,
620 .release = tegra_gem_prime_release, 648 .release = tegra_gem_prime_release,
649 .begin_cpu_access = tegra_gem_prime_begin_cpu_access,
650 .end_cpu_access = tegra_gem_prime_end_cpu_access,
621 .map_atomic = tegra_gem_prime_kmap_atomic, 651 .map_atomic = tegra_gem_prime_kmap_atomic,
622 .unmap_atomic = tegra_gem_prime_kunmap_atomic, 652 .unmap_atomic = tegra_gem_prime_kunmap_atomic,
623 .map = tegra_gem_prime_kmap, 653 .map = tegra_gem_prime_kmap,