]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: add debugfs support for VM pagetable per client
authorSunil Khatri <sunil.khatri@amd.com>
Fri, 4 Jul 2025 07:55:47 +0000 (13:25 +0530)
committerChristian König <christian.koenig@amd.com>
Fri, 4 Jul 2025 14:00:06 +0000 (16:00 +0200)
Add a debugfs file under the client directory which shares
the root page table base address of the VM.

This address could be used to dump the pagetable for debug
memory issues.

Signed-off-by: Sunil Khatri <sunil.khatri@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Link: https://lore.kernel.org/r/20250704075548.1549849-4-sunil.khatri@amd.com
Signed-off-by: Christian König <christian.koenig@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c

index dac4b926e7beafcdc04fb7d6c0b47afc1f28f1dc..e49890a23ef6ed9c9c8601e83021c7a2f529d57b 100644 (file)
@@ -2131,6 +2131,55 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)
        return 0;
 }
 
+static int amdgpu_pt_info_read(struct seq_file *m, void *unused)
+{
+       struct drm_file *file;
+       struct amdgpu_fpriv *fpriv;
+       struct amdgpu_bo *root_bo;
+       int r;
+
+       file = m->private;
+       if (!file)
+               return -EINVAL;
+
+       fpriv = file->driver_priv;
+       if (!fpriv && !fpriv->vm.root.bo)
+               return -ENODEV;
+
+       root_bo = amdgpu_bo_ref(fpriv->vm.root.bo);
+       r = amdgpu_bo_reserve(root_bo, true);
+       if (r) {
+               amdgpu_bo_unref(&root_bo);
+               return -EINVAL;
+       }
+
+       seq_printf(m, "gpu_address: 0x%llx\n", amdgpu_bo_gpu_offset(fpriv->vm.root.bo));
+
+       amdgpu_bo_unreserve(root_bo);
+       amdgpu_bo_unref(&root_bo);
+
+       return 0;
+}
+
+static int amdgpu_pt_info_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, amdgpu_pt_info_read, inode->i_private);
+}
+
+static const struct file_operations amdgpu_pt_info_fops = {
+       .owner = THIS_MODULE,
+       .open = amdgpu_pt_info_open,
+       .read = seq_read,
+       .llseek = seq_lseek,
+       .release = single_release,
+};
+
+void amdgpu_debugfs_vm_init(struct drm_file *file)
+{
+       debugfs_create_file("vm_pagetable_info", 0444, file->debugfs_client, file,
+                           &amdgpu_pt_info_fops);
+}
+
 #else
 int amdgpu_debugfs_init(struct amdgpu_device *adev)
 {
@@ -2140,4 +2189,7 @@ int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
 {
        return 0;
 }
+void amdgpu_debugfs_vm_init(struct drm_file *file)
+{
+}
 #endif
index 0425432d8659ba304fdd1060fc0fbf569aac11f6..e7b3c38e518644f4aad34da34514398f231f4c00 100644 (file)
@@ -33,4 +33,5 @@ void amdgpu_debugfs_fence_init(struct amdgpu_device *adev);
 void amdgpu_debugfs_firmware_init(struct amdgpu_device *adev);
 void amdgpu_debugfs_gem_init(struct amdgpu_device *adev);
 void amdgpu_debugfs_mes_event_log_init(struct amdgpu_device *adev);
+void amdgpu_debugfs_vm_init(struct drm_file *file);
 
index d2ce7d86dbc8e9ce97f5125e14095cfebced4b7f..d555853c5717137d63c6f1aa108cd143a98e8e8f 100644 (file)
@@ -1395,6 +1395,8 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
        if (r)
                goto error_pasid;
 
+       amdgpu_debugfs_vm_init(file_priv);
+
        r = amdgpu_vm_init(adev, &fpriv->vm, fpriv->xcp_id);
        if (r)
                goto error_pasid;