(v1)
    Use new API function emit_clock_levels to display to overclocking values, 
with a fallback
    to the print_clock_levels if the first call fails.

  (v2)
    Update to apply on commit 801771de03
    adjust printing of empty carriage return only if size == 0

 == 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"

 for f in $FILES
 do
   echo === $f === >> $LOGFILE
   cat $HWMON_DIR/device/$f >> $LOGFILE
 done
 cat $LOGFILE

Signed-off-by: Darren Powell <[email protected]>
---
 drivers/gpu/drm/amd/pm/amdgpu_pm.c | 39 ++++++++++++++++++++++--------
 1 file changed, 29 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c 
b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
index ec2729b3930e..97a8dcbe6eaf 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,26 @@ 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");
+       ret = amdgpu_dpm_emit_clock_levels(adev, od_clocks[0], buf, &size);
+       if (ret >= 0) {
+               /* Proceed with emit for other od clocks if the first call 
succeeds */
+               for(clk_index = 1 ; clk_index < 6 ; clk_index++)
+                       amdgpu_dpm_emit_clock_levels(adev, 
od_clocks[clk_index], buf, &size);
+       }
+       else {
+               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);
 
-- 
2.34.1

Reply via email to