diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5218-drm-amdgpu-Refine-gfx_v8_0_kcq_disable-function.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/5218-drm-amdgpu-Refine-gfx_v8_0_kcq_disable-function.patch | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5218-drm-amdgpu-Refine-gfx_v8_0_kcq_disable-function.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5218-drm-amdgpu-Refine-gfx_v8_0_kcq_disable-function.patch new file mode 100644 index 00000000..a112e5c0 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5218-drm-amdgpu-Refine-gfx_v8_0_kcq_disable-function.patch @@ -0,0 +1,85 @@ +From afd02ee7a6e7a4fe8d38fa935c4ff525a42cd618 Mon Sep 17 00:00:00 2001 +From: Rex Zhu <Rex.Zhu@amd.com> +Date: Fri, 17 Aug 2018 14:57:18 +0800 +Subject: [PATCH 5218/5725] drm/amdgpu: Refine gfx_v8_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_v8_0.c | 29 +++++++++++++++-------------- + 1 file changed, 15 insertions(+), 14 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +index 275d524..4f9dff2 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +@@ -5059,26 +5059,29 @@ static int gfx_v8_0_hw_init(void *handle) + return r; + } + +-static int gfx_v8_0_kcq_disable(struct amdgpu_ring *kiq_ring,struct amdgpu_ring *ring) ++static int gfx_v8_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); ++ r = amdgpu_ring_alloc(kiq_ring, 6 * adev->gfx.num_compute_rings); + if (r) + DRM_ERROR("Failed to lock KIQ (%d).\n", 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"); +@@ -5089,7 +5092,6 @@ static int gfx_v8_0_kcq_disable(struct amdgpu_ring *kiq_ring,struct amdgpu_ring + static int gfx_v8_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); +@@ -5099,8 +5101,7 @@ static int gfx_v8_0_hw_fini(void *handle) + amdgpu_irq_put(adev, &adev->gfx.sq_irq, 0); + + /* disable KCQ to avoid CPC touch memory not valid anymore */ +- for (i = 0; i < adev->gfx.num_compute_rings; i++) +- gfx_v8_0_kcq_disable(&adev->gfx.kiq.ring, &adev->gfx.compute_ring[i]); ++ gfx_v8_0_kcq_disable(adev); + + if (amdgpu_sriov_vf(adev)) { + pr_debug("For SRIOV client, shouldn't do anything.\n"); +-- +2.7.4 + |