From 8ef029fd5e4c3a6460064c7a09154d546b9dcaed Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 13 May 2014 14:18:49 +0100 Subject: [PATCH 2/2] drm/edid: Ensure that the EDID always has a preferred mode set If the EDID fails to specify any preferred mode for a monitor, simply mark the first mode in the list as being preferred. Signed-off-by: Chris Wilson References: https://bugs.freedesktop.org/show_bug.cgi?id=78655 --- drivers/gpu/drm/drm_edid.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index d4882c520295..59f9f6201598 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -1402,6 +1402,26 @@ static void edid_fixup_preferred(struct drm_connector *connector, preferred_mode->type |= DRM_MODE_TYPE_PREFERRED; } +static void edid_ensure_preferred(struct drm_connector *connector) +{ + struct drm_display_mode *mode; + + if (list_empty(&connector->probed_modes)) + return; + + list_for_each_entry(mode, &connector->probed_modes, head) + if (mode->type & DRM_MODE_TYPE_PREFERRED) + return; + + mode = list_first_entry(&connector->probed_modes, + struct drm_display_mode, head); + + DRM_DEBUG_KMS("No preferred mode found in EDID on connector %s," + " marking the first (%s) as preferred\n", + drm_get_connector_name(connector), mode->name); + mode->type |= DRM_MODE_TYPE_PREFERRED; +} + static bool mode_is_rb(const struct drm_display_mode *mode) { @@ -3560,6 +3580,7 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) edid_fixup_preferred(connector, quirks); + edid_ensure_preferred(connector); drm_add_display_info(edid, &connector->display_info); -- 2.0.0.rc2