All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jani Nikula <jani.nikula@linux.intel.com>
To: Thomas Zimmermann <tzimmermann@suse.de>,
	javierm@redhat.com, ardb@kernel.org, ilias.apalodimas@linaro.org,
	maarten.lankhorst@linux.intel.com, mripard@kernel.org,
	simona@ffwll.ch, airlied@gmail.com
Cc: dri-devel@lists.freedesktop.org, linux-efi@vger.kernel.org,
	sashiko-reviews@lists.linux.dev,
	Thomas Zimmermann <tzimmermann@suse.de>
Subject: Re: [PATCH v4 3/3] drm/sysfb: Use preferred panel size for panel orientation quirks
Date: Fri, 04 Sep 2026 12:41:16 +0300	[thread overview]
Message-ID: <e5622c247ffac253ef61cf66ffeeba2f8e36d68d@intel.com> (raw)
In-Reply-To: <20260904090850.43060-4-tzimmermann@suse.de>

On Fri, 04 Sep 2026, Thomas Zimmermann <tzimmermann@suse.de> wrote:
> Sysfb drivers currently use the given display mode for looking up the
> panel orientation. But the look-up table stores the native geometry of
> the panels, so the lookup fails if the current mode sizes differs.
>
> Get the panel's native geometry with drm_edid_detect_panel_size() from
> the EDID and use it for looking up the panel orientation.
>
> v2:
> - ofdrm: validate EDID header before using it (Sashiko)
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> Acked-by: Ard Biesheuvel <ardb@kernel.org>

Acked-by: Jani Nikula <jani.nikula@intel.com>

