Simplify debugfs token parsing by noticing there is no need to pre-
validate the string. We can let the main strsep driven loop skip
delimiters and check for the maximum supported number of arguments as it
goes through the string.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursu...@igalia.com>
---
 .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 87 +++++--------------
 1 file changed, 24 insertions(+), 63 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
index a2d6e298489f..c18c4df6126f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
@@ -73,68 +73,29 @@ static const char *const mst_progress_status[] = {
  * parameters that could be parsed.
  *
  */
-static int parse_write_buffer_into_params(char *wr_buf,
-                                         unsigned int wr_buf_size,
+static int parse_write_buffer_into_params(char *buf,
                                          long *param,
                                          unsigned int max_param_num,
                                          unsigned int *param_nums)
 {
-       const char delimiter[3] = {' ', '\n', '\0'};
-       unsigned int wr_buf_count = 0;
-       unsigned int param_index = 0;
-       char *wr_buf_ptr = NULL;
-       char *sub_str = NULL;
-       int r;
+       char *token, *tmp = buf;
+       unsigned int i = 0;
 
-       *param_nums = 0;
+       while ((token = strsep(&tmp, " \n")) != NULL) {
+               int ret;
 
-       wr_buf_ptr = wr_buf;
+               if (!strlen(token))
+                       continue;
 
-       /* check number of parameters. isspace could not differ space and \n */
-       while ((*wr_buf_ptr != 0xa) && (wr_buf_count < wr_buf_size)) {
-               /* skip space*/
-               while (isspace(*wr_buf_ptr) && (wr_buf_count < wr_buf_size)) {
-                       wr_buf_ptr++;
-                       wr_buf_count++;
-                       }
-
-               if (wr_buf_count == wr_buf_size)
-                       break;
-
-               /* skip non-space*/
-               while ((!isspace(*wr_buf_ptr)) && (wr_buf_count < wr_buf_size)) 
{
-                       wr_buf_ptr++;
-                       wr_buf_count++;
-               }
-
-               (*param_nums)++;
-
-               if (wr_buf_count == wr_buf_size)
+               if (i == max_param_num)
                        break;
-       }
 
-       if (*param_nums > max_param_num)
-               *param_nums = max_param_num;
-
-       wr_buf_ptr = wr_buf; /* reset buf pointer */
-       wr_buf_count = 0; /* number of char already checked */
-
-       while (isspace(*wr_buf_ptr) && (wr_buf_count < wr_buf_size)) {
-               wr_buf_ptr++;
-               wr_buf_count++;
+               ret = kstrtol(token, 16, &param[i++]);
+               if (ret)
+                       return ret;
        }
 
-       while (param_index < *param_nums) {
-               /* after strsep, wr_buf_ptr will be moved to after space */
-               sub_str = strsep(&wr_buf_ptr, delimiter);
-
-               r = kstrtol(sub_str, 16, &(param[param_index]));
-
-               if (r)
-                       DRM_DEBUG_DRIVER("string to int convert error code: 
%d\n", r);
-
-               param_index++;
-       }
+       *param_nums = i;
 
        return 0;
 }
@@ -271,7 +232,7 @@ static ssize_t dp_link_settings_write(struct file *f, const 
char __user *buf,
        if (IS_ERR(wr_buf))
                return PTR_ERR(wr_buf);
 
-       if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
+       if (parse_write_buffer_into_params(wr_buf,
                                           param, max_param_num, &param_nums)) {
                kfree(wr_buf);
                return -EINVAL;
@@ -403,7 +364,7 @@ static ssize_t dp_mst_link_setting(struct file *f, const 
char __user *buf,
        if (IS_ERR(wr_buf))
                return PTR_ERR(wr_buf);
 
-       if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
+       if (parse_write_buffer_into_params(wr_buf,
                                           param, max_param_num, &param_nums)) {
                kfree(wr_buf);
                return -EINVAL;
@@ -619,7 +580,7 @@ static ssize_t dp_phy_settings_write(struct file *f, const 
char __user *buf,
        if (IS_ERR(wr_buf))
                return PTR_ERR(wr_buf);
 
-       if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
+       if (parse_write_buffer_into_params(wr_buf,
                                           param, max_param_num, &param_nums)) {
                kfree(wr_buf);
                return -EINVAL;
@@ -767,7 +728,7 @@ static ssize_t dp_phy_test_pattern_debugfs_write(struct 
file *f, const char __us
        if (IS_ERR(wr_buf))
                return PTR_ERR(wr_buf);
 
-       if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
+       if (parse_write_buffer_into_params(wr_buf,
                                           param, max_param_num, &param_nums)) {
                kfree(wr_buf);
                return -EINVAL;
@@ -1196,7 +1157,7 @@ static ssize_t dp_dsc_passthrough_set(struct file *f, 
const char __user *buf,
        if (IS_ERR(wr_buf))
                return PTR_ERR(wr_buf);
 
-       if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
+       if (parse_write_buffer_into_params(wr_buf,
                                           &param, max_param_num,
                                           &param_nums)) {
                kfree(wr_buf);
@@ -1435,7 +1396,7 @@ static ssize_t trigger_hotplug(struct file *f, const char 
__user *buf,
        if (IS_ERR(wr_buf))
                return PTR_ERR(wr_buf);
 
-       if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
+       if (parse_write_buffer_into_params(wr_buf,
                                           param, max_param_num, &param_nums)) {
                kfree(wr_buf);
                return -EINVAL;
@@ -1628,7 +1589,7 @@ static ssize_t dp_dsc_clock_en_write(struct file *f, 
const char __user *buf,
        if (IS_ERR(wr_buf))
                return PTR_ERR(wr_buf);
 
-       if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
+       if (parse_write_buffer_into_params(wr_buf,
                                           param, max_param_num, &param_nums)) {
                kfree(wr_buf);
                return -EINVAL;
@@ -1807,7 +1768,7 @@ static ssize_t dp_dsc_slice_width_write(struct file *f, 
const char __user *buf,
        if (IS_ERR(wr_buf))
                return PTR_ERR(wr_buf);
 
-       if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
+       if (parse_write_buffer_into_params(wr_buf,
                                           param, max_param_num, &param_nums)) {
                kfree(wr_buf);
                return -EINVAL;
@@ -1986,7 +1947,7 @@ static ssize_t dp_dsc_slice_height_write(struct file *f, 
const char __user *buf,
        if (IS_ERR(wr_buf))
                return PTR_ERR(wr_buf);
 
-       if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
+       if (parse_write_buffer_into_params(wr_buf,
                                           param, max_param_num, &param_nums)) {
                kfree(wr_buf);
                return -EINVAL;
@@ -2158,7 +2119,7 @@ static ssize_t dp_dsc_bits_per_pixel_write(struct file 
*f, const char __user *bu
        if (IS_ERR(wr_buf))
                return PTR_ERR(wr_buf);
 
-       if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
+       if (parse_write_buffer_into_params(wr_buf,
                                           param, max_param_num, &param_nums)) {
                kfree(wr_buf);
                return -EINVAL;
@@ -2581,7 +2542,7 @@ static ssize_t dp_max_bpc_write(struct file *f, const 
char __user *buf,
        if (IS_ERR(wr_buf))
                return PTR_ERR(wr_buf);
 
-       if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
+       if (parse_write_buffer_into_params(wr_buf,
                                           param, max_param_num, &param_nums)) {
                kfree(wr_buf);
                return -EINVAL;
@@ -3399,7 +3360,7 @@ static ssize_t edp_ilr_write(struct file *f, const char 
__user *buf,
        if (IS_ERR(wr_buf))
                return PTR_ERR(wr_buf);
 
-       if (parse_write_buffer_into_params(wr_buf, wr_buf_size,
+       if (parse_write_buffer_into_params(wr_buf,
                                           param, max_param_num, &param_nums)) {
                kfree(wr_buf);
                return -EINVAL;
-- 
2.48.0

Reply via email to