All of lore.kernel.org
 help / color / mirror / Atom feed
From: Geert Uytterhoeven <geert@linux-m68k.org>
To: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	Maxime Ripard <mripard@kernel.org>,
	Thomas Zimmermann <tzimmermann@suse.de>,
	David Airlie <airlied@gmail.com>, Daniel Vetter <daniel@ffwll.ch>,
	Hans de Goede <hdegoede@redhat.com>
Cc: dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org,
	linux-m68k@vger.kernel.org, linux-kernel@vger.kernel.org,
	Geert Uytterhoeven <geert@linux-m68k.org>
Subject: [PATCH v3 2/2] drm/modes: Add support for driver-specific named modes
Date: Fri, 25 Nov 2022 21:31:01 +0100	[thread overview]
Message-ID: <577fd80ce4b98a5517564eccf7b4dceaf823c545.1669405382.git.geert@linux-m68k.org> (raw)
In-Reply-To: <cover.1669405382.git.geert@linux-m68k.org>

The mode parsing code recognizes named modes only if they are explicitly
listed in the internal named mode list, which is currently limited to
"NTSC" and "PAL".

Provide a mechanism for drivers to override this list to support custom
modes.

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 <hdegoede@redhat.com>
---
I don't expect this patch to be acceptable as-is, but it's a dependency
for posting the RFC Atari DRM driver.

v3:
  - Update for the switch from names to named mode descriptors,

v2:
  - Add Reviewed-by.
---
 drivers/gpu/drm/drm_modes.c | 19 ++++++++-----------
 include/drm/drm_connector.h | 18 ++++++++++++++++++
 2 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
index 45b9e6aab766002a..9ea928b35e728d13 100644
--- a/drivers/gpu/drm/drm_modes.c
+++ b/drivers/gpu/drm/drm_modes.c
@@ -1751,14 +1751,6 @@ static int drm_mode_parse_cmdline_options(const char *str,
 	return 0;
 }
 
-struct drm_named_mode {
-	const char *name;
-	unsigned int pixel_clock_khz;
-	unsigned int xres;
-	unsigned int yres;
-	unsigned int flags;
-};
-
 #define NAMED_MODE(_name, _pclk, _x, _y, _flags)	\
 	{						\
 		.name = _name,				\
@@ -1771,12 +1763,15 @@ struct drm_named_mode {
 static const struct drm_named_mode drm_named_modes[] = {
 	NAMED_MODE("NTSC", 13500, 720, 480, DRM_MODE_FLAG_INTERLACE),
 	NAMED_MODE("PAL", 13500, 720, 576, DRM_MODE_FLAG_INTERLACE),
+	{ /* sentinel */ }
 };
 
 static int drm_mode_parse_cmdline_named_mode(const char *name,
 					     unsigned int name_end,
+					     const struct drm_connector *connector,
 					     struct drm_cmdline_mode *cmdline_mode)
 {
+	const struct drm_named_mode *named_modes;
 	unsigned int i;
 
 	if (!name_end)
@@ -1802,8 +1797,9 @@ static int drm_mode_parse_cmdline_named_mode(const char *name,
 	 * We're sure we're a named mode at this point, iterate over the
 	 * list of modes we're aware of.
 	 */
-	for (i = 0; i < ARRAY_SIZE(drm_named_modes); i++) {
-		const struct drm_named_mode *mode = &drm_named_modes[i];
+	named_modes = connector->named_modes ? : drm_named_modes;
+	for (i = 0; named_modes[i].name; i++) {
+		const struct drm_named_mode *mode = &named_modes[i];
 		int ret;
 
 		ret = str_has_prefix(name, mode->name);
@@ -1903,7 +1899,8 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option,
 	if (!mode_end)
 		return false;
 
-	ret = drm_mode_parse_cmdline_named_mode(name, mode_end, mode);
+	ret = drm_mode_parse_cmdline_named_mode(name, mode_end, connector,
+						mode);
 	if (ret < 0)
 		return false;
 
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 565cf9d3c550926f..ff78ac214e475086 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -1315,6 +1315,14 @@ struct drm_cmdline_mode {
 	struct drm_connector_tv_margins tv_margins;
 };
 
+struct drm_named_mode {
+	const char *name;
+	unsigned int pixel_clock_khz;
+	unsigned int xres;
+	unsigned int yres;
+	unsigned int flags;
+};
+
 /**
  * struct drm_connector - central DRM connector control structure
  *
@@ -1708,6 +1716,16 @@ struct drm_connector {
 
 	/** @hdr_sink_metadata: HDR Metadata Information read from sink */
 	struct hdr_sink_metadata hdr_sink_metadata;
+
+	/**
+	 * @named_modes:
+	 *
+	 * Optional NULL-terminated array of names to be considered valid mode
+	 * names.  This lets the command line option parser distinguish between
+	 * mode names and freestanding extras and/or options.
+	 * If not set, a set of defaults will be used.
+	 */
+	const struct drm_named_mode *named_modes;
 };
 
 #define obj_to_connector(x) container_of(x, struct drm_connector, base)
-- 
2.25.1


WARNING: multiple messages have this Message-ID (diff)
From: Geert Uytterhoeven <geert@linux-m68k.org>
To: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	Maxime Ripard <mripard@kernel.org>,
	Thomas Zimmermann <tzimmermann@suse.de>,
	David Airlie <airlied@gmail.com>, Daniel Vetter <daniel@ffwll.ch>,
	Hans de Goede <hdegoede@redhat.com>
Cc: linux-fbdev@vger.kernel.org,
	Geert Uytterhoeven <geert@linux-m68k.org>,
	linux-m68k@vger.kernel.org, dri-devel@lists.freedesktop.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH v3 2/2] drm/modes: Add support for driver-specific named modes
Date: Fri, 25 Nov 2022 21:31:01 +0100	[thread overview]
Message-ID: <577fd80ce4b98a5517564eccf7b4dceaf823c545.1669405382.git.geert@linux-m68k.org> (raw)
In-Reply-To: <cover.1669405382.git.geert@linux-m68k.org>

The mode parsing code recognizes named modes only if they are explicitly
listed in the internal named mode list, which is currently limited to
"NTSC" and "PAL".

Provide a mechanism for drivers to override this list to support custom
modes.

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 <hdegoede@redhat.com>
---
I don't expect this patch to be acceptable as-is, but it's a dependency
for posting the RFC Atari DRM driver.

v3:
  - Update for the switch from names to named mode descriptors,

v2:
  - Add Reviewed-by.
---
 drivers/gpu/drm/drm_modes.c | 19 ++++++++-----------
 include/drm/drm_connector.h | 18 ++++++++++++++++++
 2 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
index 45b9e6aab766002a..9ea928b35e728d13 100644
--- a/drivers/gpu/drm/drm_modes.c
+++ b/drivers/gpu/drm/drm_modes.c
@@ -1751,14 +1751,6 @@ static int drm_mode_parse_cmdline_options(const char *str,
 	return 0;
 }
 
-struct drm_named_mode {
-	const char *name;
-	unsigned int pixel_clock_khz;
-	unsigned int xres;
-	unsigned int yres;
-	unsigned int flags;
-};
-
 #define NAMED_MODE(_name, _pclk, _x, _y, _flags)	\
 	{						\
 		.name = _name,				\
@@ -1771,12 +1763,15 @@ struct drm_named_mode {
 static const struct drm_named_mode drm_named_modes[] = {
 	NAMED_MODE("NTSC", 13500, 720, 480, DRM_MODE_FLAG_INTERLACE),
 	NAMED_MODE("PAL", 13500, 720, 576, DRM_MODE_FLAG_INTERLACE),
+	{ /* sentinel */ }
 };
 
 static int drm_mode_parse_cmdline_named_mode(const char *name,
 					     unsigned int name_end,
+					     const struct drm_connector *connector,
 					     struct drm_cmdline_mode *cmdline_mode)
 {
+	const struct drm_named_mode *named_modes;
 	unsigned int i;
 
 	if (!name_end)
@@ -1802,8 +1797,9 @@ static int drm_mode_parse_cmdline_named_mode(const char *name,
 	 * We're sure we're a named mode at this point, iterate over the
 	 * list of modes we're aware of.
 	 */
-	for (i = 0; i < ARRAY_SIZE(drm_named_modes); i++) {
-		const struct drm_named_mode *mode = &drm_named_modes[i];
+	named_modes = connector->named_modes ? : drm_named_modes;
+	for (i = 0; named_modes[i].name; i++) {
+		const struct drm_named_mode *mode = &named_modes[i];
 		int ret;
 
 		ret = str_has_prefix(name, mode->name);
@@ -1903,7 +1899,8 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option,
 	if (!mode_end)
 		return false;
 
-	ret = drm_mode_parse_cmdline_named_mode(name, mode_end, mode);
+	ret = drm_mode_parse_cmdline_named_mode(name, mode_end, connector,
+						mode);
 	if (ret < 0)
 		return false;
 
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 565cf9d3c550926f..ff78ac214e475086 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -1315,6 +1315,14 @@ struct drm_cmdline_mode {
 	struct drm_connector_tv_margins tv_margins;
 };
 
+struct drm_named_mode {
+	const char *name;
+	unsigned int pixel_clock_khz;
+	unsigned int xres;
+	unsigned int yres;
+	unsigned int flags;
+};
+
 /**
  * struct drm_connector - central DRM connector control structure
  *
@@ -1708,6 +1716,16 @@ struct drm_connector {
 
 	/** @hdr_sink_metadata: HDR Metadata Information read from sink */
 	struct hdr_sink_metadata hdr_sink_metadata;
+
+	/**
+	 * @named_modes:
+	 *
+	 * Optional NULL-terminated array of names to be considered valid mode
+	 * names.  This lets the command line option parser distinguish between
+	 * mode names and freestanding extras and/or options.
+	 * If not set, a set of defaults will be used.
+	 */
+	const struct drm_named_mode *named_modes;
 };
 
 #define obj_to_connector(x) container_of(x, struct drm_connector, base)
-- 
2.25.1


  parent reply	other threads:[~2022-11-25 20:31 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-25 20:30 [PATCH v3 0/2] drm/modes: Command line mode selection improvements Geert Uytterhoeven
2022-11-25 20:30 ` Geert Uytterhoeven
2022-11-25 20:31 ` [PATCH v3 1/2] drm/modes: parse_cmdline: Make mode->*specified handling more uniform Geert Uytterhoeven
2022-11-25 20:31   ` Geert Uytterhoeven
2022-11-25 20:31 ` Geert Uytterhoeven [this message]
2022-11-25 20:31   ` [PATCH v3 2/2] drm/modes: Add support for driver-specific named modes Geert Uytterhoeven

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=577fd80ce4b98a5517564eccf7b4dceaf823c545.1669405382.git.geert@linux-m68k.org \
    --to=geert@linux-m68k.org \
    --cc=airlied@gmail.com \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hdegoede@redhat.com \
    --cc=linux-fbdev@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-m68k@vger.kernel.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=tzimmermann@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.