[PATCH 4/5] dpm/amd/pm: Sienna: 0 MHz is not a current clock frequency
Luben Tuikov
luben.tuikov at amd.com
Wed Oct 13 03:10:41 UTC 2021
A current value of a clock frequency of 0, means
that the IP block is in some kind of low power
state. Ignore it and don't report it here. Here we
only report the possible operating (non-zero)
frequencies of the block requested. So, if the
current clock value is 0, then report as the
current clock the minimum operating one, which is
non-zero.
Signed-off-by: Luben Tuikov <luben.tuikov at amd.com>
---
.../amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 57 +++++++++++++------
1 file changed, 39 insertions(+), 18 deletions(-)
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
index f630d5e928ccfe..00be2b851baf93 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
@@ -1054,10 +1054,10 @@ static int sienna_cichlid_print_clk_levels(struct smu_context *smu,
int i, size = 0, ret = 0;
uint32_t curr_value = 0, value = 0, count = 0;
uint32_t freq_value[3] = {0, 0, 0};
- uint32_t mark_index = 0;
uint32_t gen_speed, lane_width;
uint32_t min_value, max_value;
uint32_t smu_version;
+ bool fine_grained;
smu_cmn_get_sysfs_buf(&buf, &size);
@@ -1077,6 +1077,22 @@ static int sienna_cichlid_print_clk_levels(struct smu_context *smu,
if (ret)
goto print_clk_out;
+ ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, 0,
+ &freq_value[0]);
+ if (ret)
+ goto print_clk_out;
+
+ /* A current value of a clock frequency of 0, means
+ * that the IP block is in some kind of low power
+ * state. Ignore it and don't report it here. Here we
+ * only report the possible operating (non-zero)
+ * frequencies of the block requested. So, if the
+ * current clock value is 0, then report as the
+ * current clock the minimum operating one, which is
+ * non-zero.
+ */
+ if (curr_value == 0)
+ curr_value = freq_value[0];
/* no need to disable gfxoff when retrieving the current gfxclk */
if ((clk_type == SMU_GFXCLK) || (clk_type == SMU_SCLK))
@@ -1086,38 +1102,43 @@ static int sienna_cichlid_print_clk_levels(struct smu_context *smu,
if (ret)
goto print_clk_out;
- if (!sienna_cichlid_supports_fine_grained_dpm(smu, clk_type)) {
- for (i = 0; i < count; i++) {
+ fine_grained = sienna_cichlid_supports_fine_grained_dpm(smu, clk_type);
+ if (!fine_grained) {
+ /* We already got the 0-th index--print it
+ * here and continue thereafter.
+ */
+ size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n", 0, freq_value[0],
+ curr_value == freq_value[0] ? "*" : "");
+ for (i = 1; i < count; i++) {
ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, i, &value);
if (ret)
goto print_clk_out;
-
size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n", i, value,
curr_value == value ? "*" : "");
}
} else {
- ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, 0, &freq_value[0]);
- if (ret)
- goto print_clk_out;
+ freq_value[1] = curr_value;
ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, count - 1, &freq_value[2]);
if (ret)
goto print_clk_out;
- freq_value[1] = curr_value;
- mark_index = curr_value == freq_value[0] ? 0 :
- curr_value == freq_value[2] ? 2 : 1;
-
- count = 3;
- if (mark_index != 1) {
+ if (freq_value[1] == freq_value[0]) {
+ i = 1;
+ count = 3;
+ } else if (freq_value[1] == freq_value[2]) {
+ i = 0;
count = 2;
- freq_value[1] = freq_value[2];
+ } else {
+ i = 0;
+ count = 3;
}
- for (i = 0; i < count; i++) {
- size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n", i, freq_value[i],
- curr_value == freq_value[i] ? "*" : "");
+ for ( ; i < count; i++) {
+ size += sysfs_emit_at(buf, size,
+ "%d: %uMhz %s\n",
+ i, freq_value[i],
+ curr_value == freq_value[i] ? "*" : "");
}
-
}
break;
case SMU_PCIE:
--
2.33.1.558.g2bd2f258f4
More information about the amd-gfx
mailing list