From ae35de33f3f1edaf9264cd1fab006a976c72df82 Mon Sep 17 00:00:00 2001 From: Yong Zhao 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 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