amdgpu/pm: Add emit_clock_levels calls
authorDarren Powell <darren.powell@amd.com>
Tue, 25 Jan 2022 23:57:56 +0000 (18:57 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 11 Feb 2022 21:12:29 +0000 (16:12 -0500)
   (v4)
     Modifications to satisfy checkpatch --strict
   (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@amd.com>
Reviewed-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/amdgpu_pm.c

index ad5da25..b024306 100644 (file)
@@ -837,8 +837,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;
@@ -851,16 +860,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);
 
@@ -985,8 +1003,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;
@@ -999,8 +1017,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);