> ---
>  drivers/gpu/drm/sysfb/efidrm.c  | 17 ++++++++++++++++-
>  drivers/gpu/drm/sysfb/ofdrm.c   | 18 ++++++++++++++++--
>  drivers/gpu/drm/sysfb/vesadrm.c | 17 ++++++++++++++++-
>  3 files changed, 48 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/sysfb/efidrm.c b/drivers/gpu/drm/sysfb/efidrm.c
> index 3f9cd5d03efb..8b19f437308e 100644
> --- a/drivers/gpu/drm/sysfb/efidrm.c
> +++ b/drivers/gpu/drm/sysfb/efidrm.c
> @@ -152,6 +152,7 @@ static struct efidrm_device *efidrm_device_create(struct drm_driver *drv,
>  	const struct screen_info *si;
>  	const struct drm_format_info *format;
>  	int width, height, stride;
> +	unsigned int panel_width, panel_height;
>  	s64 vsize;
>  	u64 mem_flags;
>  	struct resource resbuf;
> @@ -217,6 +218,20 @@ static struct efidrm_device *efidrm_device_create(struct drm_driver *drv,
>  	if (drm_edid_header_is_valid(dpy->edid.dummy) == 8)
>  		sysfb->edid = dpy->edid.dummy;
>  #endif
> +
> +	panel_width = width;
> +	panel_height = height;
> +
> +	if (sysfb->edid) {
> +		const struct drm_edid *drm_edid;
> +
> +		drm_edid = drm_edid_alloc(sysfb->edid, EDID_LENGTH);
> +		if (drm_edid) {
> +			drm_edid_detect_panel_size(drm_edid, &panel_width, &panel_height);
> +			drm_edid_free(drm_edid);
> +		}
> +	}
> +
>  	sysfb->fb_mode = drm_sysfb_mode(width, height, 0, 0);
>  	sysfb->fb_format = format;
>  	sysfb->fb_pitch = stride;
> @@ -340,7 +355,7 @@ static struct efidrm_device *efidrm_device_create(struct drm_driver *drv,
>  	drm_connector_helper_add(connector, &efidrm_connector_helper_funcs);
>  	drm_connector_set_panel_orientation_with_quirk(connector,
>  						       DRM_MODE_PANEL_ORIENTATION_UNKNOWN,
> -						       width, height);
> +						       panel_width, panel_height);
>  	if (sysfb->edid)
>  		drm_connector_attach_edid_property(connector);
>  
> diff --git a/drivers/gpu/drm/sysfb/ofdrm.c b/drivers/gpu/drm/sysfb/ofdrm.c
> index 9d60db45139c..c41255569854 100644
> --- a/drivers/gpu/drm/sysfb/ofdrm.c
> +++ b/drivers/gpu/drm/sysfb/ofdrm.c
> @@ -229,7 +229,7 @@ static const u8 *display_get_edid_of(struct drm_device *dev, struct device_node
>  {
>  	int ret = of_property_read_u8_array(of_node, "EDID", buf, EDID_LENGTH);
>  
> -	if (ret)
> +	if (ret || drm_edid_header_is_valid(buf) != 8)
>  		return NULL;
>  	return buf;
>  }
> @@ -828,6 +828,7 @@ static struct ofdrm_device *ofdrm_device_create(struct drm_driver *drv,
>  	enum ofdrm_model model;
>  	bool big_endian;
>  	int width, height, depth, linebytes;
> +	unsigned int panel_width, panel_height;
>  	const struct drm_format_info *format;
>  	u64 address;
>  	const u8 *edid;
> @@ -998,6 +999,19 @@ static struct ofdrm_device *ofdrm_device_create(struct drm_driver *drv,
>  		sysfb->fb_gamma_lut_size = OFDRM_GAMMA_LUT_SIZE;
>  	sysfb->edid = edid;
>  
> +	panel_width = width;
> +	panel_height = height;
> +
> +	if (sysfb->edid) {
> +		const struct drm_edid *drm_edid;
> +
> +		drm_edid = drm_edid_alloc(sysfb->edid, EDID_LENGTH);
> +		if (drm_edid) {
> +			drm_edid_detect_panel_size(drm_edid, &panel_width, &panel_height);
> +			drm_edid_free(drm_edid);
> +		}
> +	}
> +
>  	drm_dbg(dev, "display mode={" DRM_MODE_FMT "}\n", DRM_MODE_ARG(&sysfb->fb_mode));
>  	drm_dbg(dev, "framebuffer format=%p4cc, size=%dx%d, linebytes=%d byte\n",
>  		&format->format, width, height, linebytes);
> @@ -1069,7 +1083,7 @@ static struct ofdrm_device *ofdrm_device_create(struct drm_driver *drv,
>  	drm_connector_helper_add(connector, &ofdrm_connector_helper_funcs);
>  	drm_connector_set_panel_orientation_with_quirk(connector,
>  						       DRM_MODE_PANEL_ORIENTATION_UNKNOWN,
> -						       width, height);
> +						       panel_width, panel_height);
>  	if (edid)
>  		drm_connector_attach_edid_property(connector);
>  
> diff --git a/drivers/gpu/drm/sysfb/vesadrm.c b/drivers/gpu/drm/sysfb/vesadrm.c
> index 6a67b2d2e451..f6358a0a68bd 100644
> --- a/drivers/gpu/drm/sysfb/vesadrm.c
> +++ b/drivers/gpu/drm/sysfb/vesadrm.c
> @@ -402,6 +402,7 @@ static struct vesadrm_device *vesadrm_device_create(struct drm_driver *drv,
>  	const struct screen_info *si;
>  	const struct drm_format_info *format;
>  	int width, height, stride;
> +	unsigned int panel_width, panel_height;
>  	s64 vsize;
>  	struct resource resbuf;
>  	struct resource *res;
> @@ -484,6 +485,20 @@ static struct vesadrm_device *vesadrm_device_create(struct drm_driver *drv,
>  	if (drm_edid_header_is_valid(dpy->edid.dummy) == 8)
>  		sysfb->edid = dpy->edid.dummy;
>  #endif
> +
> +	panel_width = width;
> +	panel_height = height;
> +
> +	if (sysfb->edid) {
> +		const struct drm_edid *drm_edid;
> +
> +		drm_edid = drm_edid_alloc(sysfb->edid, EDID_LENGTH);
> +		if (drm_edid) {
> +			drm_edid_detect_panel_size(drm_edid, &panel_width, &panel_height);
> +			drm_edid_free(drm_edid);
> +		}
> +	}
> +
>  	sysfb->fb_mode = drm_sysfb_mode(width, height, 0, 0);
>  	sysfb->fb_format = format;
>  	sysfb->fb_pitch = stride;
> @@ -585,7 +600,7 @@ static struct vesadrm_device *vesadrm_device_create(struct drm_driver *drv,
>  	drm_connector_helper_add(connector, &vesadrm_connector_helper_funcs);
>  	drm_connector_set_panel_orientation_with_quirk(connector,
>  						       DRM_MODE_PANEL_ORIENTATION_UNKNOWN,
> -						       width, height);
> +						       panel_width, panel_height);
>  	if (sysfb->edid)
>  		drm_connector_attach_edid_property(connector);

-- 
Jani Nikula, Intel

  reply	other threads:[~2026-09-04  9:41 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-04  9:06 [PATCH v4 0/3] sysfb: Fix display output on Lenovo D330 (and others) Thomas Zimmermann
2026-09-04  9:07 ` [PATCH v4 1/3] firmware/sysfb: Remove rotation quirk for Lenovo D330 Thomas Zimmermann
2026-09-10  7:23   ` Javier Martinez Canillas
2026-09-10  7:46     ` Thomas Zimmermann
2026-09-04  9:07 ` [PATCH v4 2/3] drm/edid: Add drm_edid_detect_panel_size() Thomas Zimmermann
2026-09-04  9:28   ` Jani Nikula
2026-09-10  8:10   ` Javier Martinez Canillas
2026-09-11  7:35     ` Jani Nikula
2026-09-04  9:07 ` [PATCH v4 3/3] drm/sysfb: Use preferred panel size for panel orientation quirks Thomas Zimmermann
2026-09-04  9:41   ` Jani Nikula [this message]
2026-09-10  8:11   ` Javier Martinez Canillas

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=e5622c247ffac253ef61cf66ffeeba2f8e36d68d@intel.com \
    --to=jani.nikula@linux.intel.com \
    --cc=airlied@gmail.com \
    --cc=ardb@kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=ilias.apalodimas@linaro.org \
    --cc=javierm@redhat.com \
    --cc=linux-efi@vger.kernel.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=simona@ffwll.ch \
    --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.