[PATCH v3 3/3] amdgpu/pm: Linked emit_clock_levels to use cases amdgpu_get_pp_{dpm_clock,od_clk_voltage}

Quan, Evan Evan.Quan at amd.com
Thu Jan 27 02:22:10 UTC 2022


[AMD Official Use Only]

Series is reviewed-by: Evan Quan <evan.quan at amd.com>

> -----Original Message-----
> From: Powell, Darren <Darren.Powell at amd.com>
> Sent: Wednesday, January 26, 2022 12:55 PM
> To: amd-gfx at lists.freedesktop.org
> Cc: Powell, Darren <Darren.Powell at amd.com>
> Subject: [PATCH v3 3/3] amdgpu/pm: Linked emit_clock_levels to use cases
> amdgpu_get_pp_{dpm_clock,od_clk_voltage}
> 
>    (v3)
>      Rewrote patchset to order patches as (API, hw impl, usecase)
> 
>      - modified amdgpu_get_pp_od_clk_voltage to try
> amdgpu_dpm_emit_clock_levels and
>        fallback to amdgpu_dpm_print_clock_levels if emit is not implemented.
>      - modified amdgpu_get_pp_dpm_clock to try
> amdgpu_dpm_emit_clock_levels and
>        fallback to amdgpu_dpm_print_clock_levels if emit is not implemented.
>      - Newline is printed to buf if no output produced
> 
>  == Test ==
>  LOGFILE=pp_clk.test.log
>  AMDGPU_PCI_ADDR=`lspci -nn | grep "VGA\|Display" | cut -d " " -f 1`
>  AMDGPU_HWMON=`ls -la /sys/class/hwmon | grep $AMDGPU_PCI_ADDR |
> awk '{print $9}'`
>  HWMON_DIR=/sys/class/hwmon/${AMDGPU_HWMON}
> 
>  lspci -nn | grep "VGA\|Display"  > $LOGFILE
>  FILES="pp_od_clk_voltage
>  pp_dpm_sclk
>  pp_dpm_mclk
>  pp_dpm_pcie
>  pp_dpm_socclk
>  pp_dpm_fclk
>  pp_dpm_dcefclk
>  pp_dpm_vclk
>  pp_dpm_dclk "
> 
>  for f in $FILES
>  do
>    echo === $f === >> $LOGFILE
>    cat $HWMON_DIR/device/$f >> $LOGFILE
>  done
>  cat $LOGFILE
> 
> Signed-off-by: Darren Powell <darren.powell at amd.com>
> ---
>  drivers/gpu/drm/amd/pm/amdgpu_pm.c | 49 +++++++++++++++++++++--
> -------
>  1 file changed, 35 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> index d2823aaeca09..a11def0ee761 100644
> --- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> +++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> @@ -832,8 +832,17 @@ static ssize_t
> amdgpu_get_pp_od_clk_voltage(struct device *dev,
>  {
>  	struct drm_device *ddev = dev_get_drvdata(dev);
>  	struct amdgpu_device *adev = drm_to_adev(ddev);
> -	ssize_t size;
> +	int size = 0;
>  	int ret;
> +	enum pp_clock_type od_clocks[6] = {
> +		OD_SCLK,
> +		OD_MCLK,
> +		OD_VDDC_CURVE,
> +		OD_RANGE,
> +		OD_VDDGFX_OFFSET,
> +		OD_CCLK,
> +	};
> +	uint clk_index;
> 
>  	if (amdgpu_in_reset(adev))
>  		return -EPERM;
> @@ -846,16 +855,25 @@ static ssize_t
> amdgpu_get_pp_od_clk_voltage(struct device *dev,
>  		return ret;
>  	}
> 
> -	size = amdgpu_dpm_print_clock_levels(adev, OD_SCLK, buf);
> -	if (size > 0) {
> -		size += amdgpu_dpm_print_clock_levels(adev, OD_MCLK,
> buf+size);
> -		size += amdgpu_dpm_print_clock_levels(adev,
> OD_VDDC_CURVE, buf+size);
> -		size += amdgpu_dpm_print_clock_levels(adev,
> OD_VDDGFX_OFFSET, buf+size);
> -		size += amdgpu_dpm_print_clock_levels(adev, OD_RANGE,
> buf+size);
> -		size += amdgpu_dpm_print_clock_levels(adev, OD_CCLK,
> buf+size);
> -	} else {
> -		size = sysfs_emit(buf, "\n");
> +	for(clk_index = 0 ; clk_index < 6 ; clk_index++) {
> +		ret = amdgpu_dpm_emit_clock_levels(adev,
> od_clocks[clk_index], buf, &size);
> +		if (ret)
> +			break;
> +	}
> +	if (ret == -ENOENT) {
> +		size = amdgpu_dpm_print_clock_levels(adev, OD_SCLK, buf);
> +		if (size > 0) {
> +			size += amdgpu_dpm_print_clock_levels(adev,
> OD_MCLK, buf+size);
> +			size += amdgpu_dpm_print_clock_levels(adev,
> OD_VDDC_CURVE, buf+size);
> +			size += amdgpu_dpm_print_clock_levels(adev,
> OD_VDDGFX_OFFSET, buf+size);
> +			size += amdgpu_dpm_print_clock_levels(adev,
> OD_RANGE, buf+size);
> +			size += amdgpu_dpm_print_clock_levels(adev,
> OD_CCLK, buf+size);
> +		}
>  	}
> +
> +	if (size == 0)
> +		size = sysfs_emit(buf, "\n");
> +
>  	pm_runtime_mark_last_busy(ddev->dev);
>  	pm_runtime_put_autosuspend(ddev->dev);
> 
> @@ -980,8 +998,8 @@ static ssize_t amdgpu_get_pp_dpm_clock(struct
> device *dev,
>  {
>  	struct drm_device *ddev = dev_get_drvdata(dev);
>  	struct amdgpu_device *adev = drm_to_adev(ddev);
> -	ssize_t size;
> -	int ret;
> +	int size = 0;
> +	int ret = 0;
> 
>  	if (amdgpu_in_reset(adev))
>  		return -EPERM;
> @@ -994,8 +1012,11 @@ static ssize_t amdgpu_get_pp_dpm_clock(struct
> device *dev,
>  		return ret;
>  	}
> 
> -	size = amdgpu_dpm_print_clock_levels(adev, type, buf);
> -	if (size <= 0)
> +	ret = amdgpu_dpm_emit_clock_levels(adev, type, buf, &size);
> +	if (ret == -ENOENT)
> +		size = amdgpu_dpm_print_clock_levels(adev, type, buf);
> +
> +	if (size == 0)
>  		size = sysfs_emit(buf, "\n");
> 
>  	pm_runtime_mark_last_busy(ddev->dev);
> --
> 2.34.1


More information about the amd-gfx mailing list