OSDN Git Service

drm/amdgpu: centrally calls the .ras_fini function of all ras blocks
authoryipechai <YiPeng.Chai@amd.com>
Mon, 14 Feb 2022 07:46:32 +0000 (15:46 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 2 Mar 2022 23:40:05 +0000 (18:40 -0500)
centrally calls the .ras_fini function of all ras blocks.

Signed-off-by: yipechai <YiPeng.Chai@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_gmc.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
drivers/gpu/drm/amd/amdgpu/soc15.c

index 62083d3..65f1d3f 100644 (file)
@@ -454,17 +454,7 @@ int amdgpu_gmc_ras_late_init(struct amdgpu_device *adev)
 
 void amdgpu_gmc_ras_fini(struct amdgpu_device *adev)
 {
-       if (adev->umc.ras && adev->umc.ras->ras_block.ras_fini)
-               adev->umc.ras->ras_block.ras_fini(adev, adev->umc.ras_if);
 
-       if (adev->mmhub.ras && adev->mmhub.ras->ras_block.ras_fini)
-               adev->mmhub.ras->ras_block.ras_fini(adev, adev->mmhub.ras_if);
-
-       if (adev->gmc.xgmi.ras && adev->gmc.xgmi.ras->ras_block.ras_fini)
-               adev->gmc.xgmi.ras->ras_block.ras_fini(adev, adev->gmc.xgmi.ras_if);
-
-       if (adev->hdp.ras && adev->hdp.ras->ras_block.ras_fini)
-               adev->hdp.ras->ras_block.ras_fini(adev, adev->hdp.ras_if);
 }
 
        /*
index b53abc1..bbbf228 100644 (file)
@@ -2572,11 +2572,25 @@ int amdgpu_ras_pre_fini(struct amdgpu_device *adev)
 int amdgpu_ras_fini(struct amdgpu_device *adev)
 {
        struct amdgpu_ras_block_list *ras_node, *tmp;
+       struct amdgpu_ras_block_object *obj = NULL;
        struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
 
        if (!adev->ras_enabled || !con)
                return 0;
 
+       list_for_each_entry_safe(ras_node, tmp, &adev->ras_list, node) {
+               if (ras_node->ras_obj) {
+                       obj = ras_node->ras_obj;
+                       if (amdgpu_ras_is_supported(adev, obj->ras_comm.block) &&
+                           obj->ras_fini)
+                               obj->ras_fini(adev, &obj->ras_comm);
+               }
+
+               /* Clear ras blocks from ras_list and free ras block list node */
+               list_del(&ras_node->node);
+               kfree(ras_node);
+       }
+
        amdgpu_ras_fs_fini(adev);
        amdgpu_ras_interrupt_remove_all(adev);
 
@@ -2590,12 +2604,6 @@ int amdgpu_ras_fini(struct amdgpu_device *adev)
        amdgpu_ras_set_context(adev, NULL);
        kfree(con);
 
-       /* Clear ras blocks from ras_list and free ras block list node */
-       list_for_each_entry_safe(ras_node, tmp, &adev->ras_list, node) {
-               list_del(&ras_node->node);
-               kfree(ras_node);
-       }
-
        return 0;
 }
 
index e844696..dc6e6fe 100644 (file)
@@ -2432,9 +2432,6 @@ static int gfx_v9_0_sw_fini(void *handle)
        int i;
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
-       if (adev->gfx.ras && adev->gfx.ras->ras_block.ras_fini)
-               adev->gfx.ras->ras_block.ras_fini(adev, adev->gfx.ras_if);
-
        for (i = 0; i < adev->gfx.num_gfx_rings; i++)
                amdgpu_ring_fini(&adev->gfx.gfx_ring[i]);
        for (i = 0; i < adev->gfx.num_compute_rings; i++)
index 222d25a..d1d40bb 100644 (file)
@@ -1995,10 +1995,6 @@ static int sdma_v4_0_sw_fini(void *handle)
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int i;
 
-       if (adev->sdma.ras && adev->sdma.ras->ras_block.hw_ops &&
-               adev->sdma.ras->ras_block.ras_fini)
-               adev->sdma.ras->ras_block.ras_fini(adev, adev->sdma.ras_if);
-
        for (i = 0; i < adev->sdma.num_instances; i++) {
                amdgpu_ring_fini(&adev->sdma.instance[i].ring);
                if (adev->sdma.has_page_queue)
index 0631ebd..496c4a6 100644 (file)
@@ -1214,9 +1214,6 @@ static int soc15_common_sw_fini(void *handle)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
-       if (adev->nbio.ras && adev->nbio.ras->ras_block.ras_fini)
-               adev->nbio.ras->ras_block.ras_fini(adev, adev->nbio.ras_if);
-
        if (adev->df.funcs &&
            adev->df.funcs->sw_fini)
                adev->df.funcs->sw_fini(adev);