drm/amdgpu: move aca/mca init functions into ras_init() stage
authorYang Wang <kevinyang.wang@amd.com>
Tue, 4 Jun 2024 08:30:41 +0000 (16:30 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 14 Jun 2024 20:17:12 +0000 (16:17 -0400)
adjust the function position to better match aca/mca fini code in ras_fini().

Signed-off-by: Yang Wang <kevinyang.wang@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_aca.c
drivers/gpu/drm/amd/amdgpu/amdgpu_aca.h
drivers/gpu/drm/amd/amdgpu/amdgpu_mca.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c

index 01d50ad603d3876af70b0e7a18e987e8e072bb64..04515c1c7241e433920ea9c6caee0288b9d7748f 100644 (file)
@@ -712,6 +712,15 @@ void amdgpu_aca_fini(struct amdgpu_device *adev)
        atomic_set(&aca->ue_update_flag, 0);
 }
 
+int amdgpu_aca_reset(struct amdgpu_device *adev)
+{
+       struct amdgpu_aca *aca = &adev->aca;
+
+       atomic_set(&aca->ue_update_flag, 0);
+
+       return 0;
+}
+
 void amdgpu_aca_set_smu_funcs(struct amdgpu_device *adev, const struct aca_smu_funcs *smu_funcs)
 {
        struct amdgpu_aca *aca = &adev->aca;
@@ -885,9 +894,7 @@ DEFINE_DEBUGFS_ATTRIBUTE(aca_debug_mode_fops, NULL, amdgpu_aca_smu_debug_mode_se
 void amdgpu_aca_smu_debugfs_init(struct amdgpu_device *adev, struct dentry *root)
 {
 #if defined(CONFIG_DEBUG_FS)
-       if (!root ||
-           (adev->ip_versions[MP1_HWIP][0] != IP_VERSION(13, 0, 6) &&
-            adev->ip_versions[MP1_HWIP][0] != IP_VERSION(13, 0, 14)))
+       if (!root)
                return;
 
        debugfs_create_file("aca_debug_mode", 0200, root, adev, &aca_debug_mode_fops);
index 4327ce1ceacf7b2f0de1cea7b4e22abadf22ca03..ba724c2a997d3298320f94f519cc43143332e233 100644 (file)
@@ -192,6 +192,7 @@ struct aca_info {
 
 int amdgpu_aca_init(struct amdgpu_device *adev);
 void amdgpu_aca_fini(struct amdgpu_device *adev);
+int amdgpu_aca_reset(struct amdgpu_device *adev);
 void amdgpu_aca_set_smu_funcs(struct amdgpu_device *adev, const struct aca_smu_funcs *smu_funcs);
 bool amdgpu_aca_is_enabled(struct amdgpu_device *adev);
 
index da40c2d97df8a2b1196ac10fd8374b7b568b02f8..c7e602d69f2cb0774e31606f1a1fde7d32c30dea 100644 (file)
@@ -193,27 +193,26 @@ static int amdgpu_mca_bank_set_merge(struct mca_bank_set *mca_set, struct mca_ba
        return 0;
 }
 
-static int amdgpu_mca_bank_set_remove_node(struct mca_bank_set *mca_set, struct mca_bank_node *node)
+static void amdgpu_mca_bank_set_remove_node(struct mca_bank_set *mca_set, struct mca_bank_node *node)
 {
        if (!node)
-               return -EINVAL;
+               return;
 
        list_del(&node->node);
        kvfree(node);
 
        mca_set->nr_entries--;
-
-       return 0;
 }
 
 static void amdgpu_mca_bank_set_release(struct mca_bank_set *mca_set)
 {
        struct mca_bank_node *node, *tmp;
 
-       list_for_each_entry_safe(node, tmp, &mca_set->list, node) {
-               list_del(&node->node);
-               kvfree(node);
-       }
+       if (list_empty(&mca_set->list))
+               return;
+
+       list_for_each_entry_safe(node, tmp, &mca_set->list, node)
+               amdgpu_mca_bank_set_remove_node(mca_set, node);
 }
 
 void amdgpu_mca_smu_init_funcs(struct amdgpu_device *adev, const struct amdgpu_mca_smu_funcs *mca_funcs)
@@ -608,9 +607,7 @@ DEFINE_DEBUGFS_ATTRIBUTE(mca_debug_mode_fops, NULL, amdgpu_mca_smu_debug_mode_se
 void amdgpu_mca_smu_debugfs_init(struct amdgpu_device *adev, struct dentry *root)
 {
 #if defined(CONFIG_DEBUG_FS)
-       if (!root ||
-           (amdgpu_ip_version(adev, MP1_HWIP, 0) != IP_VERSION(13, 0, 6) &&
-            amdgpu_ip_version(adev, MP1_HWIP, 0) != IP_VERSION(13, 0, 14)))
+       if (!root)
                return;
 
        debugfs_create_file("mca_debug_mode", 0200, root, adev, &mca_debug_mode_fops);
index fd6a06bd2683232c3e7ff517a8f0cc753bf7234a..2dffce25e2738d0a3a40d6af040c8c9b076c031e 100644 (file)
@@ -1911,6 +1911,23 @@ static void amdgpu_ras_debugfs_create(struct amdgpu_device *adev,
                            obj, &amdgpu_ras_debugfs_ops);
 }
 
+static bool amdgpu_ras_aca_is_supported(struct amdgpu_device *adev)
+{
+       bool ret;
+
+       switch (amdgpu_ip_version(adev, MP0_HWIP, 0)) {
+       case IP_VERSION(13, 0, 6):
+       case IP_VERSION(13, 0, 14):
+               ret = true;
+               break;
+       default:
+               ret = false;
+               break;
+       }
+
+       return ret;
+}
+
 void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
 {
        struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
@@ -1937,10 +1954,12 @@ void amdgpu_ras_debugfs_create_all(struct amdgpu_device *adev)
                }
        }
 
-       if (amdgpu_aca_is_enabled(adev))
-               amdgpu_aca_smu_debugfs_init(adev, dir);
-       else
-               amdgpu_mca_smu_debugfs_init(adev, dir);
+       if (amdgpu_ras_aca_is_supported(adev)) {
+               if (amdgpu_aca_is_enabled(adev))
+                       amdgpu_aca_smu_debugfs_init(adev, dir);
+               else
+                       amdgpu_mca_smu_debugfs_init(adev, dir);
+       }
 }
 
 /* debugfs end */
@@ -3428,6 +3447,15 @@ int amdgpu_ras_init(struct amdgpu_device *adev)
                goto release_con;
        }
 
+       if (amdgpu_ras_aca_is_supported(adev)) {
+               if (amdgpu_aca_is_enabled(adev))
+                       r = amdgpu_aca_init(adev);
+               else
+                       r = amdgpu_mca_init(adev);
+               if (r)
+                       goto release_con;
+       }
+
        dev_info(adev->dev, "RAS INFO: ras initialized successfully, "
                 "hardware ability[%x] ras_mask[%x]\n",
                 adev->ras_hw_enabled, adev->ras_enabled);
@@ -3636,25 +3664,22 @@ int amdgpu_ras_late_init(struct amdgpu_device *adev)
 
        amdgpu_ras_event_mgr_init(adev);
 
-       if (amdgpu_aca_is_enabled(adev)) {
-               if (!amdgpu_in_reset(adev)) {
-                       r = amdgpu_aca_init(adev);
+       if (amdgpu_ras_aca_is_supported(adev)) {
+               if (amdgpu_in_reset(adev)) {
+                       if (amdgpu_aca_is_enabled(adev))
+                               r = amdgpu_aca_reset(adev);
+                       else
+                               r = amdgpu_mca_reset(adev);
                        if (r)
                                return r;
                }
 
-               if (!amdgpu_sriov_vf(adev))
-                       amdgpu_ras_set_aca_debug_mode(adev, false);
-       } else {
-               if (amdgpu_in_reset(adev))
-                       r = amdgpu_mca_reset(adev);
-               else
-                       r = amdgpu_mca_init(adev);
-               if (r)
-                       return r;
-
-               if (!amdgpu_sriov_vf(adev))
-                       amdgpu_ras_set_mca_debug_mode(adev, false);
+               if (!amdgpu_sriov_vf(adev)) {
+                       if (amdgpu_aca_is_enabled(adev))
+                               amdgpu_ras_set_aca_debug_mode(adev, false);
+                       else
+                               amdgpu_ras_set_mca_debug_mode(adev, false);
+               }
        }
 
        /* Guest side doesn't need init ras feature */
@@ -3728,10 +3753,12 @@ int amdgpu_ras_fini(struct amdgpu_device *adev)
        amdgpu_ras_fs_fini(adev);
        amdgpu_ras_interrupt_remove_all(adev);
 
-       if (amdgpu_aca_is_enabled(adev))
-               amdgpu_aca_fini(adev);
-       else
-               amdgpu_mca_fini(adev);
+       if (amdgpu_ras_aca_is_supported(adev)) {
+               if (amdgpu_aca_is_enabled(adev))
+                       amdgpu_aca_fini(adev);
+               else
+                       amdgpu_mca_fini(adev);
+       }
 
        WARN(AMDGPU_RAS_GET_FEATURES(con->features), "Feature mask is not cleared");