aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-4.19/950-0640-drm-modes-Support-modes-names-on-the-command-line.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-4.19/950-0640-drm-modes-Support-modes-names-on-the-command-line.patch')
-rw-r--r--target/linux/bcm27xx/patches-4.19/950-0640-drm-modes-Support-modes-names-on-the-command-line.patch174
1 files changed, 174 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-4.19/950-0640-drm-modes-Support-modes-names-on-the-command-line.patch b/target/linux/bcm27xx/patches-4.19/950-0640-drm-modes-Support-modes-names-on-the-command-line.patch
new file mode 100644
index 0000000000..1cacab25e2
--- /dev/null
+++ b/target/linux/bcm27xx/patches-4.19/950-0640-drm-modes-Support-modes-names-on-the-command-line.patch
@@ -0,0 +1,174 @@
+From 2cea4924c69b6be5cfe8d976810ccf76a3991230 Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime.ripard@bootlin.com>
+Date: Wed, 19 Jun 2019 12:17:50 +0200
+Subject: [PATCH] drm/modes: Support modes names on the command line
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+commit 3aeeb13d899627fe2b86bdbdcd0927cf7192234f upstream.
+Minor conflict resolution as upstream has moved functions
+from drm_fb_helper.c to a new drm_client_modeset.c
+
+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).
+
+Reviewed-by: Noralf Trønnes <noralf@tronnes.org>
+Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
+Link: https://patchwork.freedesktop.org/patch/msgid/18443e0c3bdbbd16cea4ec63bc7f2079b820b43b.1560783090.git-series.maxime.ripard@bootlin.com
+---
+ drivers/gpu/drm/drm_connector.c | 3 +-
+ drivers/gpu/drm/drm_fb_helper.c | 4 +++
+ drivers/gpu/drm/drm_modes.c | 62 ++++++++++++++++++++++++---------
+ include/drm/drm_connector.h | 7 ++++
+ 4 files changed, 59 insertions(+), 17 deletions(-)
+
+--- a/drivers/gpu/drm/drm_connector.c
++++ b/drivers/gpu/drm/drm_connector.c
+@@ -135,8 +135,9 @@ static void drm_connector_get_cmdline_mo
+ 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" : "",
+--- a/drivers/gpu/drm/drm_fb_helper.c
++++ b/drivers/gpu/drm/drm_fb_helper.c
+@@ -2104,6 +2104,10 @@ struct drm_display_mode *drm_pick_cmdlin
+ prefer_non_interlace = !cmdline_mode->interlace;
+ again:
+ list_for_each_entry(mode, &fb_helper_conn->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)
+--- a/drivers/gpu/drm/drm_modes.c
++++ b/drivers/gpu/drm/drm_modes.c
+@@ -1586,7 +1586,7 @@ bool drm_mode_parse_command_line_for_con
+ struct drm_cmdline_mode *mode)
+ {
+ const char *name;
+- bool parse_extras = false;
++ bool named_mode = false, parse_extras = false;
+ unsigned int bpp_off = 0, refresh_off = 0;
+ unsigned int mode_end = 0;
+ char *bpp_ptr = NULL, *refresh_ptr = NULL, *extra_ptr = NULL;
+@@ -1605,8 +1605,22 @@ bool drm_mode_parse_command_line_for_con
+
+ name = mode_option;
+
+- if (!isdigit(name[0]))
+- return false;
++ /*
++ * This is a bit convoluted. To differentiate between the
++ * named modes and poorly formatted resolutions, we need a
++ * bunch of things:
++ * - We need to make sure that the first character (which
++ * would be our resolution in X) is a digit.
++ * - However, if the X resolution is missing, then we end up
++ * with something like x<yres>, with our first character
++ * being an alpha-numerical character, which would be
++ * considered a named mode.
++ *
++ * If this isn't enough, we should add more heuristics here,
++ * and matching unit-tests.
++ */
++ if (!isdigit(name[0]) && name[0] != 'x')
++ named_mode = true;
+
+ /* Try to locate the bpp and refresh specifiers, if any */
+ bpp_ptr = strchr(name, '-');
+@@ -1617,6 +1631,9 @@ bool drm_mode_parse_command_line_for_con
+
+ refresh_ptr = strchr(name, '@');
+ if (refresh_ptr) {
++ if (named_mode)
++ return false;
++
+ refresh_off = refresh_ptr - name;
+ mode->refresh_specified = true;
+ }
+@@ -1633,12 +1650,16 @@ bool drm_mode_parse_command_line_for_con
+ 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) {
+@@ -1666,14 +1687,23 @@ bool drm_mode_parse_command_line_for_con
+ 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;
+--- a/include/drm/drm_connector.h
++++ b/include/drm/drm_connector.h
+@@ -765,6 +765,13 @@ struct drm_connector_funcs {
+ */
+ struct drm_cmdline_mode {
+ /**
++ * @name:
++ *
++ * Name of the mode.
++ */
++ char name[DRM_DISPLAY_MODE_LEN];
++
++ /**
+ * @specified:
+ *
+ * Has a mode been read from the command-line?