Use the previously added common helper for parsing sysfs writes into
arrays of longs.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursu...@igalia.com>
---
 drivers/gpu/drm/amd/pm/amdgpu_pm.c | 236 ++++++++++-------------------
 1 file changed, 83 insertions(+), 153 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c 
b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
index 4503220c09aa..9154c75fd95a 100644
--- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
@@ -751,16 +751,14 @@ static ssize_t amdgpu_set_pp_od_clk_voltage(struct device 
*dev,
 {
        struct drm_device *ddev = dev_get_drvdata(dev);
        struct amdgpu_device *adev = drm_to_adev(ddev);
-       int ret;
-       uint32_t parameter_size = 0;
-       long parameter[64];
-       char buf_cpy[128];
-       char *tmp_str;
-       char *sub_str;
-       const char delimiter[3] = {' ', '\n', '\0'};
+       unsigned int num_args;
+       char copy[128];
+       long args[64];
        uint32_t type;
+       char *tmp;
+       int ret;
 
-       if (count > 127 || count == 0)
+       if (count >= sizeof(copy) || count == 0)
                return -EINVAL;
 
        if (*buf == 's')
@@ -780,60 +778,47 @@ static ssize_t amdgpu_set_pp_od_clk_voltage(struct device 
*dev,
        else
                return -EINVAL;
 
-       memcpy(buf_cpy, buf, count);
-       buf_cpy[count] = 0;
-
-       tmp_str = buf_cpy;
+       memcpy(copy, buf, count);
+       copy[count] = 0;
 
+       /* Skip command characters. */
+       tmp = &copy[1];
        if ((type == PP_OD_EDIT_VDDC_CURVE) ||
             (type == PP_OD_EDIT_VDDGFX_OFFSET))
-               tmp_str++;
-       while (isspace(*++tmp_str));
+               tmp++;
 
-       while ((sub_str = strsep(&tmp_str, delimiter)) != NULL) {
-               if (strlen(sub_str) == 0)
-                       continue;
-               ret = kstrtol(sub_str, 0, &parameter[parameter_size]);
-               if (ret)
-                       return -EINVAL;
-               parameter_size++;
-
-               if (!tmp_str)
-                       break;
-
-               while (isspace(*tmp_str))
-                       tmp_str++;
-       }
+       ret = amdgpu_parse_buffer_l(tmp, 0, " \n", args, ARRAY_SIZE(args));
+       if (ret < 0)
+               return ret;
+       num_args = ret;
 
        ret = amdgpu_pm_get_access(adev);
        if (ret < 0)
                return ret;
 
-       if (amdgpu_dpm_set_fine_grain_clk_vol(adev,
-                                             type,
-                                             parameter,
-                                             parameter_size))
-               goto err_out;
+       if (amdgpu_dpm_set_fine_grain_clk_vol(adev, type, args, num_args)) {
+               ret = -EINVAL;
+               goto out;
+       }
 
-       if (amdgpu_dpm_odn_edit_dpm_table(adev, type,
-                                         parameter, parameter_size))
-               goto err_out;
+       if (amdgpu_dpm_odn_edit_dpm_table(adev, type, args, num_args)) {
+               ret = -EINVAL;
+               goto out;
+       }
 
        if (type == PP_OD_COMMIT_DPM_TABLE) {
                if (amdgpu_dpm_dispatch_task(adev,
                                             AMD_PP_TASK_READJUST_POWER_STATE,
-                                            NULL))
-                       goto err_out;
+                                            NULL)) {
+                       ret = -EINVAL;
+                       goto out;
+               }
        }
 
+out:
        amdgpu_pm_put_access(adev);
 
-       return count;
-
-err_out:
-       amdgpu_pm_put_access(adev);
-
-       return -EINVAL;
+       return ret ?: count;
 }
 
 static ssize_t amdgpu_get_pp_od_clk_voltage(struct device *dev,
@@ -1367,17 +1352,14 @@ static ssize_t amdgpu_set_pp_power_profile_mode(struct 
device *dev,
                const char *buf,
                size_t count)
 {
-       int ret;
        struct drm_device *ddev = dev_get_drvdata(dev);
        struct amdgpu_device *adev = drm_to_adev(ddev);
-       uint32_t parameter_size = 0;
-       long parameter[64];
-       char *sub_str, buf_cpy[128];
-       char *tmp_str;
-       uint32_t i = 0;
-       char tmp[2];
+       unsigned int num_args;
        long int profile_mode;
-       const char delimiter[3] = {' ', '\n', '\0'};
+       char copy[128];
+       long args[64];
+       char tmp[2];
+       int ret;
 
        tmp[0] = *(buf);
        tmp[1] = '\0';
@@ -1386,39 +1368,29 @@ static ssize_t amdgpu_set_pp_power_profile_mode(struct 
device *dev,
                return -EINVAL;
 
        if (profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) {
-               if (count < 2 || count > 127)
+               if (count < 2 || count >= sizeof(copy))
                        return -EINVAL;
-               while (isspace(*++buf))
-                       i++;
-               memcpy(buf_cpy, buf, count-i);
-               tmp_str = buf_cpy;
-               while ((sub_str = strsep(&tmp_str, delimiter)) != NULL) {
-                       if (strlen(sub_str) == 0)
-                               continue;
-                       ret = kstrtol(sub_str, 0, &parameter[parameter_size]);
-                       if (ret)
-                               return -EINVAL;
-                       parameter_size++;
-                       if (!tmp_str)
-                               break;
-                       while (isspace(*tmp_str))
-                               tmp_str++;
-               }
+
+               memcpy(copy, &buf[1], count - 1);
+
+               ret = amdgpu_parse_buffer_l(copy, 0, " \n",
+                                           args, ARRAY_SIZE(args));
+               if (ret < 0)
+                       return ret;
+
+               num_args = ret;
        }
-       parameter[parameter_size] = profile_mode;
+       args[num_args] = profile_mode;
 
        ret = amdgpu_pm_get_access(adev);
        if (ret < 0)
                return ret;
 
-       ret = amdgpu_dpm_set_power_profile_mode(adev, parameter, 
parameter_size);
+       ret = amdgpu_dpm_set_power_profile_mode(adev, args, num_args);
 
        amdgpu_pm_put_access(adev);
 
-       if (!ret)
-               return count;
-
-       return -EINVAL;
+       return ret ?: count;
 }
 
 static int amdgpu_hwmon_get_sensor_generic(struct amdgpu_device *adev,
@@ -2277,32 +2249,18 @@ static ssize_t amdgpu_set_pm_policy_attr(struct device 
*dev,
        struct drm_device *ddev = dev_get_drvdata(dev);
        struct amdgpu_device *adev = drm_to_adev(ddev);
        struct amdgpu_pm_policy_attr *policy_attr;
-       int ret, num_params = 0;
-       char delimiter[] = " \n\t";
-       char tmp_buf[128];
-       char *tmp, *param;
+       char copy[128];
        long val;
+       int ret;
 
-       count = min(count, sizeof(tmp_buf));
-       memcpy(tmp_buf, buf, count);
-       tmp_buf[count - 1] = '\0';
-       tmp = tmp_buf;
+       count = min(count, sizeof(copy));
+       memcpy(copy, buf, count);
+       copy[count - 1] = '\0';
 
-       tmp = skip_spaces(tmp);
-       while ((param = strsep(&tmp, delimiter))) {
-               if (!strlen(param)) {
-                       tmp = skip_spaces(tmp);
-                       continue;
-               }
-               ret = kstrtol(param, 0, &val);
-               if (ret)
-                       return -EINVAL;
-               num_params++;
-               if (num_params > 1)
-                       return -EINVAL;
-       }
-
-       if (num_params != 1)
+       ret = amdgpu_parse_buffer_l(copy, 0, " \t\n", &val, 1);
+       if (ret < 0)
+               return ret;
+       else if (ret != 1)
                return -EINVAL;
 
        policy_attr =
@@ -2316,10 +2274,7 @@ static ssize_t amdgpu_set_pm_policy_attr(struct device 
*dev,
 
        amdgpu_pm_put_access(adev);
 
-       if (ret)
-               return ret;
-
-       return count;
+       return ret ?: count;
 }
 
 #define AMDGPU_PM_POLICY_ATTR(_name, _id)                                  \
@@ -3728,58 +3683,43 @@ static int amdgpu_retrieve_od_settings(struct 
amdgpu_device *adev,
        return size;
 }
 
-static int parse_input_od_command_lines(const char *buf,
-                                       size_t count,
+static int parse_input_od_command_lines(const char *buf, size_t count,
                                        u32 *type,
-                                       long *params,
-                                       uint32_t *num_of_params)
+                                       long *args, unsigned int *num_args)
 {
-       const char delimiter[3] = {' ', '\n', '\0'};
-       uint32_t parameter_size = 0;
-       char buf_cpy[128] = {0};
-       char *tmp_str, *sub_str;
+       const unsigned int max_args = *num_args;
+       char copy[128], *p = copy;
        int ret;
 
-       if (count > sizeof(buf_cpy) - 1)
+       if (count > sizeof(copy) - 1)
                return -EINVAL;
 
-       memcpy(buf_cpy, buf, count);
-       tmp_str = buf_cpy;
+       *num_args = 0;
+
+       memcpy(copy, buf, count);
 
        /* skip heading spaces */
-       while (isspace(*tmp_str))
-               tmp_str++;
+       while (isspace(*p))
+               p++;
 
-       switch (*tmp_str) {
+       switch (*p) {
        case 'c':
                *type = PP_OD_COMMIT_DPM_TABLE;
                return 0;
        case 'r':
-               params[parameter_size] = *type;
-               *num_of_params = 1;
+               args[0] = *type;
+               *num_args = 1;
                *type = PP_OD_RESTORE_DEFAULT_TABLE;
                return 0;
        default:
                break;
        }
 
-       while ((sub_str = strsep(&tmp_str, delimiter)) != NULL) {
-               if (strlen(sub_str) == 0)
-                       continue;
+       ret = amdgpu_parse_buffer_l(p, 0, " \n", args, max_args);
+       if (ret < 0)
+               return ret;
 
-               ret = kstrtol(sub_str, 0, &params[parameter_size]);
-               if (ret)
-                       return -EINVAL;
-               parameter_size++;
-
-               if (!tmp_str)
-                       break;
-
-               while (isspace(*tmp_str))
-                       tmp_str++;
-       }
-
-       *num_of_params = parameter_size;
+       *num_args = ret;
 
        return 0;
 }
@@ -3790,15 +3730,12 @@ amdgpu_distribute_custom_od_settings(struct 
amdgpu_device *adev,
                                     const char *in_buf,
                                     size_t count)
 {
-       uint32_t parameter_size = 0;
-       long parameter[64];
+       long args[64];
+       unsigned int max_args = ARRAY_SIZE(args);
        int ret;
 
-       ret = parse_input_od_command_lines(in_buf,
-                                          count,
-                                          &cmd_type,
-                                          parameter,
-                                          &parameter_size);
+       ret = parse_input_od_command_lines(in_buf, count, &cmd_type, args,
+                                          &max_args);
        if (ret)
                return ret;
 
@@ -3806,29 +3743,22 @@ amdgpu_distribute_custom_od_settings(struct 
amdgpu_device *adev,
        if (ret < 0)
                return ret;
 
-       ret = amdgpu_dpm_odn_edit_dpm_table(adev,
-                                           cmd_type,
-                                           parameter,
-                                           parameter_size);
+       ret = amdgpu_dpm_odn_edit_dpm_table(adev, cmd_type, args, max_args);
        if (ret)
-               goto err_out;
+               goto out;
 
        if (cmd_type == PP_OD_COMMIT_DPM_TABLE) {
                ret = amdgpu_dpm_dispatch_task(adev,
                                               AMD_PP_TASK_READJUST_POWER_STATE,
                                               NULL);
                if (ret)
-                       goto err_out;
+                       goto out;
        }
 
+out:
        amdgpu_pm_put_access(adev);
 
-       return count;
-
-err_out:
-       amdgpu_pm_put_access(adev);
-
-       return ret;
+       return ret ?: count;
 }
 
 /**
-- 
2.48.0

Reply via email to