AW: [PATCH xserver v2] xfree86: Refine drm modes on continuous freq panel

2020-04-15 Thread Walter Harms



Von: xorg-devel  im Auftrag von Aaron Ma 

Gesendet: Dienstag, 14. April 2020 11:28
An: xorg-devel@lists.x.org; aaron...@canonical.com
Betreff: [PATCH xserver v2] xfree86: Refine drm modes on continuous freq panel

EDID1.4 replaced GTF Bit with Continuous or Non-Continuous Frequency Display.

Check the "Display Range Limits Descriptor" for GTF support.
If panel doesn't support GTF, then add gtf modes.

Otherwise X will only show the modes in "Detailed Timing Descriptor".

V2: Coding style changes.

BugLink: https://gitlab.freedesktop.org/drm/intel/issues/313
Signed-off-by: Aaron Ma 
---
 hw/xfree86/ddc/edid.h |  6 
 hw/xfree86/ddc/interpret_edid.c   | 35 +++
 hw/xfree86/ddc/xf86DDC.h  |  3 ++
 .../drivers/modesetting/drmmode_display.c |  2 +-
 4 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/hw/xfree86/ddc/edid.h b/hw/xfree86/ddc/edid.h
index 750e4270b..dffcb3749 100644
--- a/hw/xfree86/ddc/edid.h
+++ b/hw/xfree86/ddc/edid.h
@@ -262,6 +262,10 @@
 #define MAX_H (_MAX_H(c) + _MAX_H_OFFSET(c))
 #define _MAX_CLOCK(x) x[9]
 #define MAX_CLOCK _MAX_CLOCK(c)
+#define _DEFAULT_GTF(x) (x[10] == 0x00)
+#define DEFAULT_GTF _DEFAULT_GTF(c)
+#define _RANGE_LIMITS_ONLY(x) (x[10] == 0x01)
+#define RANGE_LIMITS_ONLY _RANGE_LIMITS_ONLY(c)
 #define _HAVE_2ND_GTF(x) (x[10] == 0x02)
 #define HAVE_2ND_GTF _HAVE_2ND_GTF(c)
 #define _F_2ND_GTF(x) (x[12] * 2)
