drm/amdgpu: SW part of MES event log enablement
authorshaoyunl <shaoyun.liu@amd.com>
Thu, 23 Nov 2023 18:59:44 +0000 (13:59 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 7 Dec 2023 22:43:13 +0000 (17:43 -0500)
This is the generic SW part, prepare the event log buffer and dump it through debugfs

Signed-off-by: shaoyunl <shaoyun.liu@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@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_debugfs.h
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h

index c480192e33f56c1404684e1ffb78e153d4afe78e..424bed7382965f23583b52930acc861b88705546 100644 (file)
@@ -2147,6 +2147,8 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)
        amdgpu_debugfs_firmware_init(adev);
        amdgpu_ta_if_debugfs_init(adev);
 
+       amdgpu_debugfs_mes_event_log_init(adev);
+
 #if defined(CONFIG_DRM_AMD_DC)
        if (adev->dc_enabled)
                dtn_debugfs_init(adev);
index 371a6f0deb2998f6e17969b56d42fd52bfc0155c..0425432d8659ba304fdd1060fc0fbf569aac11f6 100644 (file)
@@ -32,3 +32,5 @@ void amdgpu_debugfs_fini(struct amdgpu_device *adev);
 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);
+
index 9ddbf1494326a0d7e6606f6f25fe06f32333917b..e544b823abf6cc7c3254dc58b935fa1d4f090416 100644 (file)
@@ -98,6 +98,26 @@ static int amdgpu_mes_doorbell_init(struct amdgpu_device *adev)
        return 0;
 }
 
+static int amdgpu_mes_event_log_init(struct amdgpu_device *adev)
+{
+       int r;
+
+       r = amdgpu_bo_create_kernel(adev, PAGE_SIZE, PAGE_SIZE,
+                                   AMDGPU_GEM_DOMAIN_GTT,
+                                   &adev->mes.event_log_gpu_obj,
+                                   &adev->mes.event_log_gpu_addr,
+                                   &adev->mes.event_log_cpu_addr);
+       if (r) {
+               dev_warn(adev->dev, "failed to create MES event log buffer (%d)", r);
+               return r;
+       }
+
+       memset(adev->mes.event_log_cpu_addr, 0, PAGE_SIZE);
+
+       return  0;
+
+}
+
 static void amdgpu_mes_doorbell_free(struct amdgpu_device *adev)
 {
        bitmap_free(adev->mes.doorbell_bitmap);
@@ -182,8 +202,14 @@ int amdgpu_mes_init(struct amdgpu_device *adev)
        if (r)
                goto error;
 
+       r = amdgpu_mes_event_log_init(adev);
+       if (r)
+               goto error_doorbell;
+
        return 0;
 
+error_doorbell:
+       amdgpu_mes_doorbell_free(adev);
 error:
        amdgpu_device_wb_free(adev, adev->mes.sch_ctx_offs);
        amdgpu_device_wb_free(adev, adev->mes.query_status_fence_offs);
@@ -199,6 +225,10 @@ error_ids:
 
 void amdgpu_mes_fini(struct amdgpu_device *adev)
 {
+       amdgpu_bo_free_kernel(&adev->mes.event_log_gpu_obj,
+                             &adev->mes.event_log_gpu_addr,
+                             &adev->mes.event_log_cpu_addr);
+
        amdgpu_device_wb_free(adev, adev->mes.sch_ctx_offs);
        amdgpu_device_wb_free(adev, adev->mes.query_status_fence_offs);
        amdgpu_device_wb_free(adev, adev->mes.read_val_offs);
@@ -1479,3 +1509,34 @@ out:
        amdgpu_ucode_release(&adev->mes.fw[pipe]);
        return r;
 }
+
+#if defined(CONFIG_DEBUG_FS)
+
+static int amdgpu_debugfs_mes_event_log_show(struct seq_file *m, void *unused)
+{
+       struct amdgpu_device *adev = m->private;
+       uint32_t *mem = (uint32_t *)(adev->mes.event_log_cpu_addr);
+
+       seq_hex_dump(m, "", DUMP_PREFIX_OFFSET, 32, 4,
+                    mem, PAGE_SIZE, false);
+
+       return 0;
+}
+
+
+DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_mes_event_log);
+
+#endif
+
+void amdgpu_debugfs_mes_event_log_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;
+
+       debugfs_create_file("amdgpu_mes_event_log", 0444, root,
+                           adev, &amdgpu_debugfs_mes_event_log_fops);
+
+#endif
+}
index a27b424ffe0056a498b55b52c9b8453863748b19..894b9b1330009a970cf1661c0f3a81e020fc8d2f 100644 (file)
@@ -133,6 +133,11 @@ struct amdgpu_mes {
        uint32_t                        num_mes_dbs;
        unsigned long                   *doorbell_bitmap;
 
+       /* MES event log buffer */
+       struct amdgpu_bo                *event_log_gpu_obj;
+       uint64_t                        event_log_gpu_addr;
+       void                            *event_log_cpu_addr;
+
        /* ip specific functions */
        const struct amdgpu_mes_funcs   *funcs;
 };