aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1110-drm-amdgpu-set-the-executable-flag-on-unused-Vega10-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1110-drm-amdgpu-set-the-executable-flag-on-unused-Vega10-.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1110-drm-amdgpu-set-the-executable-flag-on-unused-Vega10-.patch96
1 files changed, 96 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1110-drm-amdgpu-set-the-executable-flag-on-unused-Vega10-.patch b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1110-drm-amdgpu-set-the-executable-flag-on-unused-Vega10-.patch
new file mode 100644
index 00000000..444d02ec
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/1110-drm-amdgpu-set-the-executable-flag-on-unused-Vega10-.patch
@@ -0,0 +1,96 @@
+From 27198bf3bc9fea9792c8780a73cd0bfa5e848304 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Wed, 12 Dec 2018 15:13:10 +0100
+Subject: [PATCH 1110/2940] drm/amdgpu: set the executable flag on unused
+ Vega10 PTEs v2
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Otherwise we run into a non-retry fault on access.
+
+It seems to be a hardware bug that the executable bit has
+higher priority than the valid bit.
+
+v2: handle clears as well
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 36 ++++++++++++++++++--------
+ 1 file changed, 25 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+index 29127438510f..6c4c5bb93995 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+@@ -799,9 +799,16 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,
+ addr += ats_entries * 8;
+ }
+
+- if (entries)
++ if (entries) {
++ uint64_t value = 0;
++
++ /* Workaround for fault priority problem on GMC9 */
++ if (level == AMDGPU_VM_PTB && adev->asic_type >= CHIP_VEGA10)
++ value = AMDGPU_PTE_EXECUTABLE;
++
+ amdgpu_vm_set_pte_pde(adev, &job->ibs[0], addr, 0,
+- entries, 0, 0);
++ entries, 0, value);
++ }
+
+ amdgpu_ring_pad_ib(ring, &job->ibs[0]);
+
+@@ -1506,20 +1513,27 @@ int amdgpu_vm_update_directories(struct amdgpu_device *adev,
+ }
+
+ /**
+- * amdgpu_vm_update_huge - figure out parameters for PTE updates
++ * amdgpu_vm_update_flags - figure out flags for PTE updates
+ *
+ * Make sure to set the right flags for the PTEs at the desired level.
+ */
+-static void amdgpu_vm_update_huge(struct amdgpu_pte_update_params *params,
+- struct amdgpu_bo *bo, unsigned level,
+- uint64_t pe, uint64_t addr,
+- unsigned count, uint32_t incr,
+- uint64_t flags)
++static void amdgpu_vm_update_flags(struct amdgpu_pte_update_params *params,
++ struct amdgpu_bo *bo, unsigned level,
++ uint64_t pe, uint64_t addr,
++ unsigned count, uint32_t incr,
++ uint64_t flags)
+
+ {
+ if (level != AMDGPU_VM_PTB) {
+ flags |= AMDGPU_PDE_PTE;
+ amdgpu_gmc_get_vm_pde(params->adev, level, &addr, &flags);
++
++ } else if (params->adev->asic_type >= CHIP_VEGA10 &&
++ !(flags & AMDGPU_PTE_VALID) &&
++ !(flags & AMDGPU_PTE_PRT)) {
++
++ /* Workaround for fault priority problem on GMC9 */
++ flags |= AMDGPU_PTE_EXECUTABLE;
+ }
+
+ amdgpu_vm_update_func(params, bo, pe, addr, count, incr, flags);
+@@ -1668,9 +1682,9 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,
+ uint64_t upd_end = min(entry_end, frag_end);
+ unsigned nptes = (upd_end - frag_start) >> shift;
+
+- amdgpu_vm_update_huge(params, pt, cursor.level,
+- pe_start, dst, nptes, incr,
+- flags | AMDGPU_PTE_FRAG(frag));
++ amdgpu_vm_update_flags(params, pt, cursor.level,
++ pe_start, dst, nptes, incr,
++ flags | AMDGPU_PTE_FRAG(frag));
+
+ pe_start += nptes * 8;
+ dst += (uint64_t)nptes * AMDGPU_GPU_PAGE_SIZE << shift;
+--
+2.17.1
+