diff options
author | Maxime Ripard <maxime.ripard@bootlin.com> | 2019-08-27 07:58:48 -0400 |
---|---|---|
committer | Maxime Ripard <mripard@kernel.org> | 2019-08-30 04:19:15 -0400 |
commit | 728a257f652aee5dd03ecde90b11f414a255e08b (patch) | |
tree | 1dd8343e79f614da77ff95359b5f5fd72d6d17ce | |
parent | 325d0ab3a1d1ad8b8c4f9f03fd866e55b0e24254 (diff) |
drm/modes: Fix the command line parser to take force options into account
The command line parser when it has been rewritten introduced a regression
when the only thing on the command line is an option to force the detection
of a connector (such as video=HDMI-A-1:d), which are completely valid.
It's been further broken by the support for the named modes which take
anything that is not a resolution as a named mode.
Let's fix this by running the extra command line option parser on the named
modes if they only take a single character.
Fixes: e08ab74bd4c7 ("drm/modes: Rewrite the command line parser")
Reported-by: Jernej Škrabec <jernej.skrabec@gmail.com>
Reported-by: Thomas Graichen <thomas.graichen@googlemail.com>
Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
Tested-by: Thomas Graichen <thomas.graichen@gmail.com>
Reviewed-by: Jernej Skrabec <jernej.skrabec@siol.net>
Signed-off-by: Maxime Ripard <mripard@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20190827115850.25731-2-mripard@kernel.org
-rw-r--r-- | drivers/gpu/drm/drm_modes.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c index 3d10425f6b18..27fe410bba5c 100644 --- a/drivers/gpu/drm/drm_modes.c +++ b/drivers/gpu/drm/drm_modes.c | |||
@@ -1733,16 +1733,30 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option, | |||
1733 | * bunch of things: | 1733 | * bunch of things: |
1734 | * - We need to make sure that the first character (which | 1734 | * - We need to make sure that the first character (which |
1735 | * would be our resolution in X) is a digit. | 1735 | * would be our resolution in X) is a digit. |
1736 | * - However, if the X resolution is missing, then we end up | 1736 | * - If not, then it's either a named mode or a force on/off. |
1737 | * with something like x<yres>, with our first character | 1737 | * To distinguish between the two, we need to run the |
1738 | * being an alpha-numerical character, which would be | 1738 | * extra parsing function, and if not, then we consider it |
1739 | * considered a named mode. | 1739 | * a named mode. |
1740 | * | 1740 | * |
1741 | * If this isn't enough, we should add more heuristics here, | 1741 | * If this isn't enough, we should add more heuristics here, |
1742 | * and matching unit-tests. | 1742 | * and matching unit-tests. |
1743 | */ | 1743 | */ |
1744 | if (!isdigit(name[0]) && name[0] != 'x') | 1744 | if (!isdigit(name[0]) && name[0] != 'x') { |
1745 | unsigned int namelen = strlen(name); | ||
1746 | |||
1747 | /* | ||
1748 | * Only the force on/off options can be in that case, | ||
1749 | * and they all take a single character. | ||
1750 | */ | ||
1751 | if (namelen == 1) { | ||
1752 | ret = drm_mode_parse_cmdline_extra(name, namelen, true, | ||
1753 | connector, mode); | ||
1754 | if (!ret) | ||
1755 | return true; | ||
1756 | } | ||
1757 | |||
1745 | named_mode = true; | 1758 | named_mode = true; |
1759 | } | ||
1746 | 1760 | ||
1747 | /* Try to locate the bpp and refresh specifiers, if any */ | 1761 | /* Try to locate the bpp and refresh specifiers, if any */ |
1748 | bpp_ptr = strchr(name, '-'); | 1762 | bpp_ptr = strchr(name, '-'); |