From: Keith P. <ke...@ke...> - 2008-11-26 08:32:22
|
If the EDID data from the LVDS doesn't indicate support for a wide range of continuous frequencies, it will not match any of the default modes although our LVDS scaler logic ignores refresh rates when programming LVDS modes. Fix this by smashing the compute EDID data to open up the sync rates. Signed-off-by: Keith Packard <ke...@ke...> --- src/i830_lvds.c | 30 ++++++++++++++++++++++++++++++ 1 files changed, 30 insertions(+), 0 deletions(-) diff --git a/src/i830_lvds.c b/src/i830_lvds.c index 0d67d50..66e706c 100644 --- a/src/i830_lvds.c +++ b/src/i830_lvds.c @@ -787,6 +787,36 @@ i830_lvds_get_modes(xf86OutputPtr output) DisplayModePtr modes; edid_mon = xf86OutputGetEDID (output, intel_output->pDDCBus); + + /* Our LVDS scaler can hit any size, so mark the EDID data as + * supporting continuous timings + */ + if (edid_mon) { + int i, j = -1; + edid_mon->features.msc |= 0x1; + + /* Either find a DS_RANGES block, or replace a DS_VENDOR block, + * smashing it into a DS_RANGES block with wide open refresh to + * match all default modes + */ + for (i = 0; i < sizeof (edid_mon->det_mon) / sizeof (edid_mon->det_mon[0]); i++) + { + if (edid_mon->det_mon[i].type >= DS_VENDOR && j == -1) + j = i; + if (edid_mon->det_mon[i].type == DS_RANGES) { + j = i; + break; + } + } + if (j != -1) { + struct monitor_ranges *ranges = &edid_mon->det_mon[j].section.ranges; + edid_mon->det_mon[j].type = DS_RANGES; + ranges->min_v = 0; + ranges->max_v = 200; + ranges->min_h = 0; + ranges->max_h = 200; + } + } xf86OutputSetEDID (output, edid_mon); modes = xf86OutputGetEDIDModes (output); -- 1.5.6.5 |
From: Zhenyu W. <zhe...@in...> - 2008-12-25 01:03:26
|
On 2008.11.26 16:32:12 +0800, Keith Packard wrote: > If the EDID data from the LVDS doesn't indicate support for a wide range of > continuous frequencies, it will not match any of the default modes although > our LVDS scaler logic ignores refresh rates when programming LVDS modes. Fix > this by smashing the compute EDID data to open up the sync rates. > > Signed-off-by: Keith Packard <ke...@ke...> Keith, looks we have a laptop to trigger this now. http://bugs.freedesktop.org/show_bug.cgi?id=19247 Push this patch? -- Open Source Technology Center, Intel ltd. $gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827 |
From: Ma, L. <li...@in...> - 2008-12-29 05:46:51
Attachments:
19247.patch
|
hi Keith, I happen to encounter the same issue, and did a patch for situation when we can't find EDID from display, and set the flag (edid_mon->features.msc |= 0x1). Could you have some opinion on it ? Thanks Ma Ling >-----Original Message----- >From: int...@li... >[mailto:int...@li...] On Behalf Of >Keith Packard >Sent: 2008年11月26日 16:32 >To: int...@li... >Cc: dri...@li... >Subject: [Intel-gfx] [PATCH] Fix LVDS EDID to match all >possible default modes > >If the EDID data from the LVDS doesn't indicate support for a >wide range of >continuous frequencies, it will not match any of the default >modes although >our LVDS scaler logic ignores refresh rates when programming >LVDS modes. Fix >this by smashing the compute EDID data to open up the sync rates. > >Signed-off-by: Keith Packard <ke...@ke...> >--- > src/i830_lvds.c | 30 ++++++++++++++++++++++++++++++ > 1 files changed, 30 insertions(+), 0 deletions(-) > >diff --git a/src/i830_lvds.c b/src/i830_lvds.c >index 0d67d50..66e706c 100644 >--- a/src/i830_lvds.c >+++ b/src/i830_lvds.c >@@ -787,6 +787,36 @@ i830_lvds_get_modes(xf86OutputPtr output) > DisplayModePtr modes; > > edid_mon = xf86OutputGetEDID (output, intel_output->pDDCBus); >+ >+ /* Our LVDS scaler can hit any size, so mark the EDID data as >+ * supporting continuous timings >+ */ >+ if (edid_mon) { >+ int i, j = -1; >+ edid_mon->features.msc |= 0x1; >+ >+ /* Either find a DS_RANGES block, or replace a DS_VENDOR block, >+ * smashing it into a DS_RANGES block with wide open refresh to >+ * match all default modes >+ */ >+ for (i = 0; i < sizeof (edid_mon->det_mon) / sizeof >(edid_mon->det_mon[0]); i++) >+ { >+ if (edid_mon->det_mon[i].type >= DS_VENDOR && j == -1) >+ j = i; >+ if (edid_mon->det_mon[i].type == DS_RANGES) { >+ j = i; >+ break; >+ } >+ } >+ if (j != -1) { >+ struct monitor_ranges *ranges = >&edid_mon->det_mon[j].section.ranges; >+ edid_mon->det_mon[j].type = DS_RANGES; >+ ranges->min_v = 0; >+ ranges->max_v = 200; >+ ranges->min_h = 0; >+ ranges->max_h = 200; >+ } >+ } > xf86OutputSetEDID (output, edid_mon); > > modes = xf86OutputGetEDIDModes (output); >-- >1.5.6.5 > >_______________________________________________ >Intel-gfx mailing list >Int...@li... >http://lists.freedesktop.org/mailman/listinfo/intel-gfx > > |