summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaxime Ripard <maxime.ripard@bootlin.com>2019-08-27 07:58:48 -0400
committerMaxime Ripard <mripard@kernel.org>2019-08-30 04:19:15 -0400
commit728a257f652aee5dd03ecde90b11f414a255e08b (patch)
tree1dd8343e79f614da77ff95359b5f5fd72d6d17ce
parent325d0ab3a1d1ad8b8c4f9f03fd866e55b0e24254 (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.c24
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, '-');