aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amdfalconx86/recipes-kernel/linux/files/0358-drm-amdgpu-return-the-common-fence-from-amdgpu_fence.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amdfalconx86/recipes-kernel/linux/files/0358-drm-amdgpu-return-the-common-fence-from-amdgpu_fence.patch')
-rw-r--r--meta-amdfalconx86/recipes-kernel/linux/files/0358-drm-amdgpu-return-the-common-fence-from-amdgpu_fence.patch118
1 files changed, 118 insertions, 0 deletions
diff --git a/meta-amdfalconx86/recipes-kernel/linux/files/0358-drm-amdgpu-return-the-common-fence-from-amdgpu_fence.patch b/meta-amdfalconx86/recipes-kernel/linux/files/0358-drm-amdgpu-return-the-common-fence-from-amdgpu_fence.patch
new file mode 100644
index 00000000..d5a0ad6b
--- /dev/null
+++ b/meta-amdfalconx86/recipes-kernel/linux/files/0358-drm-amdgpu-return-the-common-fence-from-amdgpu_fence.patch
@@ -0,0 +1,118 @@
+From cee6a6cb58eba90c31ff50a76186c941085a164d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Tue, 16 Feb 2016 17:39:39 +0100
+Subject: [PATCH 0358/1110] drm/amdgpu: return the common fence from
+ amdgpu_fence_emit
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Try to avoid using the hardware specific fences even more.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
+Signed-off-by: Kalyan Alle <kalyan.alle@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 4 ++--
+ drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 27 ++++++++++++++-------------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 7 ++++---
+ 3 files changed, 20 insertions(+), 18 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index 866e790..b649a8f 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -390,7 +390,7 @@ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,
+ unsigned irq_type);
+ void amdgpu_fence_driver_suspend(struct amdgpu_device *adev);
+ void amdgpu_fence_driver_resume(struct amdgpu_device *adev);
+-int amdgpu_fence_emit(struct amdgpu_ring *ring, struct amdgpu_fence **fence);
++int amdgpu_fence_emit(struct amdgpu_ring *ring, struct fence **fence);
+ void amdgpu_fence_process(struct amdgpu_ring *ring);
+ int amdgpu_fence_wait_next(struct amdgpu_ring *ring);
+ int amdgpu_fence_wait_empty(struct amdgpu_ring *ring);
+@@ -726,7 +726,7 @@ struct amdgpu_ib {
+ uint32_t length_dw;
+ uint64_t gpu_addr;
+ uint32_t *ptr;
+- struct amdgpu_fence *fence;
++ struct fence *fence;
+ struct amdgpu_user_fence *user;
+ struct amdgpu_vm *vm;
+ unsigned vm_id;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+index d94b13a..83599f2 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+@@ -91,28 +91,29 @@ static u32 amdgpu_fence_read(struct amdgpu_ring *ring)
+ * amdgpu_fence_emit - emit a fence on the requested ring
+ *
+ * @ring: ring the fence is associated with
+- * @fence: amdgpu fence object
++ * @f: resulting fence object
+ *
+ * Emits a fence command on the requested ring (all asics).
+ * Returns 0 on success, -ENOMEM on failure.
+ */
+-int amdgpu_fence_emit(struct amdgpu_ring *ring, struct amdgpu_fence **fence)
++int amdgpu_fence_emit(struct amdgpu_ring *ring, struct fence **f)
+ {
+ struct amdgpu_device *adev = ring->adev;
++ struct amdgpu_fence *fence;
+
+- *fence = kmem_cache_alloc(amdgpu_fence_slab, GFP_KERNEL);
+- if ((*fence) == NULL) {
++ fence = kmem_cache_alloc(amdgpu_fence_slab, GFP_KERNEL);
++ if (fence == NULL)
+ return -ENOMEM;
+- }
+- (*fence)->seq = ++ring->fence_drv.sync_seq;
+- (*fence)->ring = ring;
+- fence_init(&(*fence)->base, &amdgpu_fence_ops,
+- &ring->fence_drv.fence_queue.lock,
+- adev->fence_context + ring->idx,
+- (*fence)->seq);
++
++ fence->seq = ++ring->fence_drv.sync_seq;
++ fence->ring = ring;
++ fence_init(&fence->base, &amdgpu_fence_ops,
++ &ring->fence_drv.fence_queue.lock,
++ adev->fence_context + ring->idx,
++ fence->seq);
+ amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr,
+- (*fence)->seq,
+- AMDGPU_FENCE_FLAG_INT);
++ fence->seq, AMDGPU_FENCE_FLAG_INT);
++ *f = &fence->base;
+ return 0;
+ }
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
+index dc5683c..4d7b80b 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
+@@ -90,9 +90,8 @@ int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm,
+ */
+ void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib)
+ {
+- amdgpu_sa_bo_free(adev, &ib->sa_bo, &ib->fence->base);
+- if (ib->fence)
+- fence_put(&ib->fence->base);
++ amdgpu_sa_bo_free(adev, &ib->sa_bo, ib->fence);
++ fence_put(ib->fence);
+ }
+
+ /**
+@@ -196,6 +195,8 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
+ AMDGPU_FENCE_FLAG_64BIT);
+ }
+
++ *f = fence_get(ib->fence);
++
+ amdgpu_ring_commit(ring);
+ return 0;
+ }
+--
+2.7.4
+