From bda6ade8288d66b5be953260c24b5cf7ab944cee Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 13 May 2014 14:09:36 +0100 Subject: [PATCH 1/2] drm/edid: Use the first-detailed-preferred quirk Since its inception, we never used the quirk. The quirk tables were copied across from the xserver in commit f453ba0460742ad027ae0c4c7d61e62817b3e7ef Author: Dave Airlie Date: Fri Nov 7 14:05:41 2008 -0800 DRM: add mode setting support but it was never enabled. So also copy the current quirk implementation from commit ab4bce02a9457dd9c86b774fc74caf3dd6b287ca Author: Eric Anholt Date: Thu Oct 18 15:22:42 2007 -0700 Add a quirk for Philips 107P5 which lacks the preferred bit on detailed timing. Also fix the prefer-large-75 quirk if the prefer-first-detailed bit was set, though it's not the case for the existing prefer-large-75 consumer. Signed-off-by: Chris Wilson References: https://bugs.freedesktop.org/show_bug.cgi?id=78655 Cc: Dave Airlie Cc: Adam Jackson Cc: Eric Anholt --- drivers/gpu/drm/drm_edid.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 7a4fd2ed1280..d4882c520295 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -2341,6 +2341,21 @@ do_detailed_mode(struct detailed_timing *timing, void *c) } } +static bool preferred_detailed_mode(struct edid *edid, u32 quirks) +{ + bool preferred; + + preferred = edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING; + if (version_greater(edid, 1, 3)) + preferred = true; + if (quirks & EDID_QUIRK_FIRST_DETAILED_PREFERRED) + preferred = true; + if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) + preferred = false; + + return preferred; +} + /* * add_detailed_modes - Add modes from detailed timings * @connector: attached connector @@ -2354,15 +2369,11 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid, struct detailed_mode_closure closure = { connector, edid, - 1, + preferred_detailed_mode(edid, quirks), quirks, 0 }; - if (closure.preferred && !version_greater(edid, 1, 3)) - closure.preferred = - (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING); - drm_for_each_detailed_block((u8 *)edid, do_detailed_mode, &closure); return closure.modes; -- 2.0.0.rc2