aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/0200-drm-amdgpu-Refine-gfx_v9_0_kcq_disable-function.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0200-drm-amdgpu-Refine-gfx_v9_0_kcq_disable-function.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/0200-drm-amdgpu-Refine-gfx_v9_0_kcq_disable-function.patch86
1 files changed, 86 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0200-drm-amdgpu-Refine-gfx_v9_0_kcq_disable-function.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0200-drm-amdgpu-Refine-gfx_v9_0_kcq_disable-function.patch
new file mode 100644
index 00000000..e20d3fdc
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0200-drm-amdgpu-Refine-gfx_v9_0_kcq_disable-function.patch
@@ -0,0 +1,86 @@
+From 503a988cbbae900b2cef0291dea508bb7a9717ba Mon Sep 17 00:00:00 2001
+From: Rex Zhu <Rex.Zhu@amd.com>
+Date: Fri, 17 Aug 2018 16:45:16 +0800
+Subject: [PATCH 0200/2940] drm/amdgpu: Refine gfx_v9_0_kcq_disable function
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Send all kcq unmap_queue packets and then wait for
+complete.
+
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Acked-by: Christian König <christian.koenig@amd.com>
+Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 33 +++++++++++++--------------
+ 1 file changed, 16 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+index 1267ae6d2abf..190bc120ec7f 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+@@ -3220,28 +3220,29 @@ static int gfx_v9_0_hw_init(void *handle)
+ return r;
+ }
+
+-static int gfx_v9_0_kcq_disable(struct amdgpu_ring *kiq_ring,struct amdgpu_ring *ring)
++static int gfx_v9_0_kcq_disable(struct amdgpu_device *adev)
+ {
+- int r;
++ int r, i;
++ struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring;
+
+- r = amdgpu_ring_alloc(kiq_ring, 6);
+- if (r) {
++ r = amdgpu_ring_alloc(kiq_ring, 6 * adev->gfx.num_compute_rings);
++ if (r)
+ DRM_ERROR("Failed to lock KIQ (%d).\n", r);
+- return r;
+- }
+
+- /* unmap queues */
+- amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_UNMAP_QUEUES, 4));
+- amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
++ for (i = 0; i < adev->gfx.num_compute_rings; i++) {
++ struct amdgpu_ring *ring = &adev->gfx.compute_ring[i];
++
++ amdgpu_ring_write(kiq_ring, PACKET3(PACKET3_UNMAP_QUEUES, 4));
++ amdgpu_ring_write(kiq_ring, /* Q_sel: 0, vmid: 0, engine: 0, num_Q: 1 */
+ PACKET3_UNMAP_QUEUES_ACTION(1) | /* RESET_QUEUES */
+ PACKET3_UNMAP_QUEUES_QUEUE_SEL(0) |
+ PACKET3_UNMAP_QUEUES_ENGINE_SEL(0) |
+ PACKET3_UNMAP_QUEUES_NUM_QUEUES(1));
+- amdgpu_ring_write(kiq_ring, PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0(ring->doorbell_index));
+- amdgpu_ring_write(kiq_ring, 0);
+- amdgpu_ring_write(kiq_ring, 0);
+- amdgpu_ring_write(kiq_ring, 0);
+-
++ amdgpu_ring_write(kiq_ring, PACKET3_UNMAP_QUEUES_DOORBELL_OFFSET0(ring->doorbell_index));
++ amdgpu_ring_write(kiq_ring, 0);
++ amdgpu_ring_write(kiq_ring, 0);
++ amdgpu_ring_write(kiq_ring, 0);
++ }
+ r = amdgpu_ring_test_ring(kiq_ring);
+ if (r)
+ DRM_ERROR("KCQ disable failed\n");
+@@ -3252,14 +3253,12 @@ static int gfx_v9_0_kcq_disable(struct amdgpu_ring *kiq_ring,struct amdgpu_ring
+ static int gfx_v9_0_hw_fini(void *handle)
+ {
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+- int i;
+
+ amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0);
+ amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0);
+
+ /* disable KCQ to avoid CPC touch memory not valid anymore */
+- for (i = 0; i < adev->gfx.num_compute_rings; i++)
+- gfx_v9_0_kcq_disable(&adev->gfx.kiq.ring, &adev->gfx.compute_ring[i]);
++ gfx_v9_0_kcq_disable(adev);
+
+ if (amdgpu_sriov_vf(adev)) {
+ gfx_v9_0_cp_gfx_enable(adev, false);
+--
+2.17.1
+