On Fri, Sep 20, 2013 at 6:32 PM, Alex Deucher <alexdeucher@xxxxxxxxx> wrote: > On Thu, Aug 15, 2013 at 11:48 AM, Alex Deucher <alexdeucher@xxxxxxxxx> wrote: >> The vrefresh field of the mode is 0 for most modes >> fetched from the EDID (e.g., established timings). >> When dealing with monitors that have a bogus preferred >> mode, we may not always select the mode we want because >> we compare the target refresh to the mode's vrefresh which >> is 0 in a lot of cases. >> >> Signed-off-by: Alex Deucher <alexander.deucher@xxxxxxx> > > Ping? Any objections? Anyone? Without this quirking doesn't work unless the quirked mode happens to have the vrefesh field filled in which most modes don't. Alex > > Alex > >> --- >> drivers/gpu/drm/drm_edid.c | 11 ++++++++--- >> 1 file changed, 8 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c >> index 58b4882..c3095e0 100644 >> --- a/drivers/gpu/drm/drm_edid.c >> +++ b/drivers/gpu/drm/drm_edid.c >> @@ -1278,7 +1278,7 @@ static u32 edid_get_quirks(struct edid *edid) >> } >> >> #define MODE_SIZE(m) ((m)->hdisplay * (m)->vdisplay) >> -#define MODE_REFRESH_DIFF(m,r) (abs((m)->vrefresh - target_refresh)) >> +#define MODE_REFRESH_DIFF(c,t) (abs((c) - (t))) >> >> /** >> * edid_fixup_preferred - set preferred modes based on quirk list >> @@ -1293,6 +1293,7 @@ static void edid_fixup_preferred(struct drm_connector *connector, >> { >> struct drm_display_mode *t, *cur_mode, *preferred_mode; >> int target_refresh = 0; >> + int cur_vrefresh, preferred_vrefresh; >> >> if (list_empty(&connector->probed_modes)) >> return; >> @@ -1315,10 +1316,14 @@ static void edid_fixup_preferred(struct drm_connector *connector, >> if (MODE_SIZE(cur_mode) > MODE_SIZE(preferred_mode)) >> preferred_mode = cur_mode; >> >> + cur_vrefresh = cur_mode->vrefresh ? >> + cur_mode->vrefresh : drm_mode_vrefresh(cur_mode); >> + preferred_vrefresh = preferred_mode->vrefresh ? >> + preferred_mode->vrefresh : drm_mode_vrefresh(preferred_mode); >> /* At a given size, try to get closest to target refresh */ >> if ((MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) && >> - MODE_REFRESH_DIFF(cur_mode, target_refresh) < >> - MODE_REFRESH_DIFF(preferred_mode, target_refresh)) { >> + MODE_REFRESH_DIFF(cur_vrefresh, target_refresh) < >> + MODE_REFRESH_DIFF(preferred_vrefresh, target_refresh)) { >> preferred_mode = cur_mode; >> } >> } >> -- >> 1.8.3.1 >> _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel