* [PATCH] drm/edid: compare actual vrefresh for all modes for quirks
@ 2013-08-15 15:48 Alex Deucher
2013-09-20 22:32 ` Alex Deucher
0 siblings, 1 reply; 4+ messages in thread
From: Alex Deucher @ 2013-08-15 15:48 UTC (permalink / raw)
To: dri-devel; +Cc: Alex Deucher
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@amd.com>
---
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
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] drm/edid: compare actual vrefresh for all modes for quirks
2013-08-15 15:48 [PATCH] drm/edid: compare actual vrefresh for all modes for quirks Alex Deucher
@ 2013-09-20 22:32 ` Alex Deucher
2013-10-14 16:50 ` Alex Deucher
0 siblings, 1 reply; 4+ messages in thread
From: Alex Deucher @ 2013-09-20 22:32 UTC (permalink / raw)
To: Maling list - DRI developers; +Cc: Alex Deucher
On Thu, Aug 15, 2013 at 11:48 AM, Alex Deucher <alexdeucher@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@amd.com>
Ping? Any objections?
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
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] drm/edid: compare actual vrefresh for all modes for quirks
2013-09-20 22:32 ` Alex Deucher
@ 2013-10-14 16:50 ` Alex Deucher
2013-10-14 16:58 ` Ville Syrjälä
0 siblings, 1 reply; 4+ messages in thread
From: Alex Deucher @ 2013-10-14 16:50 UTC (permalink / raw)
To: Maling list - DRI developers; +Cc: Alex Deucher
On Fri, Sep 20, 2013 at 6:32 PM, Alex Deucher <alexdeucher@gmail.com> wrote:
> On Thu, Aug 15, 2013 at 11:48 AM, Alex Deucher <alexdeucher@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@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
>>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] drm/edid: compare actual vrefresh for all modes for quirks
2013-10-14 16:50 ` Alex Deucher
@ 2013-10-14 16:58 ` Ville Syrjälä
0 siblings, 0 replies; 4+ messages in thread
From: Ville Syrjälä @ 2013-10-14 16:58 UTC (permalink / raw)
To: Alex Deucher; +Cc: Alex Deucher, Maling list - DRI developers
On Mon, Oct 14, 2013 at 12:50:41PM -0400, Alex Deucher wrote:
> On Fri, Sep 20, 2013 at 6:32 PM, Alex Deucher <alexdeucher@gmail.com> wrote:
> > On Thu, Aug 15, 2013 at 11:48 AM, Alex Deucher <alexdeucher@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@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.
Yeah, seems saner than comparing against 0.
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> 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@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
--
Ville Syrjälä
Intel OTC
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2013-10-14 16:59 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-15 15:48 [PATCH] drm/edid: compare actual vrefresh for all modes for quirks Alex Deucher
2013-09-20 22:32 ` Alex Deucher
2013-10-14 16:50 ` Alex Deucher
2013-10-14 16:58 ` Ville Syrjälä
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.