Hi all,
This patch series contains fixes and improvements for specifying video
modes on the kernel command line.
Changes compared to v1[1]:
- Add Reviewed-by, Acked-by,
- Keep length check.
This has been tested on ARAnyM using a work-in-progress Atari DRM driver
(more info and related patches can be found in [2]).
Thanks for your comments!
[1] "[PATCH 0/5] drm/modes: Command line mode selection fixes and
improvements"
https://lore.kernel.org/r/cover.1657301107.git.geert@linux-m68k.org
[2] "[PATCH v3 00/10] drm: Add support for low-color frame buffer formats"
https://lore.kernel.org/r/cover.1657294931.git.geert@linux-m68k.org
Geert Uytterhoeven (5):
drm/modes: parse_cmdline: Handle empty mode name part
drm/modes: Extract drm_mode_parse_cmdline_named_mode()
drm/modes: parse_cmdline: Make mode->*specified handling more uniform
drm/modes: Add support for driver-specific named modes
drm/modes: parse_cmdline: Add support for named modes containing
dashes
drivers/gpu/drm/drm_modes.c | 56 ++++++++++++++++++++++++++-----------
include/drm/drm_connector.h | 10 +++++++
2 files changed, 49 insertions(+), 17 deletions(-)
--
2.25.1
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
The mode parsing code recognizes named modes only if they are explicitly
listed in the internal whitelist, which is currently limited to "NTSC"
and "PAL".
Provide a mechanism for drivers to override this list to support custom
mode names.
Ideally, this list should just come from the driver's actual list of
modes, but connector->probed_modes is not yet populated at the time of
parsing.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Hans de Goede <redacted>
---
v2:
- Add Reviewed-by.
---
drivers/gpu/drm/drm_modes.c | 15 +++++++++++----
include/drm/drm_connector.h | 10 ++++++++++
2 files changed, 21 insertions(+), 4 deletions(-)
@@ -1748,24 +1748,30 @@ static int drm_mode_parse_cmdline_options(const char *str,staticconstchar*constdrm_named_modes_whitelist[]={"NTSC","PAL",+NULL};staticintdrm_mode_parse_cmdline_named_mode(constchar*name,unsignedintlength,boolrefresh,+conststructdrm_connector*connector,structdrm_cmdline_mode*mode){+constchar*const*named_modes_whitelist;unsignedinti;intret;-for(i=0;i<ARRAY_SIZE(drm_named_modes_whitelist);i++){-ret=str_has_prefix(name,drm_named_modes_whitelist[i]);+named_modes_whitelist=connector->named_modes_whitelist?:+drm_named_modes_whitelist;++for(i=0;named_modes_whitelist[i];i++){+ret=str_has_prefix(name,named_modes_whitelist[i]);if(ret!=length)continue;if(refresh)return-EINVAL;/* named + refresh is invalid */-strcpy(mode->name,drm_named_modes_whitelist[i]);+strcpy(mode->name,named_modes_whitelist[i]);mode->specified=true;return0;}
@@ -1849,7 +1855,8 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option,/* First check for a named mode */if(mode_end){ret=drm_mode_parse_cmdline_named_mode(name,mode_end,-refresh_ptr,mode);+refresh_ptr,connector,+mode);if(ret)returnfalse;}
It is fairly common for named video modes to contain dashes (e.g.
"tt-mid" on Atari, "dblntsc-ff" on Amiga). Currently such mode names
are not recognized, as the dash is considered to be a separator between
mode name and bpp.
Fix this by skipping any dashes that are not followed immediately by a
digit when looking for the separator.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Hans de Goede <redacted>
---
v2:
- Add Reviewed-by.
---
drivers/gpu/drm/drm_modes.c | 2 ++
1 file changed, 2 insertions(+)
@@ -1827,6 +1827,8 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option,/* Try to locate the bpp and refresh specifiers, if any */bpp_ptr=strchr(name,'-');+while(bpp_ptr&&!isdigit(bpp_ptr[1]))+bpp_ptr=strchr(bpp_ptr+1,'-');if(bpp_ptr)bpp_off=bpp_ptr-name;
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 <geert@linux-m68k.org>
Reviewed-by: Hans de Goede <redacted>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
---
v2:
- Add Reviewed-by, Acked-by,
- Fix length check.
---
drivers/gpu/drm/drm_modes.c | 40 +++++++++++++++++++++++++++----------
1 file changed, 29 insertions(+), 11 deletions(-)
@@ -1823,16 +1846,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==mode_end){-if(refresh_ptr)-returnfalse;/* 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)+returnfalse;}/* No named mode? Check for a normal mode argument, e.g. 1024x768 */
If no mode name part was specified, mode_end is zero, and the "ret ==
mode_end" check does the wrong thing.
Fix this by skipping all named mode handling when mode_end is zero.
Fixes: 7b1cce760afe38b4 ("drm/modes: parse_cmdline: Allow specifying stand-alone options")
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Hans de Goede <redacted>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
---
v2:
- Add Reviewed-by, Acked-by,
- Keep "ret == mode_end" check.
---
drivers/gpu/drm/drm_modes.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -1823,7 +1823,7 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option,}/* First check for a named mode */-for(i=0;i<ARRAY_SIZE(drm_named_modes_whitelist);i++){+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==mode_end){if(refresh_ptr)
The various mode->*specified flags are not handled in an uniform way:
some flags are set by the corresponding drm_mode_parse_cmdline_*()
function, some flags by the caller of the function, and some flags by
both.
Make this uniform by making this the responsibility of the various
parsing helpers, i.e.
- Move the setting of mode->specified from caller to callee,
- Drop the duplicate setting of mode->bpp_specified and
mode->refresh_specified from callers.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Hans de Goede <redacted>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
---
v2:
- Add Reviewed-by, Acked-by.
---
drivers/gpu/drm/drm_modes.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
From: Maxime Ripard <hidden> Date: 2022-07-14 12:05:15
Hi,
On Thu, Jul 14, 2022 at 11:04:06AM +0200, Geert Uytterhoeven wrote:
If no mode name part was specified, mode_end is zero, and the "ret ==
mode_end" check does the wrong thing.
Fix this by skipping all named mode handling when mode_end is zero.
Fixes: 7b1cce760afe38b4 ("drm/modes: parse_cmdline: Allow specifying stand-alone options")
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Hans de Goede <redacted>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
We should add a test for that in drivers/gpu/drm/tests/drm_cmdline_parser_test.c
Maxime
From: Maxime Ripard <hidden> Date: 2022-07-14 12:05:32
On Thu, Jul 14, 2022 at 11:04:07AM +0200, 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 <geert@linux-m68k.org>
Reviewed-by: Hans de Goede <redacted>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
From: Maxime Ripard <hidden> Date: 2022-07-14 12:05:50
On Thu, Jul 14, 2022 at 11:04:08AM +0200, Geert Uytterhoeven wrote:
The various mode->*specified flags are not handled in an uniform way:
some flags are set by the corresponding drm_mode_parse_cmdline_*()
function, some flags by the caller of the function, and some flags by
both.
Make this uniform by making this the responsibility of the various
parsing helpers, i.e.
- Move the setting of mode->specified from caller to callee,
- Drop the duplicate setting of mode->bpp_specified and
mode->refresh_specified from callers.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Hans de Goede <redacted>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
From: Maxime Ripard <hidden> Date: 2022-07-14 12:06:24
On Thu, Jul 14, 2022 at 11:04:10AM +0200, Geert Uytterhoeven wrote:
It is fairly common for named video modes to contain dashes (e.g.
"tt-mid" on Atari, "dblntsc-ff" on Amiga). Currently such mode names
are not recognized, as the dash is considered to be a separator between
mode name and bpp.
Fix this by skipping any dashes that are not followed immediately by a
digit when looking for the separator.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Hans de Goede <redacted>
From: Maxime Ripard <hidden> Date: 2022-07-14 12:11:30
On Thu, Jul 14, 2022 at 11:04:09AM +0200, Geert Uytterhoeven wrote:
The mode parsing code recognizes named modes only if they are explicitly
listed in the internal whitelist, which is currently limited to "NTSC"
and "PAL".
Provide a mechanism for drivers to override this list to support custom
mode names.
Ideally, this list should just come from the driver's actual list of
modes, but connector->probed_modes is not yet populated at the time of
parsing.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Hans de Goede <redacted>
Like we discussed on IRC, I'm not sure allowing drivers to handle named
modes is the right thing to do.
Named modes in general were a workaround the fact that we were missing
infos in drm_display_mode to describe all the modes.
I think we really should focus on addressing that first, and then
creating some kind of backward compat layer to create an initial DRM
state from a named mode provided on the command line.
Maxime