aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0406-drm-amdgpu-use-scheduler-for-UVD-ib-test.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0406-drm-amdgpu-use-scheduler-for-UVD-ib-test.patch')
-rw-r--r--common/recipes-kernel/linux/files/0406-drm-amdgpu-use-scheduler-for-UVD-ib-test.patch110
1 files changed, 110 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0406-drm-amdgpu-use-scheduler-for-UVD-ib-test.patch b/common/recipes-kernel/linux/files/0406-drm-amdgpu-use-scheduler-for-UVD-ib-test.patch
new file mode 100644
index 00000000..092ce3d9
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0406-drm-amdgpu-use-scheduler-for-UVD-ib-test.patch
@@ -0,0 +1,110 @@
+From 7b5ec431770ac581aa23d460f670cfb97c14280d Mon Sep 17 00:00:00 2001
+From: Chunming Zhou <david1.zhou@amd.com>
+Date: Fri, 3 Jul 2015 14:08:18 +0800
+Subject: [PATCH 0406/1050] drm/amdgpu: use scheduler for UVD ib test
+
+Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
+Reviewed-by: Christian K?nig <christian.koenig@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 61 +++++++++++++++++++++++----------
+ 1 file changed, 42 insertions(+), 19 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+index f643535..c1be7db 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+@@ -809,6 +809,14 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx)
+ return 0;
+ }
+
++static int amdgpu_uvd_free_job(
++ struct amdgpu_cs_parser *sched_job)
++{
++ amdgpu_ib_free(sched_job->adev, sched_job->ibs);
++ kfree(sched_job->ibs);
++ return 0;
++}
++
+ static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring,
+ struct amdgpu_bo *bo,
+ struct amdgpu_fence **fence)
+@@ -816,7 +824,8 @@ static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring,
+ struct ttm_validate_buffer tv;
+ struct ww_acquire_ctx ticket;
+ struct list_head head;
+- struct amdgpu_ib ib;
++ struct amdgpu_ib *ib = NULL;
++ struct amdgpu_device *adev = ring->adev;
+ uint64_t addr;
+ int i, r;
+
+@@ -838,34 +847,48 @@ static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring,
+ r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false);
+ if (r)
+ goto err;
+-
+- r = amdgpu_ib_get(ring, NULL, 64, &ib);
+- if (r)
++ ib = kzalloc(sizeof(struct amdgpu_ib), GFP_KERNEL);
++ if (!ib) {
++ r = -ENOMEM;
+ goto err;
++ }
++ r = amdgpu_ib_get(ring, NULL, 64, ib);
++ if (r)
++ goto err1;
+
+ addr = amdgpu_bo_gpu_offset(bo);
+- ib.ptr[0] = PACKET0(mmUVD_GPCOM_VCPU_DATA0, 0);
+- ib.ptr[1] = addr;
+- ib.ptr[2] = PACKET0(mmUVD_GPCOM_VCPU_DATA1, 0);
+- ib.ptr[3] = addr >> 32;
+- ib.ptr[4] = PACKET0(mmUVD_GPCOM_VCPU_CMD, 0);
+- ib.ptr[5] = 0;
++ ib->ptr[0] = PACKET0(mmUVD_GPCOM_VCPU_DATA0, 0);
++ ib->ptr[1] = addr;
++ ib->ptr[2] = PACKET0(mmUVD_GPCOM_VCPU_DATA1, 0);
++ ib->ptr[3] = addr >> 32;
++ ib->ptr[4] = PACKET0(mmUVD_GPCOM_VCPU_CMD, 0);
++ ib->ptr[5] = 0;
+ for (i = 6; i < 16; ++i)
+- ib.ptr[i] = PACKET2(0);
+- ib.length_dw = 16;
++ ib->ptr[i] = PACKET2(0);
++ ib->length_dw = 16;
+
+- r = amdgpu_ib_schedule(ring->adev, 1, &ib, AMDGPU_FENCE_OWNER_UNDEFINED);
++ r = amdgpu_sched_ib_submit_kernel_helper(adev, ring, ib, 1,
++ &amdgpu_uvd_free_job,
++ AMDGPU_FENCE_OWNER_UNDEFINED);
+ if (r)
+- goto err;
+- ttm_eu_fence_buffer_objects(&ticket, &head, &ib.fence->base);
++ goto err2;
+
+- if (fence)
+- *fence = amdgpu_fence_ref(ib.fence);
++ ttm_eu_fence_buffer_objects(&ticket, &head, &ib->fence->base);
+
+- amdgpu_ib_free(ring->adev, &ib);
++ if (fence)
++ *fence = amdgpu_fence_ref(ib->fence);
+ amdgpu_bo_unref(&bo);
+- return 0;
+
++ if (amdgpu_enable_scheduler)
++ return 0;
++
++ amdgpu_ib_free(ring->adev, ib);
++ kfree(ib);
++ return 0;
++err2:
++ amdgpu_ib_free(ring->adev, ib);
++err1:
++ kfree(ib);
+ err:
+ ttm_eu_backoff_reservation(&ticket, &head);
+ return r;
+--
+1.9.1
+