In smu_v15_0_0_emit_clk_levels() and smu_v15_0_8_emit_clk_levels(), check
each sysfs_emit_at() return value and stop further output when it returns
zero (page full).

Signed-off-by: Asad Kamal <[email protected]>
---
 .../drm/amd/pm/swsmu/smu15/smu_v15_0_0_ppt.c  | 71 +++++++++++++------
 .../drm/amd/pm/swsmu/smu15/smu_v15_0_8_ppt.c  | 31 +++++---
 2 files changed, 72 insertions(+), 30 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_0_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_0_ppt.c
index 4e7d6a602c6c..977ed70b8689 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_0_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_0_ppt.c
@@ -995,23 +995,40 @@ static int smu_v15_0_0_emit_clk_levels(struct smu_context 
*smu,
                                       enum smu_clk_type clk_type, char *buf,
                                       int *offset)
 {
-       int i, idx, ret = 0, size = *offset;
+       int i, idx, ret = 0, size = *offset, n;
        uint32_t cur_value = 0, value = 0, count = 0;
        uint32_t min, max;
 
        switch (clk_type) {
        case SMU_OD_SCLK:
-               size += sysfs_emit_at(buf, size, "%s:\n", "OD_SCLK");
-               size += sysfs_emit_at(buf, size, "0: %10uMhz\n",
-               (smu->gfx_actual_hard_min_freq > 0) ? 
smu->gfx_actual_hard_min_freq : smu->gfx_default_hard_min_freq);
-               size += sysfs_emit_at(buf, size, "1: %10uMhz\n",
-               (smu->gfx_actual_soft_max_freq > 0) ? 
smu->gfx_actual_soft_max_freq : smu->gfx_default_soft_max_freq);
+               n = sysfs_emit_at(buf, size, "%s:\n", "OD_SCLK");
+               if (!n)
+                       goto out;
+               size += n;
+               n = sysfs_emit_at(buf, size, "0: %10uMhz\n",
+                                 (smu->gfx_actual_hard_min_freq > 0) ?
+                                 smu->gfx_actual_hard_min_freq : 
smu->gfx_default_hard_min_freq);
+               if (!n)
+                       goto out;
+               size += n;
+               n = sysfs_emit_at(buf, size, "1: %10uMhz\n",
+                                 (smu->gfx_actual_soft_max_freq > 0) ?
+                                 smu->gfx_actual_soft_max_freq : 
smu->gfx_default_soft_max_freq);
+               if (!n)
+                       goto out;
+               size += n;
                break;
        case SMU_OD_RANGE:
-               size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE");
-               size += sysfs_emit_at(buf, size, "SCLK: %7uMhz %10uMhz\n",
-                                     smu->gfx_default_hard_min_freq,
-                                     smu->gfx_default_soft_max_freq);
+               n = sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE");
+               if (!n)
+                       goto out;
+               size += n;
+               n = sysfs_emit_at(buf, size, "SCLK: %7uMhz %10uMhz\n",
+                                 smu->gfx_default_hard_min_freq,
+                                 smu->gfx_default_soft_max_freq);
+               if (!n)
+                       goto out;
+               size += n;
                break;
        case SMU_SOCCLK:
        case SMU_VCLK:
@@ -1034,9 +1051,12 @@ static int smu_v15_0_0_emit_clk_levels(struct 
smu_context *smu,
                        if (ret)
                                return ret;
 
-                       size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n", i,
-                                             value,
-                                             cur_value == value ? "*" : "");
+                       n = sysfs_emit_at(buf, size, "%d: %uMhz %s\n", i,
+                                         value,
+                                         cur_value == value ? "*" : "");
+                       if (!n)
+                               goto out;
+                       size += n;
                }
                break;
        case SMU_GFXCLK:
@@ -1052,14 +1072,22 @@ static int smu_v15_0_0_emit_clk_levels(struct 
smu_context *smu,
                        i = 0;
                else
                        i = 1;
-               size += sysfs_emit_at(buf, size, "0: %uMhz %s\n", min,
-                                     i == 0 ? "*" : "");
-               size += sysfs_emit_at(
-                       buf, size, "1: %uMhz %s\n",
-                       i == 1 ? cur_value : 1100, /* UMD PSTATE GFXCLK 1100 */
-                       i == 1 ? "*" : "");
-               size += sysfs_emit_at(buf, size, "2: %uMhz %s\n", max,
-                                     i == 2 ? "*" : "");
+               n = sysfs_emit_at(buf, size, "0: %uMhz %s\n", min,
+                                 i == 0 ? "*" : "");
+               if (!n)
+                       goto out;
+               size += n;
+               n = sysfs_emit_at(buf, size, "1: %uMhz %s\n",
+                                 i == 1 ? cur_value : 1100, /* UMD PSTATE 
GFXCLK 1100 */
+                                 i == 1 ? "*" : "");
+               if (!n)
+                       goto out;
+               size += n;
+               n = sysfs_emit_at(buf, size, "2: %uMhz %s\n", max,
+                                 i == 2 ? "*" : "");
+               if (!n)
+                       goto out;
+               size += n;
                break;
        default:
                break;
@@ -1067,6 +1095,7 @@ static int smu_v15_0_0_emit_clk_levels(struct smu_context 
*smu,
 
        *offset = size;
 
+out:
        return 0;
 }
 
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_8_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_8_ppt.c
index 2105a1d7bb34..e076ad68b66b 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_8_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_8_ppt.c
@@ -692,7 +692,7 @@ static int smu_v15_0_8_emit_clk_levels(struct smu_context 
*smu,
        struct smu_15_0_dpm_context *dpm_context;
        struct smu_dpm_table *single_dpm_table = NULL;
        struct smu_dpm_context *smu_dpm = &smu->smu_dpm;
-       int ret, now, size = *offset;
+       int ret, now, size = *offset, n;
 
        if (amdgpu_ras_intr_triggered()) {
                sysfs_emit_at(buf, size, "unavailable\n");
@@ -703,16 +703,28 @@ static int smu_v15_0_8_emit_clk_levels(struct smu_context 
*smu,
 
        switch (type) {
        case SMU_OD_SCLK:
-               size += sysfs_emit_at(buf, size, "%s:\n", "OD_SCLK");
-               size += sysfs_emit_at(buf, size, "0: %uMhz\n1: %uMhz\n",
-                                     pstate_table->gfxclk_pstate.curr.min,
-                                     pstate_table->gfxclk_pstate.curr.max);
+               n = sysfs_emit_at(buf, size, "%s:\n", "OD_SCLK");
+               if (!n)
+                       goto out;
+               size += n;
+               n = sysfs_emit_at(buf, size, "0: %uMhz\n1: %uMhz\n",
+                                 pstate_table->gfxclk_pstate.curr.min,
+                                 pstate_table->gfxclk_pstate.curr.max);
+               if (!n)
+                       goto out;
+               size += n;
                break;
        case SMU_OD_MCLK:
-               size += sysfs_emit_at(buf, size, "%s:\n", "OD_MCLK");
-               size += sysfs_emit_at(buf, size, "0: %uMhz\n1: %uMhz\n",
-                                     pstate_table->uclk_pstate.curr.min,
-                                     pstate_table->uclk_pstate.curr.max);
+               n = sysfs_emit_at(buf, size, "%s:\n", "OD_MCLK");
+               if (!n)
+                       goto out;
+               size += n;
+               n = sysfs_emit_at(buf, size, "0: %uMhz\n1: %uMhz\n",
+                                 pstate_table->uclk_pstate.curr.min,
+                                 pstate_table->uclk_pstate.curr.max);
+               if (!n)
+                       goto out;
+               size += n;
                break;
        case SMU_SCLK:
        case SMU_GFXCLK:
@@ -738,6 +750,7 @@ static int smu_v15_0_8_emit_clk_levels(struct smu_context 
*smu,
                break;
        }
 
+out:
        if (single_dpm_table) {
                ret = smu_v15_0_8_get_current_clk_freq_by_table(smu, type, 
&now);
                if (ret) {
-- 
2.46.0

Reply via email to