]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amdgpu: add reset sources in gpu reset context
authorEric Huang <jinhuieric.huang@amd.com>
Mon, 3 Jun 2024 15:56:03 +0000 (11:56 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 5 Jun 2024 15:25:13 +0000 (11:25 -0400)
reset source or reset cause is very useful info
for reset context, it will be used by events API.

Suggested-by: Lijo Lazar <Lijo.Lazar@amd.com>
Signed-off-by: Eric Huang <jinhuieric.huang@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c
drivers/gpu/drm/amd/amdgpu/amdgpu_reset.h

index bfdde772b7ee04dd160f3872b6ec216318074ffb..9deb41d61e8d1d0cde363c4181441923a4de719a 100644 (file)
@@ -160,3 +160,37 @@ void amdgpu_device_unlock_reset_domain(struct amdgpu_reset_domain *reset_domain)
        atomic_set(&reset_domain->in_gpu_reset, 0);
        up_write(&reset_domain->sem);
 }
+
+void amdgpu_reset_get_desc(struct amdgpu_reset_context *rst_ctxt, char *buf,
+                          size_t len)
+{
+       struct amdgpu_ring *ring;
+
+       if (!buf || !len)
+               return;
+
+       switch (rst_ctxt->src) {
+       case AMDGPU_RESET_SRC_JOB:
+               if (rst_ctxt->job) {
+                       ring = amdgpu_job_ring(rst_ctxt->job);
+                       snprintf(buf, len, "job hang on ring:%s", ring->name);
+               } else {
+                       strscpy(buf, "job hang", len);
+               }
+               break;
+       case AMDGPU_RESET_SRC_RAS:
+               strscpy(buf, "RAS error", len);
+               break;
+       case AMDGPU_RESET_SRC_MES:
+               strscpy(buf, "MES hang", len);
+               break;
+       case AMDGPU_RESET_SRC_HWS:
+               strscpy(buf, "HWS hang", len);
+               break;
+       case AMDGPU_RESET_SRC_USER:
+               strscpy(buf, "user trigger", len);
+               break;
+       default:
+               strscpy(buf, "unknown", len);
+       }
+}
index 5a9cc043b858386c1806465a342ea0e5ae9fb52c..4ae581f3fcb54b60701a226d18951b1cb416e84e 100644 (file)
@@ -36,6 +36,15 @@ enum AMDGPU_RESET_FLAGS {
        AMDGPU_HOST_FLR = 3,
 };
 
+enum AMDGPU_RESET_SRCS {
+       AMDGPU_RESET_SRC_UNKNOWN,
+       AMDGPU_RESET_SRC_JOB,
+       AMDGPU_RESET_SRC_RAS,
+       AMDGPU_RESET_SRC_MES,
+       AMDGPU_RESET_SRC_HWS,
+       AMDGPU_RESET_SRC_USER,
+};
+
 struct amdgpu_reset_context {
        enum amd_reset_method method;
        struct amdgpu_device *reset_req_dev;
@@ -43,6 +52,7 @@ struct amdgpu_reset_context {
        struct amdgpu_hive_info *hive;
        struct list_head *reset_device_list;
        unsigned long flags;
+       enum AMDGPU_RESET_SRCS src;
 };
 
 struct amdgpu_reset_handler {
@@ -130,6 +140,9 @@ void amdgpu_device_lock_reset_domain(struct amdgpu_reset_domain *reset_domain);
 
 void amdgpu_device_unlock_reset_domain(struct amdgpu_reset_domain *reset_domain);
 
+void amdgpu_reset_get_desc(struct amdgpu_reset_context *rst_ctxt, char *buf,
+                          size_t len);
+
 #define for_each_handler(i, handler, reset_ctl)                  \
        for (i = 0; (i < AMDGPU_RESET_MAX_HANDLERS) &&           \
                    (handler = (*reset_ctl->reset_handlers)[i]); \