Move code which parses an input string into array of longs to a shared
location so following patches can make use of it.

QQQ:
Static inline in a header file is not the best. Figure out a better
place.

Signed-off-by: Tvrtko Ursulin <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h           | 36 +++++++++++++++++++
 .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 21 +++--------
 2 files changed, 41 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 17848ce65d1f..61019e64d376 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1804,4 +1804,40 @@ void amdgpu_device_set_uid(struct amdgpu_uid *uid_info,
                           uint64_t uid);
 uint64_t amdgpu_device_get_uid(struct amdgpu_uid *uid_info,
                               enum amdgpu_uid_type type, uint8_t inst);
+
+/**
+ * amdgpu_parse_buffer_l - parse text into array of longs
+ * @buf: input buffer (will be modified while parsing)
+ * @base: base argument for kstrtol
+ * @delimiters: array of delimiters separating arguments
+ * @param: output array
+ * @max_params: maximum number of params to store in the output array
+ *
+ * Returns zero for no parameters found, number of arguments found (capped to
+ * max_params), or the negative errno in case of a failure.
+ */
+static inline int amdgpu_parse_buffer_l(char *buf, unsigned int base,
+                                       const char *delimiters,
+                                       long *param, unsigned int max_params)
+{
+       char *token, *tmp = buf;
+       unsigned int i = 0;
+
+       while ((token = strsep(&tmp, delimiters)) != NULL) {
+               int ret;
+
+               if (!strlen(token))
+                       continue;
+
+               if (i == max_params)
+                       break;
+
+               ret = kstrtol(token, base, &param[i++]);
+               if (ret)
+                       return ret;
+       }
+
+       return i;
+}
+
 #endif
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 c18c4df6126f..dd6aa72de0c2 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
@@ -78,24 +78,13 @@ static int parse_write_buffer_into_params(char *buf,
                                          unsigned int max_param_num,
                                          unsigned int *param_nums)
 {
-       char *token, *tmp = buf;
-       unsigned int i = 0;
+       int ret;
 
-       while ((token = strsep(&tmp, " \n")) != NULL) {
-               int ret;
+       ret = amdgpu_parse_buffer_l(buf, 16, " \n", param, max_param_num);
+       if (ret < 0)
+               return ret;
 
-               if (!strlen(token))
-                       continue;
-
-               if (i == max_param_num)
-                       break;
-
-               ret = kstrtol(token, 16, &param[i++]);
-               if (ret)
-                       return ret;
-       }
-
-       *param_nums = i;
+       *param_nums = ret;
 
        return 0;
 }
-- 
2.48.0

Reply via email to