[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