[AMD Official Use Only - AMD Internal Distribution Only]

This patch look good for me,
Reviewed-by: Jesse Zhang <jesse.zh...@amd.com>

-----Original Message-----
From: amd-gfx <amd-gfx-boun...@lists.freedesktop.org> On Behalf Of Sathishkumar 
S
Sent: Tuesday, November 12, 2024 12:41 AM
To: amd-gfx@lists.freedesktop.org
Cc: Liu, Leo <leo....@amd.com>; Sundararaju, Sathishkumar 
<sathishkumar.sundarar...@amd.com>
Subject: [PATCH 2/2] drm/amdgpu: Add amdgpu_vcn_sched_mask debugfs

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.sundarar...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c     | 68 +++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h     |  1 +
 3 files changed, 70 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
index a68338cb7b4a..49ca8c814455 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
@@ -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);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 25f490ad3a85..9671dc8bbe9d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -1318,3 +1318,71 @@ void amdgpu_vcn_sysfs_reset_mask_fini(struct 
amdgpu_device *adev)
                drm_dev_exit(idx);
        }
 }
+
+/*
+ * 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
+}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
index 273a94a5472e..7ad944cea861 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
@@ -525,5 +525,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 
inst);  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
--
2.25.1

Reply via email to