[PATCH] drm/edid: compare actual vrefresh for all modes for quirks

Alex Deucher alexdeucher at gmail.com
Mon Oct 14 18:50:41 CEST 2013


On Fri, Sep 20, 2013 at 6:32 PM, Alex Deucher <alexdeucher at gmail.com> wrote:
> On Thu, Aug 15, 2013 at 11:48 AM, Alex Deucher <alexdeucher at gmail.com> 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 at amd.com>
>
> 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
>>


More information about the dri-devel mailing list