[PATCH 4/8] amdgpu/pm: Optimize emit_clock_levels for arcturus - part 3
Lazar, Lijo
lijo.lazar at amd.com
Fri Jul 28 05:26:49 UTC 2023
On 4/27/2023 11:57 AM, Darren Powell wrote:
> split switch statement into two and consolidate the common
> code for printing most of the types of clock speeds
>
> Signed-off-by: Darren Powell <darren.powell at amd.com>
> ---
> .../gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c | 77 ++++++-------------
> 1 file changed, 24 insertions(+), 53 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
> index aea78f9dbae2..0e26c8b31daa 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
> @@ -787,19 +787,6 @@ static int arcturus_emit_clk_levels(struct smu_context *smu,
> single_dpm_table = &(dpm_context->dpm_tables.gfx_table);
> arcturus_get_clk_table(smu, &clocks, single_dpm_table);
>
> - /*
> - * For DPM disabled case, there will be only one clock level.
> - * And it's safe to assume that is always the current clock.
> - */
> - for (i = 0; i < clocks.num_levels; i++) {
> - clock_mhz = clocks.data[i].clocks_in_khz / 1000;
> - freq_match = arcturus_freqs_in_same_level(clock_mhz, cur_value);
> - freq_match |= (clocks.num_levels == 1);
> -
> - *offset += sysfs_emit_at(buf, *offset, "%d: %uMhz %s\n",
> - i, clock_mhz,
> - freq_match ? "*" : "");
> - }
> break;
>
> case SMU_MCLK:
> @@ -812,15 +799,6 @@ static int arcturus_emit_clk_levels(struct smu_context *smu,
> single_dpm_table = &(dpm_context->dpm_tables.uclk_table);
> arcturus_get_clk_table(smu, &clocks, single_dpm_table);
>
> - for (i = 0; i < clocks.num_levels; i++) {
> - clock_mhz = clocks.data[i].clocks_in_khz / 1000;
> - freq_match = arcturus_freqs_in_same_level(clock_mhz, cur_value);
> - freq_match |= (clocks.num_levels == 1);
> -
> - *offset += sysfs_emit_at(buf, *offset, "%d: %uMhz %s\n",
> - i, clock_mhz,
> - freq_match ? "*" : "");
> - }
> break;
>
> case SMU_SOCCLK:
> @@ -833,15 +811,6 @@ static int arcturus_emit_clk_levels(struct smu_context *smu,
> single_dpm_table = &(dpm_context->dpm_tables.soc_table);
> arcturus_get_clk_table(smu, &clocks, single_dpm_table);
>
> - for (i = 0; i < clocks.num_levels; i++) {
> - clock_mhz = clocks.data[i].clocks_in_khz / 1000;
> - freq_match = arcturus_freqs_in_same_level(clock_mhz, cur_value);
> - freq_match |= (clocks.num_levels == 1);
> -
> - *offset += sysfs_emit_at(buf, *offset, "%d: %uMhz %s\n",
> - i, clock_mhz,
> - freq_match ? "*" : "");
> - }
> break;
>
> case SMU_FCLK:
> @@ -854,15 +823,6 @@ static int arcturus_emit_clk_levels(struct smu_context *smu,
> single_dpm_table = &(dpm_context->dpm_tables.fclk_table);
> arcturus_get_clk_table(smu, &clocks, single_dpm_table);
>
> - for (i = 0; i < clocks.num_levels; i++) {
> - clock_mhz = clocks.data[i].clocks_in_khz / 1000;
> - freq_match = arcturus_freqs_in_same_level(clock_mhz, cur_value);
> - freq_match |= (clocks.num_levels == 1);
> -
> - *offset += sysfs_emit_at(buf, *offset, "%d: %uMhz %s\n",
> - i, clock_mhz,
> - freq_match ? "*" : "");
> - }
> break;
>
> case SMU_VCLK:
> @@ -875,15 +835,6 @@ static int arcturus_emit_clk_levels(struct smu_context *smu,
> single_dpm_table = &(dpm_context->dpm_tables.vclk_table);
> arcturus_get_clk_table(smu, &clocks, single_dpm_table);
>
> - for (i = 0; i < clocks.num_levels; i++) {
> - clock_mhz = clocks.data[i].clocks_in_khz / 1000;
> - freq_match = arcturus_freqs_in_same_level(clock_mhz, cur_value);
> - freq_match |= (clocks.num_levels == 1);
> -
> - *offset += sysfs_emit_at(buf, *offset, "%d: %uMhz %s\n",
> - i, clock_mhz,
> - freq_match ? "*" : "");
> - }
> break;
>
> case SMU_DCLK:
> @@ -896,20 +847,40 @@ static int arcturus_emit_clk_levels(struct smu_context *smu,
> single_dpm_table = &(dpm_context->dpm_tables.dclk_table);
> arcturus_get_clk_table(smu, &clocks, single_dpm_table);
>
> + break;
> +
> + case SMU_PCIE:
> + gen_speed = smu_v11_0_get_current_pcie_link_speed_level(smu);
> + lane_width = smu_v11_0_get_current_pcie_link_width_level(smu);
> + break;
> +
> + default:
> + return -EINVAL;
> + }
> +
> + switch (type) {
> + case SMU_SCLK:
> + case SMU_MCLK:
> + case SMU_SOCCLK:
> + case SMU_FCLK:
> + case SMU_VCLK:
> + case SMU_DCLK:
> + /*
> + * For DPM disabled case, there will be only one clock level.
> + * And it's safe to assume that is always the current clock.
> + */
> for (i = 0; i < clocks.num_levels; i++) {
> clock_mhz = clocks.data[i].clocks_in_khz / 1000;
> freq_match = arcturus_freqs_in_same_level(clock_mhz, cur_value);
> freq_match |= (clocks.num_levels == 1);
>
> *offset += sysfs_emit_at(buf, *offset, "%d: %uMhz %s\n",
> - i, clock_mhz,
> - freq_match ? "*" : "");
> + i, clock_mhz,
> + freq_match ? "*" : "");
> }
<Nit> Making this a small inline function or a goto may be considered
instead of another switch statement.
Thanks,
Lijo
> break;
>
> case SMU_PCIE:
> - gen_speed = smu_v11_0_get_current_pcie_link_speed_level(smu);
> - lane_width = smu_v11_0_get_current_pcie_link_width_level(smu);
> *offset += sysfs_emit_at(buf, *offset, "0: %s %s %dMhz *\n",
> (gen_speed == 0) ? "2.5GT/s," :
> (gen_speed == 1) ? "5.0GT/s," :
More information about the amd-gfx
mailing list