Re: [PATCH 3/3] drm/panel-edp: Choose correct preferred mode

From: Maxime Ripard
Date: Mon Nov 06 2023 - 03:02:38 EST


Hi,

On Wed, Nov 01, 2023 at 02:20:11PM -0700, Hsin-Yi Wang wrote:
> If a non generic edp-panel is under aux-bus, the mode read from edid would
> still be selected as preferred and results in multiple preferred modes,
> which is ambiguous.
>
> If a hard-coded mode is present, unset the preferred bit of the modes read
> from edid.
>
> Signed-off-by: Hsin-Yi Wang <hsinyi@xxxxxxxxxxxx>
> ---
> drivers/gpu/drm/drm_modes.c | 16 ++++++++++++++++
> drivers/gpu/drm/panel/panel-edp.c | 7 +++++--
> include/drm/drm_modes.h | 1 +
> 3 files changed, 22 insertions(+), 2 deletions(-)

This should be in two separate patches, with kunit tests for the helper
you create.

> diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
> index ac9a406250c5..35927467f4b0 100644
> --- a/drivers/gpu/drm/drm_modes.c
> +++ b/drivers/gpu/drm/drm_modes.c
> @@ -1933,6 +1933,22 @@ void drm_connector_list_update(struct drm_connector *connector)
> }
> EXPORT_SYMBOL(drm_connector_list_update);
>
> +/**
> + * drm_mode_unset_preferred - clear the preferred status on existing modes.
> + * @connector: the connector to update
> + *
> + * Walk the mode list for connector, clearing the preferred status on existing
> + * modes.
> + */
> +void drm_mode_unset_preferred_modes(struct drm_connector *connector)
> +{
> + struct drm_display_mode *cur_mode;
> +
> + list_for_each_entry(cur_mode, &connector->probed_modes, head)
> + cur_mode->type &= ~DRM_MODE_TYPE_PREFERRED;
> +}
> +EXPORT_SYMBOL_GPL(drm_mode_unset_preferred_modes);
> +

More importantly, why do you need a helper for this at all? If it's only
useful in a single driver for now, then just add it to that driver.

> static int drm_mode_parse_cmdline_bpp(const char *str, char **end_ptr,
> struct drm_cmdline_mode *mode)
> {
> diff --git a/drivers/gpu/drm/panel/panel-edp.c b/drivers/gpu/drm/panel/panel-edp.c
> index 0883ff312eba..b3ac473b2554 100644
> --- a/drivers/gpu/drm/panel/panel-edp.c
> +++ b/drivers/gpu/drm/panel/panel-edp.c
> @@ -622,10 +622,13 @@ static int panel_edp_get_modes(struct drm_panel *panel,
> * and no modes (the generic edp-panel case) because it will clobber
> * the display_info that was already set by drm_add_edid_modes().
> */
> - if (p->desc->num_timings || p->desc->num_modes)
> + if (p->desc->num_timings || p->desc->num_modes) {
> + /* hard-coded modes present, unset preferred modes from edid. */
> + drm_mode_unset_preferred_modes(connector);
> num += panel_edp_get_non_edid_modes(p, connector);
> - else if (!num)
> + } else if (!num) {
> dev_warn(p->base.dev, "No display modes\n");
> + }

It's also not clear to me why you need to mess with the modes at all. If
the mode is unreliable and needs to be overloaded, then just ignore the
EDIDs entirely and report the mode you have hardcoded in the driver. You
then don't need to play with the flags at all.

Maxime

Attachment: signature.asc
Description: PGP signature