Before making a function call to suspend, validate
the function pointer like we do in sw_init.

Use the helper function amdgpu_ip_block_suspend where
same checks and calls are repeated.

Signed-off-by: Sunil Khatri <sunil.kha...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/aldebaran.c      | 11 ++-----
 drivers/gpu/drm/amd/amdgpu/amdgpu.h         |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c  | 36 +++++++++++++--------
 drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c   |  7 +---
 drivers/gpu/drm/amd/amdgpu/sienna_cichlid.c | 10 ++----
 drivers/gpu/drm/amd/amdgpu/smu_v13_0_10.c   | 10 ++----
 6 files changed, 30 insertions(+), 45 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/aldebaran.c 
b/drivers/gpu/drm/amd/amdgpu/aldebaran.c
index c1ff24335a0c..07f195a89e9a 100644
--- a/drivers/gpu/drm/amd/amdgpu/aldebaran.c
+++ b/drivers/gpu/drm/amd/amdgpu/aldebaran.c
@@ -85,16 +85,9 @@ static int aldebaran_mode2_suspend_ip(struct amdgpu_device 
*adev)
                              AMD_IP_BLOCK_TYPE_SDMA))
                        continue;
 
-               r = 
adev->ip_blocks[i].version->funcs->suspend(&adev->ip_blocks[i]);
-
-               if (r) {
-                       dev_err(adev->dev,
-                               "suspend of IP block <%s> failed %d\n",
-                               adev->ip_blocks[i].version->funcs->name, r);
+               r = amdgpu_ip_block_suspend(&adev->ip_blocks[i]);
+               if (r)
                        return r;
-               }
-
-               adev->ip_blocks[i].status.hw = false;
        }
 
        return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 48c9b9b06905..df57efa019ba 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -364,6 +364,7 @@ int amdgpu_device_ip_wait_for_idle(struct amdgpu_device 
*adev,
                                   enum amd_ip_block_type block_type);
 bool amdgpu_device_ip_is_valid(struct amdgpu_device *adev,
                              enum amd_ip_block_type block_type);
+int amdgpu_ip_block_suspend(struct amdgpu_ip_block *ip_block);
 
 #define AMDGPU_MAX_IP_NUM 16
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index b7277bef7463..fdfa8980ff0f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -272,6 +272,24 @@ void amdgpu_reg_state_sysfs_fini(struct amdgpu_device 
*adev)
        sysfs_remove_bin_file(&adev->dev->kobj, &bin_attr_reg_state);
 }
 
+int amdgpu_ip_block_suspend(struct amdgpu_ip_block *ip_block)
+{
+       int r;
+
+       if (ip_block->version->funcs->suspend) {
+               r = ip_block->version->funcs->suspend(ip_block);
+               if (r) {
+                       dev_err(ip_block->adev->dev,
+                               "suspend of IP block <%s> failed %d\n",
+                               ip_block->version->funcs->name, r);
+                       return r;
+               }
+       }
+
+       ip_block->status.hw = false;
+       return 0;
+}
+
 /**
  * DOC: board_info
  *
@@ -3473,15 +3491,9 @@ static int amdgpu_device_ip_suspend_phase1(struct 
amdgpu_device *adev)
                        continue;
 
                /* XXX handle errors */
-               r = 
adev->ip_blocks[i].version->funcs->suspend(&adev->ip_blocks[i]);
-               /* XXX handle errors */
-               if (r) {
-                       DRM_ERROR("suspend of IP block <%s> failed %d\n",
-                                 adev->ip_blocks[i].version->funcs->name, r);
+               r = amdgpu_ip_block_suspend(&adev->ip_blocks[i]);
+               if (r)
                        return r;
-               }
-
-               adev->ip_blocks[i].status.hw = false;
        }
 
        return 0;
@@ -3555,13 +3567,9 @@ static int amdgpu_device_ip_suspend_phase2(struct 
amdgpu_device *adev)
                        continue;
 
                /* XXX handle errors */
-               r = 
adev->ip_blocks[i].version->funcs->suspend(&adev->ip_blocks[i]);
-               /* XXX handle errors */
-               if (r) {
-                       DRM_ERROR("suspend of IP block <%s> failed %d\n",
-                                 adev->ip_blocks[i].version->funcs->name, r);
-               }
+               r = amdgpu_ip_block_suspend(&adev->ip_blocks[i]);
                adev->ip_blocks[i].status.hw = false;
+
                /* handle putting the SMC in the appropriate state */
                if (!amdgpu_sriov_vf(adev)) {
                        if (adev->ip_blocks[i].version->type == 
AMD_IP_BLOCK_TYPE_SMC) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c
index 3e2724590dbf..0a45fe355467 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c
@@ -40,12 +40,7 @@ static int amdgpu_reset_xgmi_reset_on_init_suspend(struct 
amdgpu_device *adev)
                        continue;
 
                /* XXX handle errors */
-               r = 
adev->ip_blocks[i].version->funcs->suspend(&adev->ip_blocks[i]);
-               /* XXX handle errors */
-               if (r) {
-                       dev_err(adev->dev, "suspend of IP block <%s> failed %d",
-                               adev->ip_blocks[i].version->funcs->name, r);
-               }
+               r = amdgpu_ip_block_suspend(&adev->ip_blocks[i]);
                adev->ip_blocks[i].status.hw = false;
        }
 
diff --git a/drivers/gpu/drm/amd/amdgpu/sienna_cichlid.c 
b/drivers/gpu/drm/amd/amdgpu/sienna_cichlid.c
index 475b7df3a908..341de4e38eeb 100644
--- a/drivers/gpu/drm/amd/amdgpu/sienna_cichlid.c
+++ b/drivers/gpu/drm/amd/amdgpu/sienna_cichlid.c
@@ -81,15 +81,9 @@ static int sienna_cichlid_mode2_suspend_ip(struct 
amdgpu_device *adev)
                              AMD_IP_BLOCK_TYPE_SDMA))
                        continue;
 
-               r = 
adev->ip_blocks[i].version->funcs->suspend(&adev->ip_blocks[i]);
-
-               if (r) {
-                       dev_err(adev->dev,
-                               "suspend of IP block <%s> failed %d\n",
-                               adev->ip_blocks[i].version->funcs->name, r);
+               r = amdgpu_ip_block_suspend(&adev->ip_blocks[i]);
+               if (r)
                        return r;
-               }
-               adev->ip_blocks[i].status.hw = false;
        }
 
        return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/smu_v13_0_10.c 
b/drivers/gpu/drm/amd/amdgpu/smu_v13_0_10.c
index 5ea9090b5040..12e792ca873b 100644
--- a/drivers/gpu/drm/amd/amdgpu/smu_v13_0_10.c
+++ b/drivers/gpu/drm/amd/amdgpu/smu_v13_0_10.c
@@ -80,15 +80,9 @@ static int smu_v13_0_10_mode2_suspend_ip(struct 
amdgpu_device *adev)
                              AMD_IP_BLOCK_TYPE_MES))
                        continue;
 
-               r = 
adev->ip_blocks[i].version->funcs->suspend(&adev->ip_blocks[i]);
-
-               if (r) {
-                       dev_err(adev->dev,
-                               "suspend of IP block <%s> failed %d\n",
-                               adev->ip_blocks[i].version->funcs->name, r);
+               r = amdgpu_ip_block_suspend(&adev->ip_blocks[i]);
+               if (r)
                        return r;
-               }
-               adev->ip_blocks[i].status.hw = false;
        }
 
        return 0;
-- 
2.34.1

Reply via email to