Hi,

On 7/8/22 20:21, Geert Uytterhoeven wrote:
> Extract the code to check for a named mode parameter into its own
> function, to streamline the main parsing flow.
> 
> Signed-off-by: Geert Uytterhoeven <[email protected]>
> ---
>  drivers/gpu/drm/drm_modes.c | 41 +++++++++++++++++++++++++++----------
>  1 file changed, 30 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
> index 30a7be97707bfb16..434383469e9d984d 100644
> --- a/drivers/gpu/drm/drm_modes.c
> +++ b/drivers/gpu/drm/drm_modes.c
> @@ -1749,6 +1749,30 @@ static const char * const drm_named_modes_whitelist[] 
> = {
>       "PAL",
>  };
>  
> +static int drm_mode_parse_cmdline_named_mode(const char *name,
> +                                          unsigned int length,
> +                                          bool refresh,
> +                                          struct drm_cmdline_mode *mode)
> +{
> +     unsigned int i;
> +     int ret;
> +
> +     for (i = 0; i < ARRAY_SIZE(drm_named_modes_whitelist); i++) {
> +             ret = str_has_prefix(name, drm_named_modes_whitelist[i]);
> +             if (!ret)

As discussed in my review of 1/5 this needs to become:

                if (ret != length)
> +                     continue;

Which renders my other comment on this patch (length not being used) mute.

Regards,

Hans

> +
> +             if (refresh)
> +                     return -EINVAL; /* named + refresh is invalid */
> +
> +             strcpy(mode->name, drm_named_modes_whitelist[i]);
> +             mode->specified = true;
> +             return 0;
> +     }
> +
> +     return 0;
> +}
> +
>  /**
>   * drm_mode_parse_command_line_for_connector - parse command line modeline 
> for connector
>   * @mode_option: optional per connector mode option
> @@ -1785,7 +1809,7 @@ bool drm_mode_parse_command_line_for_connector(const 
> char *mode_option,
>       const char *bpp_ptr = NULL, *refresh_ptr = NULL, *extra_ptr = NULL;
>       const char *options_ptr = NULL;
>       char *bpp_end_ptr = NULL, *refresh_end_ptr = NULL;
> -     int i, len, ret;
> +     int len, ret;
>  
>       memset(mode, 0, sizeof(*mode));
>       mode->panel_orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
> @@ -1823,16 +1847,11 @@ bool drm_mode_parse_command_line_for_connector(const 
> char *mode_option,
>       }
>  
>       /* First check for a named mode */
> -     for (i = 0; mode_end && i < ARRAY_SIZE(drm_named_modes_whitelist); i++) 
> {
> -             ret = str_has_prefix(name, drm_named_modes_whitelist[i]);
> -             if (ret) {
> -                     if (refresh_ptr)
> -                             return false; /* named + refresh is invalid */
> -
> -                     strcpy(mode->name, drm_named_modes_whitelist[i]);
> -                     mode->specified = true;
> -                     break;
> -             }
> +     if (mode_end) {
> +             ret = drm_mode_parse_cmdline_named_mode(name, mode_end,
> +                                                     refresh_ptr, mode);
> +             if (ret)
> +                     return false;
>       }
>  
>       /* No named mode? Check for a normal mode argument, e.g. 1024x768 */

Reply via email to