diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1451-drm-amdgpu-Reduce-poll-interval-for-checking-SWS-HQD.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1451-drm-amdgpu-Reduce-poll-interval-for-checking-SWS-HQD.patch | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1451-drm-amdgpu-Reduce-poll-interval-for-checking-SWS-HQD.patch b/meta-amd-bsp/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/meta-amd-bsp/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 + |