diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5220-drm-amdgpu-Refine-gfx_v9_0_kcq_disable-function.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/5220-drm-amdgpu-Refine-gfx_v9_0_kcq_disable-function.patch | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5220-drm-amdgpu-Refine-gfx_v9_0_kcq_disable-function.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5220-drm-amdgpu-Refine-gfx_v9_0_kcq_disable-function.patch new file mode 100644 index 00000000..ff7a7036 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5220-drm-amdgpu-Refine-gfx_v9_0_kcq_disable-function.patch @@ -0,0 +1,86 @@ +From 587223801033bd206dd5d3d449b86a3ad1034b3d 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 5220/5725] 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 cfe75dc..a581135 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +@@ -3221,28 +3221,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"); +@@ -3253,14 +3254,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.7.4 + |