]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: Add amdgpu_vcn_sched_mask debugfs
authorSathishkumar S <sathishkumar.sundararaju@amd.com>
Fri, 29 Nov 2024 04:17:47 +0000 (09:47 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 10 Dec 2024 15:26:50 +0000 (10:26 -0500)
Add debugfs entry to enable or disable job submission to
specific vcn instances. The entry is created only when
there is more than an instance and is unified queue type.

Signed-off-by: Sathishkumar S <sathishkumar.sundararaju@amd.com>
Reviewed-by: Jesse Zhang <jesse.zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h

index a68338cb7b4afb423cb0b2cac624c401a88da8de..49ca8c814455d35880087986502785edd5dc47c8 100644 (file)
@@ -2095,6 +2095,7 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)
        if (amdgpu_umsch_mm & amdgpu_umsch_mm_fwlog)
                amdgpu_debugfs_umsch_fwlog_init(adev, &adev->umsch_mm);
 
+       amdgpu_debugfs_vcn_sched_mask_init(adev);
        amdgpu_debugfs_jpeg_sched_mask_init(adev);
        amdgpu_debugfs_gfx_sched_mask_init(adev);
        amdgpu_debugfs_compute_sched_mask_init(adev);
index b49c43b9fdc3eb06b140cfaa83ea95a781d7c469..05f01f50194bccd0c661e091b309a8df5aea4bf1 100644 (file)
@@ -1320,3 +1320,71 @@ void amdgpu_vcn_sysfs_reset_mask_fini(struct amdgpu_device *adev)
                        device_remove_file(adev->dev, &dev_attr_vcn_reset_mask);
        }
 }
+
+/*
+ * debugfs to enable/disable vcn job submission to specific core or
+ * instance. It is created only if the queue type is unified.
+ */
+#if defined(CONFIG_DEBUG_FS)
+static int amdgpu_debugfs_vcn_sched_mask_set(void *data, u64 val)
+{
+       struct amdgpu_device *adev = (struct amdgpu_device *)data;
+       u32 i;
+       u64 mask;
+       struct amdgpu_ring *ring;
+
+       if (!adev)
+               return -ENODEV;
+
+       mask = (1ULL << adev->vcn.num_vcn_inst) - 1;
+       if ((val & mask) == 0)
+               return -EINVAL;
+       for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
+               ring = &adev->vcn.inst[i].ring_enc[0];
+               if (val & (1ULL << i))
+                       ring->sched.ready = true;
+               else
+                       ring->sched.ready = false;
+       }
+       /* publish sched.ready flag update effective immediately across smp */
+       smp_rmb();
+       return 0;
+}
+
+static int amdgpu_debugfs_vcn_sched_mask_get(void *data, u64 *val)
+{
+       struct amdgpu_device *adev = (struct amdgpu_device *)data;
+       u32 i;
+       u64 mask = 0;
+       struct amdgpu_ring *ring;
+
+       if (!adev)
+               return -ENODEV;
+       for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
+               ring = &adev->vcn.inst[i].ring_enc[0];
+               if (ring->sched.ready)
+                       mask |= 1ULL << i;
+               }
+       *val = mask;
+       return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_debugfs_vcn_sched_mask_fops,
+                        amdgpu_debugfs_vcn_sched_mask_get,
+                        amdgpu_debugfs_vcn_sched_mask_set, "%llx\n");
+#endif
+
+void amdgpu_debugfs_vcn_sched_mask_init(struct amdgpu_device *adev)
+{
+#if defined(CONFIG_DEBUG_FS)
+       struct drm_minor *minor = adev_to_drm(adev)->primary;
+       struct dentry *root = minor->debugfs_root;
+       char name[32];
+
+       if (adev->vcn.num_vcn_inst <= 1 || !adev->vcn.using_unified_queue)
+               return;
+       sprintf(name, "amdgpu_vcn_sched_mask");
+       debugfs_create_file(name, 0600, root, adev,
+                           &amdgpu_debugfs_vcn_sched_mask_fops);
+#endif
+}
index 7b528123b36e532e4c30750568189b47640c8cb4..1befe802a36f9afd3191028c6066041c232367ae 100644 (file)
@@ -523,5 +523,6 @@ int amdgpu_vcn_psp_update_sram(struct amdgpu_device *adev, int inst_idx,
 int amdgpu_vcn_save_vcpu_bo(struct amdgpu_device *adev);
 int amdgpu_vcn_sysfs_reset_mask_init(struct amdgpu_device *adev);
 void amdgpu_vcn_sysfs_reset_mask_fini(struct amdgpu_device *adev);
+void amdgpu_debugfs_vcn_sched_mask_init(struct amdgpu_device *adev);
 
 #endif