From: "Jesse.Zhang" <jesse.zh...@amd.com>

fix the issue:
"amdgpu: Failed to create process VM object".

[Why]when amdgpu initialized, seq64 do mampping and update bo mapping in vm 
page table.
But when clifo run. It also initializes a vm for a process device through the 
function kfd_process_device_init_vm
and ensure the root PD is clean through the function amdgpu_vm_pt_is_root_clean.
So they have a conflict, and clinfo  always failed.

[HOW]
Skip the seq64 entry check in vm page table.

Signed-off-by: Jesse Zhang <jesse.zh...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c
index a160265ddc07..bdae5381887e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c
@@ -746,8 +746,21 @@ bool amdgpu_vm_pt_is_root_clean(struct amdgpu_device *adev,
        enum amdgpu_vm_level root = adev->vm_manager.root_level;
        unsigned int entries = amdgpu_vm_pt_num_entries(adev, root);
        unsigned int i = 0;
+       u64 seq64_addr = (adev->vm_manager.max_pfn << AMDGPU_GPU_PAGE_SHIFT) - 
AMDGPU_VA_RESERVED_TOP;
+
+       seq64_addr /= AMDGPU_GPU_PAGE_SIZE;
+       mask = amdgpu_vm_pt_entries_mask(adev, adev->vm_manager.root_level);
+       shift = amdgpu_vm_pt_level_shift(adev, adev->vm_manager.root_level);
+       seq64_entry = (seq64_addr >> shift) & mask;
 
        for (i = 0; i < entries; i++) {
+               /* seq64  reserve 2M memory from top of address space.
+                * Then do the mapping and update the vm page table at amdgpu 
initialize.
+                * So skip the know result.
+                */
+
+               if(i == seq64_entry)
+                       continue;
                if (to_amdgpu_bo_vm(vm->root.bo)->entries[i].bo)
                        return false;
        }
-- 
2.34.1

Reply via email to