aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/1451-drm-amdgpu-Reduce-poll-interval-for-checking-SWS-HQD.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/1451-drm-amdgpu-Reduce-poll-interval-for-checking-SWS-HQD.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/1451-drm-amdgpu-Reduce-poll-interval-for-checking-SWS-HQD.patch130
1 files changed, 130 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/1451-drm-amdgpu-Reduce-poll-interval-for-checking-SWS-HQD.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/1451-drm-amdgpu-Reduce-poll-interval-for-checking-SWS-HQD.patch
new file mode 100644
index 00000000..c9cdb366
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/1451-drm-amdgpu-Reduce-poll-interval-for-checking-SWS-HQD.patch
@@ -0,0 +1,130 @@
+From 47555739e6f33ebf0c6030910f416060b6ee1963 Mon Sep 17 00:00:00 2001
+From: Yong Zhao <yong.zhao@amd.com>
+Date: Tue, 24 May 2016 11:34:06 -0400
+Subject: [PATCH 1451/4131] drm/amdgpu: Reduce poll interval for checking SWS
+ HQD dequeue operation
+
+The previous 20ms poll interval is a bit too large and may result in low
+performance if certain benchmark applications are badly written,
+in which queues are created/destroyed at a high frequency.
+
+Change-Id: I049b2ab3ab7688a133de1a797a0275b519d64349
+Signed-off-by: Yong Zhao <yong.zhao@amd.com>
+
+ Conflicts:
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 17 +++++++----------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 14 ++++++--------
+ 2 files changed, 13 insertions(+), 18 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+index 1e8ff65..d48a859 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+@@ -536,8 +536,8 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd,
+ {
+ struct amdgpu_device *adev = get_amdgpu_device(kgd);
+ uint32_t temp;
+- int timeout = utimeout;
+ enum hqd_dequeue_request_type type;
++ unsigned long end_jiffies = (utimeout * HZ / 1000) + jiffies;
+
+ acquire_queue(kgd, pipe_id, queue_id);
+ WREG32(mmCP_HQD_PQ_DOORBELL_CONTROL, 0);
+@@ -560,14 +560,12 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd,
+ temp = RREG32(mmCP_HQD_ACTIVE);
+ if (!(temp & CP_HQD_ACTIVE__ACTIVE_MASK))
+ break;
+- if (timeout <= 0) {
+- pr_err("kfd: cp queue preemption time out (%dms)\n",
+- temp);
++ if (time_after(jiffies, end_jiffies)) {
++ pr_err("kfd: cp queue preemption time out\n");
+ release_queue(kgd);
+ return -ETIME;
+ }
+- msleep(20);
+- timeout -= 20;
++ usleep_range(500, 1000);
+ }
+
+ release_queue(kgd);
+@@ -581,7 +579,7 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
+ struct cik_sdma_rlc_registers *m;
+ uint32_t sdma_base_addr;
+ uint32_t temp;
+- int timeout = utimeout;
++ unsigned long end_jiffies = (utimeout * HZ / 1000) + jiffies;
+
+ m = get_sdma_mqd(mqd);
+ sdma_base_addr = get_sdma_base_addr(m);
+@@ -594,10 +592,9 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
+ temp = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS);
+ if (temp & SDMA0_RLC0_CONTEXT_STATUS__IDLE_MASK)
+ break;
+- if (timeout <= 0)
++ if (time_after(jiffies, end_jiffies))
+ return -ETIME;
+- msleep(20);
+- timeout -= 20;
++ usleep_range(500, 1000);
+ }
+
+ WREG32(sdma_base_addr + mmSDMA0_RLC0_DOORBELL, 0);
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+index f20498b..81ff833 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+@@ -562,8 +562,8 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd,
+ {
+ struct amdgpu_device *adev = get_amdgpu_device(kgd);
+ uint32_t temp;
+- int timeout = utimeout;
+ enum hqd_dequeue_request_type type;
++ unsigned long end_jiffies = (utimeout * HZ / 1000) + jiffies;
+
+ acquire_queue(kgd, pipe_id, queue_id);
+
+@@ -585,13 +585,12 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd,
+ temp = RREG32(mmCP_HQD_ACTIVE);
+ if (!(temp & CP_HQD_ACTIVE__ACTIVE_MASK))
+ break;
+- if (timeout <= 0) {
++ if (time_after(jiffies, end_jiffies)) {
+ pr_err("kfd: cp queue preemption time out.\n");
+ release_queue(kgd);
+ return -ETIME;
+ }
+- msleep(20);
+- timeout -= 20;
++ usleep_range(500, 1000);
+ }
+
+ release_queue(kgd);
+@@ -605,7 +604,7 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
+ struct vi_sdma_mqd *m;
+ uint32_t sdma_base_addr;
+ uint32_t temp;
+- int timeout = utimeout;
++ unsigned long end_jiffies = (utimeout * HZ / 1000) + jiffies;
+
+ m = get_sdma_mqd(mqd);
+ sdma_base_addr = get_sdma_base_addr(m);
+@@ -618,10 +617,9 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
+ temp = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS);
+ if (temp & SDMA0_RLC0_CONTEXT_STATUS__IDLE_MASK)
+ break;
+- if (timeout <= 0)
++ if (time_after(jiffies, end_jiffies))
+ return -ETIME;
+- msleep(20);
+- timeout -= 20;
++ usleep_range(500, 1000);
+ }
+
+ WREG32(sdma_base_addr + mmSDMA0_RLC0_DOORBELL, 0);
+--
+2.7.4
+