@@ -490,6 +494,8 @@ struct monitor_ranges {
 int gtf_2nd_j;
 int max_clock_khz;
 int maxwidth;   /* in pixels */
+BOOL supported_default_gtf;
+BOOL range_limits_only;
 char supported_aspect;
 char preferred_aspect;
 char supported_blanking;
diff --git a/hw/xfree86/ddc/interpret_edid.c b/hw/xfree86/ddc/interpret_edid.c
index 17a8f81c0..c9f0b0ec3 100644
--- a/hw/xfree86/ddc/interpret_edid.c
+++ b/hw/xfree86/ddc/interpret_edid.c
@@ -672,7 +672,19 @@ get_monitor_ranges(Uchar * c, struct monitor_ranges *r)
 r->max_clock = 0;
 if (MAX_CLOCK != 0xff)  /* is specified? */
 r->max_clock = MAX_CLOCK * 10 + 5;
+
+if (DEFAULT_GTF) {
+   r->supported_default_gtf = TRUE;
+} else
+   r->supported_default_gtf = FALSE;
+
+if (RANGE_LIMITS_ONLY) {
+   r->range_limits_only = TRUE;
+} else
+   r->range_limits_only = FALSE;
+
 if (HAVE_2ND_GTF) {
+r->supported_default_gtf = TRUE;
 r->gtf_2nd_f = F_2ND_GTF;
 r->gtf_2nd_c = C_2ND_GTF;
 r->gtf_2nd_m = M_2ND_GTF;
@@ -751,6 +763,29 @@ validate_version(int scrnIndex, struct edid_version *r)
 return TRUE;
 }

+Bool
+gtf_supported(int scrnIndex, xf86MonPtr mon)
+{
+int i;
+
+if (!mon)
+return FALSE;
+
+if (mon->ver.revision < 4) {
+if (GTF_SUPPORTED(mon->features.msc))
+   return TRUE;
+} else {
+for (i = 0; i < DET_TIMINGS; i++) {
+struct detailed_monitor_section *det_timing_des = 
&(mon->det_mon[i]);
+if (det_timing_des && (det_timing_des->type == DS_RANGES) &&
+det_timing_des->section.ranges.supported_default_gtf)
+   return TRUE;
+   }
+}
+
+return FALSE;
+}
+
 /*
  * Returns true if HDMI, false if definitely not or unknown.
  */
diff --git a/hw/xfree86/ddc/xf86DDC.h b/hw/xfree86/ddc/xf86DDC.h
index 7d81ab911..2fa4ba55a 100644
--- a/hw/xfree86/ddc/xf86DDC.h
+++ b/hw/xfree86/ddc/xf86DDC.h
@@ -48,6 +48,9 @@ extern _X_EXPORT Bool xf86SetDDCproperties(ScrnInfoPtr 
pScreen, xf86MonPtr DDC);
 extern _X_EXPORT Bool
  xf86MonitorIsHDMI(xf86MonPtr mon);

+extern _X_EXPORT Bool
+gtf_supported(int scrnIndex, xf86MonPtr mon);
+
 extern _X_EXPORT DisplayModePtr
 FindDMTMode(int hsize, int vsize, int refresh, Bool rb);

diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c 
b/hw/xfree86/drivers/modesetting/drmmode_display.c
index 8e6b697c4..031e5efea 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -2459,7 +2459,7 @@ drmmode_output_add_gtf_modes(xf86OutputPtr output, 
DisplayModePtr Modes)
 int max_x = 0, max_y = 0;
 float max_vrefresh = 0.0;

-if (mon && GTF_SUPPORTED(mon->features.msc))
+if (mon && gtf_supported(output->scrn->scrnIndex, mon))
 return Modes;

nit picking:
no need to check mon gtf_supported() will return FALSE if mon==NULL

re,
 wh

 if (!has_panel_fitter(output))
--
2.26.0

___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel


Re: [PATCH xserver v2] xfree86: Refine drm modes on continuous freq panel

2020-04-14 Thread Aaron Ma



On 4/15/20 4:01 AM, Adam Jackson wrote:
> On Tue, 2020-04-14 at 17:28 +0800, Aaron Ma wrote:
>> EDID1.4 replaced GTF Bit with Continuous or Non-Continuous Frequency Display.
> 
> There's a lot that's weird about this patch but:
> 
>> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c 
>> b/hw/xfree86/drivers/modesetting/drmmode_display.c
>> index 8e6b697c4..031e5efea 100644
>> --- a/hw/xfree86/drivers/modesetting/drmmode_display.c
>> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
>> @@ -2459,7 +2459,7 @@ drmmode_output_add_gtf_modes(xf86OutputPtr output, 
>> DisplayModePtr Modes)
>>  int max_x = 0, max_y = 0;
>>  float max_vrefresh = 0.0;
>>  
>> -if (mon && GTF_SUPPORTED(mon->features.msc))
>> +if (mon && gtf_supported(output->scrn->scrnIndex, mon))
>>  return Modes;
>>  
>>  if (!has_panel_fitter(output))
> 
> This, to me, is the weirdest bit. If the monitor does support GTF
> modes, then don't add them? I think you might be able to replace this
> whole patch by changing just this one line thus:

No, this is for when no GTF defined in EDID.

And EDID 1.4 change definition in this byte.
Please refer to EDID standard 1.4 section 3.6.4.

Aaron

> 
> -if (mon && GTF_SUPPORTED(mon->features.msc))
> +if (mon && !GTF_SUPPORTED(mon->features.msc))
> 
> - ajax
> 
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel


Re: [PATCH xserver v2] xfree86: Refine drm modes on continuous freq panel

2020-04-14 Thread Aaron Ma
Already send a gitlab merge request.

Thanks,
Aaron

On 4/15/20 3:51 AM, Dave Airlie wrote:
> Any chance we could get this in a gitlab merge request?
> 
> Dave.
> 
> On Tue, 14 Apr 2020 at 19:28, Aaron Ma  wrote:
>>
>> EDID1.4 replaced GTF Bit with Continuous or Non-Continuous Frequency Display.
>>
>> Check the "Display Range Limits Descriptor" for GTF support.
>> If panel doesn't support GTF, then add gtf modes.
>>
>> Otherwise X will only show the modes in "Detailed Timing Descriptor".
>>
>> V2: Coding style changes.
>>
>> BugLink: https://gitlab.freedesktop.org/drm/intel/issues/313
>> Signed-off-by: Aaron Ma 
>> ---
>>  hw/xfree86/ddc/edid.h |  6 
>>  hw/xfree86/ddc/interpret_edid.c   | 35 +++
>>  hw/xfree86/ddc/xf86DDC.h  |  3 ++
>>  .../drivers/modesetting/drmmode_display.c |  2 +-
>>  4 files changed, 45 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/xfree86/ddc/edid.h b/hw/xfree86/ddc/edid.h
>> index 750e4270b..dffcb3749 100644
>> --- a/hw/xfree86/ddc/edid.h
>> +++ b/hw/xfree86/ddc/edid.h
>> @@ -262,6 +262,10 @@
>>  #define MAX_H (_MAX_H(c) + _MAX_H_OFFSET(c))
>>  #define _MAX_CLOCK(x) x[9]
>>  #define MAX_CLOCK _MAX_CLOCK(c)
>> +#define _DEFAULT_GTF(x) (x[10] == 0x00)
>> +#define DEFAULT_GTF _DEFAULT_GTF(c)
>> +#define _RANGE_LIMITS_ONLY(x) (x[10] == 0x01)
>> +#define RANGE_LIMITS_ONLY _RANGE_LIMITS_ONLY(c)
>>  #define _HAVE_2ND_GTF(x) (x[10] == 0x02)
>>  #define HAVE_2ND_GTF _HAVE_2ND_GTF(c)
>>  #define _F_2ND_GTF(x) (x[12] * 2)
>> @@ -490,6 +494,8 @@ struct monitor_ranges {
>>  int gtf_2nd_j;
>>  int max_clock_khz;
>>  int maxwidth;   /* in pixels */
>> +BOOL supported_default_gtf;
>> +BOOL range_limits_only;
>>  char supported_aspect;
>>  char preferred_aspect;
>>  char supported_blanking;
>> diff --git a/hw/xfree86/ddc/interpret_edid.c 
>> b/hw/xfree86/ddc/interpret_edid.c
>> index 17a8f81c0..c9f0b0ec3 100644
>> --- a/hw/xfree86/ddc/interpret_edid.c
>> +++ b/hw/xfree86/ddc/interpret_edid.c
>> @@ -672,7 +672,19 @@ get_monitor_ranges(Uchar * c, struct monitor_ranges *r)
>>  r->max_clock = 0;
>>  if (MAX_CLOCK != 0xff)  /* is specified? */
>>  r->max_clock = MAX_CLOCK * 10 + 5;
>> +
>> +if (DEFAULT_GTF) {
>> +   r->supported_default_gtf = TRUE;
>> +} else
>> +   r->supported_default_gtf = FALSE;
>> +
>> +if (RANGE_LIMITS_ONLY) {
>> +   r->range_limits_only = TRUE;
>> +} else
>> +   r->range_limits_only = FALSE;
>> +
>>  if (HAVE_2ND_GTF) {
>> +r->supported_default_gtf = TRUE;
>>  r->gtf_2nd_f = F_2ND_GTF;
>>  r->gtf_2nd_c = C_2ND_GTF;
>>  r->gtf_2nd_m = M_2ND_GTF;
>> @@ -751,6 +763,29 @@ validate_version(int scrnIndex, struct edid_version *r)
>>  return TRUE;
>>  }
>>
>> +Bool
>> +gtf_supported(int scrnIndex, xf86MonPtr mon)
>> +{
>> +int i;
>> +
>> +if (!mon)
>> +return FALSE;
>> +
>> +if (mon->ver.revision < 4) {
>> +if (GTF_SUPPORTED(mon->features.msc))
>> +   return TRUE;
>> +} else {
>> +for (i = 0; i < DET_TIMINGS; i++) {
>> +struct detailed_monitor_section *det_timing_des = 
>> &(mon->det_mon[i]);
>> +if (det_timing_des && (det_timing_des->type == DS_RANGES) &&
>> +det_timing_des->section.ranges.supported_default_gtf)
>> +   return TRUE;
>> +   }
>> +}
>> +
>> +return FALSE;
>> +}
>> +
>>  /*
>>   * Returns true if HDMI, false if definitely not or unknown.
>>   */
>> diff --git a/hw/xfree86/ddc/xf86DDC.h b/hw/xfree86/ddc/xf86DDC.h
>> index 7d81ab911..2fa4ba55a 100644
>> --- a/hw/xfree86/ddc/xf86DDC.h
>> +++ b/hw/xfree86/ddc/xf86DDC.h
>> @@ -48,6 +48,9 @@ extern _X_EXPORT Bool xf86SetDDCproperties(ScrnInfoPtr 
>> pScreen, xf86MonPtr DDC);
>>  extern _X_EXPORT Bool
>>   xf86MonitorIsHDMI(xf86MonPtr mon);
>>
>> +extern _X_EXPORT Bool
>> +gtf_supported(int scrnIndex, xf86MonPtr mon);
>> +
>>  extern _X_EXPORT DisplayModePtr
>>  FindDMTMode(int hsize, int vsize, int refresh, Bool rb);
>>
>> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c 
>> b/hw/xfree86/drivers/modesetting/drmmode_display.c
>> index 8e6b697c4..031e5efea 100644
>> --- a/hw/xfree86/drivers/modesetting/drmmode_display.c
>> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
>> @@ -2459,7 +2459,7 @@ drmmode_output_add_gtf_modes(xf86OutputPtr output, 
>> DisplayModePtr Modes)
>>  int max_x = 0, max_y = 0;
>>  float max_vrefresh = 0.0;
>>
>> -if (mon && GTF_SUPPORTED(mon->features.msc))
>> +if (mon && gtf_supported(output->scrn->scrnIndex, mon))
>>  return Modes;
>>
>>  if (!has_panel_fitter(output))
>> --
>> 2.26.0
>>
>> ___
>> xorg-devel@lists.x.org: X.Org development
>> Archives: http://lists.x.org/archives/xorg-devel
>> Info: https://lists.x.org/mailman/listinfo/xorg-devel
> 

Re: [PATCH xserver v2] xfree86: Refine drm modes on continuous freq panel

2020-04-14 Thread Adam Jackson
On Tue, 2020-04-14 at 17:28 +0800, Aaron Ma wrote:
> EDID1.4 replaced GTF Bit with Continuous or Non-Continuous Frequency Display.

There's a lot that's weird about this patch but:

> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c 
> b/hw/xfree86/drivers/modesetting/drmmode_display.c
> index 8e6b697c4..031e5efea 100644
> --- a/hw/xfree86/drivers/modesetting/drmmode_display.c
> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
> @@ -2459,7 +2459,7 @@ drmmode_output_add_gtf_modes(xf86OutputPtr output, 
> DisplayModePtr Modes)
>  int max_x = 0, max_y = 0;
>  float max_vrefresh = 0.0;
>  
> -if (mon && GTF_SUPPORTED(mon->features.msc))
> +if (mon && gtf_supported(output->scrn->scrnIndex, mon))
>  return Modes;
>  
>  if (!has_panel_fitter(output))

This, to me, is the weirdest bit. If the monitor does support GTF
modes, then don't add them? I think you might be able to replace this
whole patch by changing just this one line thus:

-if (mon && GTF_SUPPORTED(mon->features.msc))
+if (mon && !GTF_SUPPORTED(mon->features.msc))

- ajax

___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel


Re: [PATCH xserver v2] xfree86: Refine drm modes on continuous freq panel

2020-04-14 Thread Dave Airlie
Any chance we could get this in a gitlab merge request?

Dave.

On Tue, 14 Apr 2020 at 19:28, Aaron Ma  wrote:
>
> EDID1.4 replaced GTF Bit with Continuous or Non-Continuous Frequency Display.
>
> Check the "Display Range Limits Descriptor" for GTF support.
> If panel doesn't support GTF, then add gtf modes.
>
> Otherwise X will only show the modes in "Detailed Timing Descriptor".
>
> V2: Coding style changes.
>
> BugLink: https://gitlab.freedesktop.org/drm/intel/issues/313
> Signed-off-by: Aaron Ma 
> ---
>  hw/xfree86/ddc/edid.h |  6 
>  hw/xfree86/ddc/interpret_edid.c   | 35 +++
>  hw/xfree86/ddc/xf86DDC.h  |  3 ++
>  .../drivers/modesetting/drmmode_display.c |  2 +-
>  4 files changed, 45 insertions(+), 1 deletion(-)
>
> diff --git a/hw/xfree86/ddc/edid.h b/hw/xfree86/ddc/edid.h
> index 750e4270b..dffcb3749 100644
> --- a/hw/xfree86/ddc/edid.h
> +++ b/hw/xfree86/ddc/edid.h
> @@ -262,6 +262,10 @@
>  #define MAX_H (_MAX_H(c) + _MAX_H_OFFSET(c))
>  #define _MAX_CLOCK(x) x[9]
>  #define MAX_CLOCK _MAX_CLOCK(c)
> +#define _DEFAULT_GTF(x) (x[10] == 0x00)
> +#define DEFAULT_GTF _DEFAULT_GTF(c)
> +#define _RANGE_LIMITS_ONLY(x) (x[10] == 0x01)
> +#define RANGE_LIMITS_ONLY _RANGE_LIMITS_ONLY(c)
>  #define _HAVE_2ND_GTF(x) (x[10] == 0x02)
>  #define HAVE_2ND_GTF _HAVE_2ND_GTF(c)
>  #define _F_2ND_GTF(x) (x[12] * 2)
> @@ -490,6 +494,8 @@ struct monitor_ranges {
>  int gtf_2nd_j;
>  int max_clock_khz;
>  int maxwidth;   /* in pixels */
> +BOOL supported_default_gtf;
> +BOOL range_limits_only;
>  char supported_aspect;
>  char preferred_aspect;
>  char supported_blanking;
> diff --git a/hw/xfree86/ddc/interpret_edid.c b/hw/xfree86/ddc/interpret_edid.c
> index 17a8f81c0..c9f0b0ec3 100644
> --- a/hw/xfree86/ddc/interpret_edid.c
> +++ b/hw/xfree86/ddc/interpret_edid.c
> @@ -672,7 +672,19 @@ get_monitor_ranges(Uchar * c, struct monitor_ranges *r)
>  r->max_clock = 0;
>  if (MAX_CLOCK != 0xff)  /* is specified? */
>  r->max_clock = MAX_CLOCK * 10 + 5;
> +
> +if (DEFAULT_GTF) {
> +   r->supported_default_gtf = TRUE;
> +} else
> +   r->supported_default_gtf = FALSE;
> +
> +if (RANGE_LIMITS_ONLY) {
> +   r->range_limits_only = TRUE;
> +} else
> +   r->range_limits_only = FALSE;
> +
>  if (HAVE_2ND_GTF) {
> +r->supported_default_gtf = TRUE;
>  r->gtf_2nd_f = F_2ND_GTF;
>  r->gtf_2nd_c = C_2ND_GTF;
>  r->gtf_2nd_m = M_2ND_GTF;
> @@ -751,6 +763,29 @@ validate_version(int scrnIndex, struct edid_version *r)
>  return TRUE;
>  }
>
> +Bool
> +gtf_supported(int scrnIndex, xf86MonPtr mon)
> +{
> +int i;
> +
> +if (!mon)
> +return FALSE;
> +
> +if (mon->ver.revision < 4) {
> +if (GTF_SUPPORTED(mon->features.msc))
> +   return TRUE;
> +} else {
> +for (i = 0; i < DET_TIMINGS; i++) {
> +struct detailed_monitor_section *det_timing_des = 
> &(mon->det_mon[i]);
> +if (det_timing_des && (det_timing_des->type == DS_RANGES) &&
> +det_timing_des->section.ranges.supported_default_gtf)
> +   return TRUE;
> +   }
> +}
> +
> +return FALSE;
> +}
> +
>  /*
>   * Returns true if HDMI, false if definitely not or unknown.
>   */
> diff --git a/hw/xfree86/ddc/xf86DDC.h b/hw/xfree86/ddc/xf86DDC.h
> index 7d81ab911..2fa4ba55a 100644
> --- a/hw/xfree86/ddc/xf86DDC.h
> +++ b/hw/xfree86/ddc/xf86DDC.h
> @@ -48,6 +48,9 @@ extern _X_EXPORT Bool xf86SetDDCproperties(ScrnInfoPtr 
> pScreen, xf86MonPtr DDC);
>  extern _X_EXPORT Bool
>   xf86MonitorIsHDMI(xf86MonPtr mon);
>
> +extern _X_EXPORT Bool
> +gtf_supported(int scrnIndex, xf86MonPtr mon);
> +
>  extern _X_EXPORT DisplayModePtr
>  FindDMTMode(int hsize, int vsize, int refresh, Bool rb);
>
> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c 
> b/hw/xfree86/drivers/modesetting/drmmode_display.c
> index 8e6b697c4..031e5efea 100644
> --- a/hw/xfree86/drivers/modesetting/drmmode_display.c
> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
> @@ -2459,7 +2459,7 @@ drmmode_output_add_gtf_modes(xf86OutputPtr output, 
> DisplayModePtr Modes)
>  int max_x = 0, max_y = 0;
>  float max_vrefresh = 0.0;
>
> -if (mon && GTF_SUPPORTED(mon->features.msc))
> +if (mon && gtf_supported(output->scrn->scrnIndex, mon))
>  return Modes;
>
>  if (!has_panel_fitter(output))
> --
> 2.26.0
>
> ___
> xorg-devel@lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: https://lists.x.org/mailman/listinfo/xorg-devel
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel


[PATCH xserver v2] xfree86: Refine drm modes on continuous freq panel

2020-04-14 Thread Aaron Ma
EDID1.4 replaced GTF Bit with Continuous or Non-Continuous Frequency Display.

Check the "Display Range Limits Descriptor" for GTF support.
If panel doesn't support GTF, then add gtf modes.

Otherwise X will only show the modes in "Detailed Timing Descriptor".

V2: Coding style changes.

BugLink: https://gitlab.freedesktop.org/drm/intel/issues/313
Signed-off-by: Aaron Ma 
---
 hw/xfree86/ddc/edid.h |  6 
 hw/xfree86/ddc/interpret_edid.c   | 35 +++
 hw/xfree86/ddc/xf86DDC.h  |  3 ++
 .../drivers/modesetting/drmmode_display.c |  2 +-
 4 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/hw/xfree86/ddc/edid.h b/hw/xfree86/ddc/edid.h
index 750e4270b..dffcb3749 100644
--- a/hw/xfree86/ddc/edid.h
+++ b/hw/xfree86/ddc/edid.h
@@ -262,6 +262,10 @@
 #define MAX_H (_MAX_H(c) + _MAX_H_OFFSET(c))
 #define _MAX_CLOCK(x) x[9]
 #define MAX_CLOCK _MAX_CLOCK(c)
+#define _DEFAULT_GTF(x) (x[10] == 0x00)
+#define DEFAULT_GTF _DEFAULT_GTF(c)
+#define _RANGE_LIMITS_ONLY(x) (x[10] == 0x01)
+#define RANGE_LIMITS_ONLY _RANGE_LIMITS_ONLY(c)
 #define _HAVE_2ND_GTF(x) (x[10] == 0x02)
 #define HAVE_2ND_GTF _HAVE_2ND_GTF(c)
 #define _F_2ND_GTF(x) (x[12] * 2)
@@ -490,6 +494,8 @@ struct monitor_ranges {
 int gtf_2nd_j;
 int max_clock_khz;
 int maxwidth;   /* in pixels */
+BOOL supported_default_gtf;
+BOOL range_limits_only;
 char supported_aspect;
 char preferred_aspect;
 char supported_blanking;
diff --git a/hw/xfree86/ddc/interpret_edid.c b/hw/xfree86/ddc/interpret_edid.c
index 17a8f81c0..c9f0b0ec3 100644
--- a/hw/xfree86/ddc/interpret_edid.c
+++ b/hw/xfree86/ddc/interpret_edid.c
@@ -672,7 +672,19 @@ get_monitor_ranges(Uchar * c, struct monitor_ranges *r)
 r->max_clock = 0;
 if (MAX_CLOCK != 0xff)  /* is specified? */
 r->max_clock = MAX_CLOCK * 10 + 5;
+
+if (DEFAULT_GTF) {
+   r->supported_default_gtf = TRUE;
+} else
+   r->supported_default_gtf = FALSE;
+
+if (RANGE_LIMITS_ONLY) {
+   r->range_limits_only = TRUE;
+} else
+   r->range_limits_only = FALSE;
+
 if (HAVE_2ND_GTF) {
+r->supported_default_gtf = TRUE;
 r->gtf_2nd_f = F_2ND_GTF;
 r->gtf_2nd_c = C_2ND_GTF;
 r->gtf_2nd_m = M_2ND_GTF;
@@ -751,6 +763,29 @@ validate_version(int scrnIndex, struct edid_version *r)
 return TRUE;
 }
 
+Bool
+gtf_supported(int scrnIndex, xf86MonPtr mon)
+{
+int i;
+
+if (!mon)
+return FALSE;
+
+if (mon->ver.revision < 4) {
+if (GTF_SUPPORTED(mon->features.msc))
+   return TRUE;
+} else {
+for (i = 0; i < DET_TIMINGS; i++) {
+struct detailed_monitor_section *det_timing_des = 
&(mon->det_mon[i]);
+if (det_timing_des && (det_timing_des->type == DS_RANGES) &&
+det_timing_des->section.ranges.supported_default_gtf)
+   return TRUE;
+   }
+}
+
+return FALSE;
+}
+
 /*
  * Returns true if HDMI, false if definitely not or unknown.
  */
diff --git a/hw/xfree86/ddc/xf86DDC.h b/hw/xfree86/ddc/xf86DDC.h
index 7d81ab911..2fa4ba55a 100644
--- a/hw/xfree86/ddc/xf86DDC.h
+++ b/hw/xfree86/ddc/xf86DDC.h
@@ -48,6 +48,9 @@ extern _X_EXPORT Bool xf86SetDDCproperties(ScrnInfoPtr 
pScreen, xf86MonPtr DDC);
 extern _X_EXPORT Bool
  xf86MonitorIsHDMI(xf86MonPtr mon);
 
+extern _X_EXPORT Bool
+gtf_supported(int scrnIndex, xf86MonPtr mon);
+
 extern _X_EXPORT DisplayModePtr
 FindDMTMode(int hsize, int vsize, int refresh, Bool rb);
 
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c 
b/hw/xfree86/drivers/modesetting/drmmode_display.c
index 8e6b697c4..031e5efea 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -2459,7 +2459,7 @@ drmmode_output_add_gtf_modes(xf86OutputPtr output, 
DisplayModePtr Modes)
 int max_x = 0, max_y = 0;
 float max_vrefresh = 0.0;
 
-if (mon && GTF_SUPPORTED(mon->features.msc))
+if (mon && gtf_supported(output->scrn->scrnIndex, mon))
 return Modes;
 
 if (!has_panel_fitter(output))
-- 
2.26.0

___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel