On Thu, 10 Sep 2026, Javier Martinez Canillas <[email protected]> wrote: > Thomas Zimmermann <[email protected]> writes: > >> Add drm_edid_detect_panel_size() to extract the panel's preferred >> display resolution from a given EDID. Required for setting up DRM's >> panel orientation quirks in sysfb drivers. >> >> v4: >> - fix test for EDID PTD (Jani) >> v3: >> - mention use case in documentation (Jani) >> - use is_detailed_timing_descriptor() (Jani) >> - rename helper to drm_edid_detect_panel_size() >> v2: >> - handle EDID without pixel timing descriptor (Sashiko) >> - fix checks for width and height pointers >> >> Signed-off-by: Thomas Zimmermann <[email protected]> >> Acked-by: Ard Biesheuvel <[email protected]> >> --- >> drivers/gpu/drm/drm_edid.c | 47 ++++++++++++++++++++++++++++++++++++++ >> include/drm/drm_edid.h | 2 ++ >> 2 files changed, 49 insertions(+) >> >> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c >> index 9990a836d0b6..1331efb4876c 100644 >> --- a/drivers/gpu/drm/drm_edid.c >> +++ b/drivers/gpu/drm/drm_edid.c >> @@ -7852,3 +7852,50 @@ bool drm_edid_is_digital(const struct drm_edid >> *drm_edid) >> drm_edid->edid->input & DRM_EDID_INPUT_DIGITAL; >> } >> EXPORT_SYMBOL(drm_edid_is_digital); >> + >> +/** >> + * drm_edid_detect_panel_size - Get a panel's size from EDID >> + * @drm_edid: EDID of the panel. >> + * @width: Returns the panel's width in pixels per scanline, if given >> + * @height: Returns the panel's height in scanlines, if given >> + * >> + * This function detects the preferred size of a panel from the given >> + * EDID. There is no such information stored in the EDID block directly, >> + * but the preferred mode often corresponds to the panel's native geometry. >> + * >> + * This helper should only be used during initialization before the >> + * connector is available. For regular use, retrieve the available display >> + * modes with the connector functions. >> + * >> + * Return: Zero on success, or a negative errno code otherwise. >> + */ >> +int drm_edid_detect_panel_size(const struct drm_edid *drm_edid, >> + unsigned int *width, unsigned int *height) >> +{ >> + const struct edid *edid = drm_edid->edid; >> + const struct detailed_timing *dt; >> + const struct detailed_pixel_timing *pt; >> + >> + /* >> + * Use display mode from the Preferred Timing Descriptor. For old >> + * and obscure displays, we might need better heuristics. >> + */ >> + >> + if (edid->revision < 4 || !(edid->features & >> DRM_EDID_FEATURE_PREFERRED_TIMING)) >> + return -EINVAL; /* no Preferred Timing Descriptor */ >> + > > I saw that Jani and you discussed this logic in v3. I originally thought that > your v3 was correct and this one was wrong, but I noticed now that this flag > changed its semantic between 1.3 and 1.4. > > So I think that this latest version is correct indeed, 1.3 didn't include the > native pixel format and 1.4 does not either if > DRM_EDID_FEATURE_PREFERRED_TIMING > flag is not set.
Yeah, and "pixel format" makes me think RGB, YCbCr, 4:4:4, 4:2:2, etc, *not* the resolution! Had to separately find the section that says pixel format means resolution here. BR, Jani. > > Reviewed-by: Javier Martinez Canillas <[email protected]> -- Jani Nikula, Intel
