drm/amdgpu: Only create err_count sysfs when hw_op is supported
authorHawking Zhang <Hawking.Zhang@amd.com>
Mon, 31 Jul 2023 15:43:12 +0000 (23:43 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 7 Aug 2023 21:12:49 +0000 (17:12 -0400)
Some IP blocks only support partial ras feature and don't
have ras counter and/or ras error status register at all.
Driver should not create err_count sysfs node for those
IP blocks.

Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Tao Zhou <tao.zhou1@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c

index 62011a5..fa53a51 100644 (file)
@@ -2777,23 +2777,28 @@ int amdgpu_ras_block_late_init(struct amdgpu_device *adev,
                        goto cleanup;
        }
 
-       r = amdgpu_ras_sysfs_create(adev, ras_block);
-       if (r)
-               goto interrupt;
+       if (ras_obj->hw_ops &&
+           (ras_obj->hw_ops->query_ras_error_count ||
+            ras_obj->hw_ops->query_ras_error_status)) {
+               r = amdgpu_ras_sysfs_create(adev, ras_block);
+               if (r)
+                       goto interrupt;
 
-       /* Those are the cached values at init.
-        */
-       query_info = kzalloc(sizeof(struct ras_query_if), GFP_KERNEL);
-       if (!query_info)
-               return -ENOMEM;
-       memcpy(&query_info->head, ras_block, sizeof(struct ras_common_if));
+               /* Those are the cached values at init.
+                */
+               query_info = kzalloc(sizeof(*query_info), GFP_KERNEL);
+               if (!query_info)
+                       return -ENOMEM;
+               memcpy(&query_info->head, ras_block, sizeof(struct ras_common_if));
 
-       if (amdgpu_ras_query_error_count(adev, &ce_count, &ue_count, query_info) == 0) {
-               atomic_set(&con->ras_ce_count, ce_count);
-               atomic_set(&con->ras_ue_count, ue_count);
+               if (amdgpu_ras_query_error_count(adev, &ce_count, &ue_count, query_info) == 0) {
+                       atomic_set(&con->ras_ce_count, ce_count);
+                       atomic_set(&con->ras_ue_count, ue_count);
+               }
+
+               kfree(query_info);
        }
 
-       kfree(query_info);
        return 0;
 
 interrupt: