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
next prev 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: linkBe 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.