amdgpu/pm: remove code duplication in show_power_cap calls
authorDarren Powell <darren.powell@amd.com>
Fri, 25 Jun 2021 02:54:35 +0000 (22:54 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 30 Jun 2021 04:18:56 +0000 (00:18 -0400)
 v3: updated patch to apply to latest code
 v2: reorder to check pointers before calling pm_runtime_* functions

 created generic function and call with enum from
 * amdgpu_hwmon_show_power_cap_max
 * amdgpu_hwmon_show_power_cap
 * amdgpu_hwmon_show_power_cap_default

=== Test ===
AMDGPU_PCI_ADDR=`lspci -nn | grep "VGA\|Display" | cut -d " " -f 1`
AMDGPU_HWMON=`ls -la /sys/class/hwmon | grep $AMDGPU_PCI_ADDR | cut -d " " -f 10`
HWMON_DIR=/sys/class/hwmon/${AMDGPU_HWMON}

cp pp_show_power_cap.txt{,.old}
lspci -nn | grep "VGA\|Display" > pp_show_power_cap.test.log
FILES="
power1_cap
power1_cap_max
power1_cap_default "

for f in $FILES
do
  echo  $f = `cat $HWMON_DIR/$f` >> pp_show_power_cap.test.log
done

Signed-off-by: Darren Powell <darren.powell@amd.com>
Reviewed-by: Kevin Wang <kevin1.wang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/amdgpu_pm.c

index a276ebad47e620ee058becee98b298e9cd7264c3..769f58d5ae1ae77164b5120bdcc5f877137cfc56 100644 (file)
@@ -2902,14 +2902,15 @@ static ssize_t amdgpu_hwmon_show_power_cap_min(struct device *dev,
        return sprintf(buf, "%i\n", 0);
 }
 
-static ssize_t amdgpu_hwmon_show_power_cap_max(struct device *dev,
-                                        struct device_attribute *attr,
-                                        char *buf)
+
+static ssize_t amdgpu_hwmon_show_power_cap_generic(struct device *dev,
+                                       struct device_attribute *attr,
+                                       char *buf,
+                                       enum pp_power_limit_level pp_limit_level)
 {
        struct amdgpu_device *adev = dev_get_drvdata(dev);
        const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
        enum pp_power_type power_type = to_sensor_dev_attr(attr)->index;
-       enum pp_power_limit_level pp_limit_level = PP_PWR_LIMIT_MAX;
        uint32_t limit;
        ssize_t size;
        int r;
@@ -2919,17 +2920,17 @@ static ssize_t amdgpu_hwmon_show_power_cap_max(struct device *dev,
        if (adev->in_suspend && !adev->in_runpm)
                return -EPERM;
 
+       if ( !(pp_funcs && pp_funcs->get_power_limit))
+               return -ENODATA;
+
        r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
        if (r < 0) {
                pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
                return r;
        }
 
-       if (pp_funcs && pp_funcs->get_power_limit)
-               r = pp_funcs->get_power_limit(adev->powerplay.pp_handle, &limit,
-                                             pp_limit_level, power_type);
-       else
-               r = -ENODATA;
+       r = pp_funcs->get_power_limit(adev->powerplay.pp_handle, &limit,
+                                     pp_limit_level, power_type);
 
        if (!r)
                size = sysfs_emit(buf, "%u\n", limit * 1000000);
@@ -2942,85 +2943,31 @@ static ssize_t amdgpu_hwmon_show_power_cap_max(struct device *dev,
        return size;
 }
 
-static ssize_t amdgpu_hwmon_show_power_cap(struct device *dev,
+
+static ssize_t amdgpu_hwmon_show_power_cap_max(struct device *dev,
                                         struct device_attribute *attr,
                                         char *buf)
 {
-       struct amdgpu_device *adev = dev_get_drvdata(dev);
-       const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
-       enum pp_power_type power_type = to_sensor_dev_attr(attr)->index;
-       enum pp_power_limit_level pp_limit_level = PP_PWR_LIMIT_CURRENT;
-       uint32_t limit;
-       ssize_t size;
-       int r;
-
-       if (amdgpu_in_reset(adev))
-               return -EPERM;
-       if (adev->in_suspend && !adev->in_runpm)
-               return -EPERM;
-
-       r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
-       if (r < 0) {
-               pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-               return r;
-       }
-
-       if (pp_funcs && pp_funcs->get_power_limit)
-               r = pp_funcs->get_power_limit(adev->powerplay.pp_handle, &limit,
-                                             pp_limit_level, power_type);
-       else
-               r = -ENODATA;
+       return amdgpu_hwmon_show_power_cap_generic(dev, attr, buf, PP_PWR_LIMIT_MAX);
 
-       if (!r)
-               size = sysfs_emit(buf, "%u\n", limit * 1000000);
-       else
-               size = sysfs_emit(buf, "\n");
+}
 
-       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
-       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
+static ssize_t amdgpu_hwmon_show_power_cap(struct device *dev,
+                                        struct device_attribute *attr,
+                                        char *buf)
+{
+       return amdgpu_hwmon_show_power_cap_generic(dev, attr, buf, PP_PWR_LIMIT_CURRENT);
 
-       return size;
 }
 
 static ssize_t amdgpu_hwmon_show_power_cap_default(struct device *dev,
                                         struct device_attribute *attr,
                                         char *buf)
 {
-       struct amdgpu_device *adev = dev_get_drvdata(dev);
-       const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
-       enum pp_power_type power_type = to_sensor_dev_attr(attr)->index;
-       enum pp_power_limit_level pp_limit_level = PP_PWR_LIMIT_DEFAULT;
-       uint32_t limit;
-       ssize_t size;
-       int r;
+       return amdgpu_hwmon_show_power_cap_generic(dev, attr, buf, PP_PWR_LIMIT_DEFAULT);
 
-       if (amdgpu_in_reset(adev))
-               return -EPERM;
-       if (adev->in_suspend && !adev->in_runpm)
-               return -EPERM;
-
-       r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
-       if (r < 0) {
-               pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-               return r;
-       }
-
-       if (pp_funcs && pp_funcs->get_power_limit)
-               r = pp_funcs->get_power_limit(adev->powerplay.pp_handle, &limit,
-                                             pp_limit_level, power_type);
-       else
-               r = -ENODATA;
-
-       if (!r)
-               size = sysfs_emit(buf, "%u\n", limit * 1000000);
-       else
-               size = sysfs_emit(buf, "\n");
-
-       pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
-       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
-
-       return size;
 }
+
 static ssize_t amdgpu_hwmon_show_power_label(struct device *dev,
                                         struct device_attribute *attr,
                                         char *buf)