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
