From ffcdc0fed91641f126c98038f96a11310b839ce1 Mon Sep 17 00:00:00 2001 From: Yong Zhao Date: Fri, 12 Jan 2018 13:53:29 -0500 Subject: [PATCH 3181/4131] drm/amdkfd: Use legacy mode to do tlb invalidation After clarifying with UTCL2 team, legacy mode suffices our use cases. In addition, on Raven there is a HW bug for anything but legacy mode when MMHUB power gating is enabled. Therefore, we should all use legacy mode. Change-Id: Ibc6b80f16b414180e07bc148f18df9fa962b9e0d Signed-off-by: Yong Zhao --- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c index 8eae0a7..25aa7ce 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c @@ -920,7 +920,7 @@ static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid) { struct amdgpu_device *adev = (struct amdgpu_device *) kgd; uint32_t req = (1 << vmid) | - (1 << VM_INVALIDATE_ENG16_REQ__FLUSH_TYPE__SHIFT) | /* light */ + (0 << VM_INVALIDATE_ENG16_REQ__FLUSH_TYPE__SHIFT) | /* legacy */ VM_INVALIDATE_ENG16_REQ__INVALIDATE_L2_PTES_MASK | VM_INVALIDATE_ENG16_REQ__INVALIDATE_L2_PDE0_MASK | VM_INVALIDATE_ENG16_REQ__INVALIDATE_L2_PDE1_MASK | @@ -929,7 +929,13 @@ static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid) spin_lock(&adev->tlb_invalidation_lock); - /* Use light weight invalidation. + /* Use legacy mode tlb invalidation. + * + * Currently on Raven the code below is broken for anything but + * legacy mode due to a MMHUB power gating problem. A workaround + * is for MMHUB to wait until the condition PER_VMID_INVALIDATE_REQ + * == PER_VMID_INVALIDATE_ACK instead of simply waiting for the ack + * bit. * * TODO 1: agree on the right set of invalidation registers for * KFD use. Use the last one for now. Invalidate both GC and @@ -980,7 +986,7 @@ static int invalidate_tlbs_with_kiq(struct amdgpu_device *adev, uint16_t pasid) PACKET3_INVALIDATE_TLBS_DST_SEL(1) | PACKET3_INVALIDATE_TLBS_ALL_HUB(1) | PACKET3_INVALIDATE_TLBS_PASID(pasid) | - PACKET3_INVALIDATE_TLBS_FLUSH_TYPE(2)); + PACKET3_INVALIDATE_TLBS_FLUSH_TYPE(0)); /* legacy */ amdgpu_fence_emit_polling(ring, &seq); amdgpu_ring_commit(ring); spin_unlock(&adev->gfx.kiq.ring_lock); -- 2.7.4