aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/1602-drm-amdkfd-Fix-a-bug-that-stored-VM-fault-info-may-b.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/1602-drm-amdkfd-Fix-a-bug-that-stored-VM-fault-info-may-b.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/1602-drm-amdkfd-Fix-a-bug-that-stored-VM-fault-info-may-b.patch123
1 files changed, 123 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/1602-drm-amdkfd-Fix-a-bug-that-stored-VM-fault-info-may-b.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/1602-drm-amdkfd-Fix-a-bug-that-stored-VM-fault-info-may-b.patch
new file mode 100644
index 00000000..72b57c0e
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/1602-drm-amdkfd-Fix-a-bug-that-stored-VM-fault-info-may-b.patch
@@ -0,0 +1,123 @@
+From ae35de33f3f1edaf9264cd1fab006a976c72df82 Mon Sep 17 00:00:00 2001
+From: Yong Zhao <yong.zhao@amd.com>
+Date: Fri, 13 Jan 2017 17:31:56 -0500
+Subject: [PATCH 1602/4131] drm/amdkfd: Fix a bug that stored VM fault info may
+ be wrong
+
+We should only store the VM fault info when it is from KFD.
+
+Change-Id: Ie1a84c2455d279a81a039172b8bdb8d565825b48
+Signed-off-by: Yong Zhao <yong.zhao@amd.com>
+
+ Conflicts:
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 15 ++++++++++++++-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 3 +++
+ drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 5 ++++-
+ drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 7 +++++--
+ 4 files changed, 26 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+index fff1b85..a30b616 100755
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+@@ -36,6 +36,8 @@ const struct kfd2kgd_calls *kfd2kgd;
+ const struct kgd2kfd_calls *kgd2kfd;
+ bool (*kgd2kfd_init_p)(unsigned, const struct kgd2kfd_calls**);
+
++unsigned int global_compute_vmid_bitmap = 0xFF00;
++
+ int amdgpu_amdkfd_init(void)
+ {
+ int ret;
+@@ -108,7 +110,7 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
+ int last_valid_bit;
+ if (adev->kfd) {
+ struct kgd2kfd_shared_resources gpu_resources = {
+- .compute_vmid_bitmap = 0xFF00,
++ .compute_vmid_bitmap = global_compute_vmid_bitmap,
+ .num_pipe_per_mec = adev->gfx.mec.num_pipe_per_mec,
+ .num_queue_per_pipe = adev->gfx.mec.num_queue_per_pipe,
+ .gpuvm_size = (uint64_t)amdgpu_vm_size << 30
+@@ -629,3 +631,14 @@ bool read_user_wptr(struct mm_struct *mm, uint32_t __user *wptr,
+
+ return wptr_valid;
+ }
++
++bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev,
++ u32 vmid)
++{
++ if (adev->kfd) {
++ if ((1 << vmid) & global_compute_vmid_bitmap)
++ return true;
++ }
++
++ return false;
++}
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+index bbed772..0dff746 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+@@ -144,6 +144,9 @@ int amdgpu_amdkfd_copy_mem_to_mem(struct kgd_dev *kgd, struct kgd_mem *src_mem,
+ uint64_t dest_offset, uint64_t size, struct fence **f,
+ uint64_t *actual_size);
+
++bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev,
++ u32 vmid);
++
+ /* Shared API */
+ int map_bo(struct amdgpu_device *rdev, uint64_t va, void *vm,
+ struct amdgpu_bo *bo, struct amdgpu_bo_va **bo_va);
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+index 91f9ea4..9595023 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+@@ -746,6 +746,8 @@ static void gmc_v7_0_gart_fini(struct amdgpu_device *adev)
+ * @adev: amdgpu_device pointer
+ * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
+ * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
++ * @mc_client: VM_CONTEXT1_PROTECTION_FAULT_MCCLIENT register value
++ * @src_id: interrupt source id
+ *
+ * Print human readable fault information (CIK).
+ */
+@@ -769,7 +771,8 @@ static void gmc_v7_0_vm_decode_fault(struct amdgpu_device *adev,
+ MEMORY_CLIENT_RW) ?
+ "write" : "read", block, mc_client, mc_id);
+
+- if (!atomic_read(&adev->mc.vm_fault_info_updated)) {
++ if (amdgpu_amdkfd_is_kfd_vmid(adev, vmid)
++ && !atomic_read(&adev->mc.vm_fault_info_updated)) {
+ info->vmid = vmid;
+ info->mc_id = mc_id;
+ info->page_addr = addr;
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+index 4e5003c..cb3fe87 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+@@ -966,8 +966,10 @@ static void gmc_v8_0_gart_fini(struct amdgpu_device *adev)
+ * @adev: amdgpu_device pointer
+ * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value
+ * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value
++ * @mc_client: VM_CONTEXT1_PROTECTION_FAULT_MCCLIENT register value
++ * @src_id: interrupt source id
+ *
+- * Print human readable fault information (CIK).
++ * Print human readable fault information (VI).
+ */
+ static void gmc_v8_0_vm_decode_fault(struct amdgpu_device *adev,
+ u32 status, u32 addr, u32 mc_client)
+@@ -989,7 +991,8 @@ static void gmc_v8_0_vm_decode_fault(struct amdgpu_device *adev,
+ MEMORY_CLIENT_RW) ?
+ "write" : "read", block, mc_client, mc_id);
+
+- if (!atomic_read(&adev->mc.vm_fault_info_updated)) {
++ if (amdgpu_amdkfd_is_kfd_vmid(adev, vmid)
++ && !atomic_read(&adev->mc.vm_fault_info_updated)) {
+ info->vmid = vmid;
+ info->mc_id = mc_id;
+ info->page_addr = addr;
+--
+2.7.4
+