diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3288-drm-amdgpu-Fix-TLB-invalidation-for-gfx7-and-gfx8.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3288-drm-amdgpu-Fix-TLB-invalidation-for-gfx7-and-gfx8.patch | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3288-drm-amdgpu-Fix-TLB-invalidation-for-gfx7-and-gfx8.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3288-drm-amdgpu-Fix-TLB-invalidation-for-gfx7-and-gfx8.patch new file mode 100644 index 00000000..3e5acc93 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3288-drm-amdgpu-Fix-TLB-invalidation-for-gfx7-and-gfx8.patch @@ -0,0 +1,60 @@ +From 548557b21e061b5b3d2da422903376d2b7591112 Mon Sep 17 00:00:00 2001 +From: Oak Zeng <Oak.Zeng@amd.com> +Date: Mon, 22 Jan 2018 15:28:21 -0500 +Subject: [PATCH 3288/4131] drm/amdgpu: Fix TLB invalidation for gfx7 and gfx8 + +Read VM_INVALIDATE_RESPONSE register to make sure TLB invalidation +is complete. However the value of ressponse register is ignored. +Polling and clear bit in response register can cause HW hang. Simply +read the register is enough to guarantee invalidation completion. + +Change-Id: I9f58dcc8e8cbdad3359c4181123a66ad00864ec7 +Signed-off-by: Oak Zeng <Oak.Zeng@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 2 ++ + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 2 ++ + 2 files changed, 4 insertions(+) + +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 3a4e5ed..fcc1add 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +@@ -852,6 +852,7 @@ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid) + if ((tmp & ATC_VMID0_PASID_MAPPING__VALID_MASK) && + (tmp & ATC_VMID0_PASID_MAPPING__PASID_MASK) == pasid) { + WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid); ++ RREG32(mmVM_INVALIDATE_RESPONSE); + break; + } + } +@@ -869,6 +870,7 @@ static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid) + } + + WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid); ++ RREG32(mmVM_INVALIDATE_RESPONSE); + return 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 aa23fa3..ea8e948 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c +@@ -830,6 +830,7 @@ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid) + if ((tmp & ATC_VMID0_PASID_MAPPING__VALID_MASK) && + (tmp & ATC_VMID0_PASID_MAPPING__PASID_MASK) == pasid) { + WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid); ++ RREG32(mmVM_INVALIDATE_RESPONSE); + break; + } + } +@@ -847,6 +848,7 @@ static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid) + } + + WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid); ++ RREG32(mmVM_INVALIDATE_RESPONSE); + return 0; + } + +-- +2.7.4 + |