Den 18.04.2019 14.41, skrev Maxime Ripard:
> From: Maxime Ripard <maxime.rip...@free-electrons.com>
> 
> The drm subsystem also uses the video= kernel parameter, and in the
> documentation refers to the fbdev documentation for that parameter.
> 
> However, that documentation also says that instead of giving the mode using
> its resolution we can also give a name. However, DRM doesn't handle that
> case at the moment. Even though in most case it shouldn't make any
> difference, it might be useful for analog modes, where different standards
> might have the same resolution, but still have a few different parameters
> that are not encoded in the modes (NTSC vs NTSC-J vs PAL-M for example).
> 
> Signed-off-by: Maxime Ripard <maxime.rip...@free-electrons.com>
> ---
>  drivers/gpu/drm/drm_client_modeset.c |  4 ++-
>  drivers/gpu/drm/drm_connector.c      |  3 +-
>  drivers/gpu/drm/drm_modes.c          | 52 ++++++++++++++++++++---------
>  include/drm/drm_connector.h          |  1 +-
>  4 files changed, 44 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_client_modeset.c 
> b/drivers/gpu/drm/drm_client_modeset.c
> index 2a428ac00930..f2869c82510c 100644
> --- a/drivers/gpu/drm/drm_client_modeset.c
> +++ b/drivers/gpu/drm/drm_client_modeset.c
> @@ -149,6 +149,10 @@ drm_connector_pick_cmdline_mode(struct drm_connector 
> *connector)
>       prefer_non_interlace = !cmdline_mode->interlace;
>  again:
>       list_for_each_entry(mode, &connector->modes, head) {
> +             /* Check (optional) mode name first */
> +             if (!strcmp(mode->name, cmdline_mode->name))
> +                     return mode;
> +
>               /* check width/height */
>               if (mode->hdisplay != cmdline_mode->xres ||
>                   mode->vdisplay != cmdline_mode->yres)
> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> index 2355124849db..e33814f5940e 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
> @@ -139,8 +139,9 @@ static void drm_connector_get_cmdline_mode(struct 
> drm_connector *connector)
>               connector->force = mode->force;
>       }
>  
> -     DRM_DEBUG_KMS("cmdline mode for connector %s %dx%d@%dHz%s%s%s\n",
> +     DRM_DEBUG_KMS("cmdline mode for connector %s %s %dx%d@%dHz%s%s%s\n",
>                     connector->name,
> +                   mode->name ? mode->name : "",
>                     mode->xres, mode->yres,
>                     mode->refresh_specified ? mode->refresh : 60,
>                     mode->rb ? " reduced blanking" : "",
> diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
> index 3f89198f0891..9613c1a28487 100644
> --- a/drivers/gpu/drm/drm_modes.c
> +++ b/drivers/gpu/drm/drm_modes.c
> @@ -1557,7 +1557,7 @@ bool drm_mode_parse_command_line_for_connector(const 
> char *mode_option,
>                                              struct drm_cmdline_mode *mode)
>  {
>       const char *name;
> -     bool parse_extras = false;
> +     bool named_mode = false, parse_extras = false;

You don't need to assign a value here, or if you do, you can drop the
else further down.

Reviewed-by: Noralf Trønnes <nor...@tronnes.org>

>       unsigned int bpp_off = 0, refresh_off = 0;
>       unsigned int mode_end = 0;
>       char *bpp_ptr = NULL, *refresh_ptr = NULL, *extra_ptr = NULL;
> @@ -1576,8 +1576,14 @@ bool drm_mode_parse_command_line_for_connector(const 
> char *mode_option,
>  
>       name = mode_option;
>  
> +     /*
> +      * If the first character is not a digit, then it means that
> +      * we have a named mode.
> +      */
>       if (!isdigit(name[0]))
> -             return false;
> +             named_mode = true;
> +     else
> +             named_mode = false;
>  
>       /* Try to locate the bpp and refresh specifiers, if any */
>       bpp_ptr = strchr(name, '-');
> @@ -1588,6 +1594,9 @@ bool drm_mode_parse_command_line_for_connector(const 
> char *mode_option,
>  
>       refresh_ptr = strchr(name, '@');
>       if (refresh_ptr) {
> +             if (named_mode)
> +                     return false;
> +
>               refresh_off = refresh_ptr - name;
>               mode->refresh_specified = true;
>       }
> @@ -1604,12 +1613,16 @@ bool drm_mode_parse_command_line_for_connector(const 
> char *mode_option,
>               parse_extras = true;
>       }
>  
> -     ret = drm_mode_parse_cmdline_res_mode(name, mode_end,
> -                                           parse_extras,
> -                                           connector,
> -                                           mode);
> -     if (ret)
> -             return false;
> +     if (named_mode) {
> +             strncpy(mode->name, name, mode_end);
> +     } else {
> +             ret = drm_mode_parse_cmdline_res_mode(name, mode_end,
> +                                                   parse_extras,
> +                                                   connector,
> +                                                   mode);
> +             if (ret)
> +                     return false;
> +     }
>       mode->specified = true;
>  
>       if (bpp_ptr) {
> @@ -1637,14 +1650,23 @@ bool drm_mode_parse_command_line_for_connector(const 
> char *mode_option,
>               extra_ptr = refresh_end_ptr;
>  
>       if (extra_ptr) {
> -             int remaining = strlen(name) - (extra_ptr - name);
> +             if (!named_mode) {
> +                     int len = strlen(name) - (extra_ptr - name);
>  
> -             /*
> -              * We still have characters to process, while
> -              * we shouldn't have any
> -              */
> -             if (remaining > 0)
> -                     return false;
> +                     ret = drm_mode_parse_cmdline_extra(extra_ptr, len,
> +                                                        connector, mode);
> +                     if (ret)
> +                             return false;
> +             } else {
> +                     int remaining = strlen(name) - (extra_ptr - name);
> +
> +                     /*
> +                      * We still have characters to process, while
> +                      * we shouldn't have any
> +                      */
> +                     if (remaining > 0)
> +                             return false;
> +             }
>       }
>  
>       return true;
> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> index 02a131202add..06aa3b9cb920 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -896,6 +896,7 @@ struct drm_connector_funcs {
>  
>  /* mode specified on the command line */
>  struct drm_cmdline_mode {
> +     char name[DRM_DISPLAY_MODE_LEN];
>       bool specified;
>       bool refresh_specified;
>       bool bpp_specified;
> 
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to