[PATCH 4/5] dpm/amd/pm: Sienna: Remove 0 MHz as a current clock frequency (v3)

Lazar, Lijo lijo.lazar at amd.com
Tue Oct 19 03:38:54 UTC 2021



On 10/19/2021 5:19 AM, Luben Tuikov wrote:
> 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 print the DPM
> frequencies, but don't report a current value.
> 
> v2: Don't report the minimum one as the current
> one when reported one is 0, i.e. don't add an
> asterisk (Lijo). LT: It is conceivable that this
> may confuse user-mode tools if they scan and look
> for a current one, i.e. look for an asterisk, but
> they'll have to adapt and use other methods for
> finding power states of the chip--we can't report
> 0 as current.
> v3: Start the subject title with a verb. (PaulM)
> 
> Cc: Alex Deucher <Alexander.Deucher at amd.com>
> Cc: Lijo Lazar <Lijo.Lazar at amd.com>
> Cc: Paul Menzel <pmenzel at molgen.mpg.de>
> Signed-off-by: Luben Tuikov <luben.tuikov at amd.com>
> ---
>   .../amd/pm/swsmu/smu11/sienna_cichlid_ppt.c   | 60 ++++++++++++-------
>   1 file changed, 40 insertions(+), 20 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..6fe792be77dbbb 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
> @@ -1040,7 +1040,8 @@ static void sienna_cichlid_get_od_setting_range(struct smu_11_0_7_overdrive_tabl
>   }
>   
>   static int sienna_cichlid_print_clk_levels(struct smu_context *smu,
> -			enum smu_clk_type clk_type, char *buf)
> +					   enum smu_clk_type clk_type,
> +					   char *buf)
>   {
>   	struct amdgpu_device *adev = smu->adev;
>   	struct smu_table_context *table_context = &smu->smu_table;
> @@ -1052,12 +1053,12 @@ static int sienna_cichlid_print_clk_levels(struct smu_context *smu,
>   	OverDriveTable_t *od_table =
>   		(OverDriveTable_t *)table_context->overdrive_table;
>   	int i, size = 0, ret = 0;
> -	uint32_t curr_value = 0, value = 0, count = 0;
> +	uint32_t curr_value, value, count;
>   	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 +1078,20 @@ 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 we don't report a
> +		 * "current" value from the DPM states, i.e. we don't
> +		 * add an asterisk.
> +		 */
>   
>   		/* no need to disable gfxoff when retrieving the current gfxclk */
>   		if ((clk_type == SMU_GFXCLK) || (clk_type == SMU_SCLK))
> @@ -1086,38 +1101,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 ?: freq_value[0];

Omitting second expression is not standard C - 
https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html

Thanks,
Lijo
>   			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:
> 


More information about the amd-gfx mailing list