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 a68338c..49ca8c8 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 b49c43b..05f01f5 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 7b52812..1befe80 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