diff options
author | Ma Ling <ling.ma@intel.com> | 2009-01-13 10:26:40 +0800 |
---|---|---|
committer | Zhenyu Wang <zhenyu.z.wang@intel.com> | 2009-01-14 10:59:20 +0800 |
commit | c0bc3cf128d8e9e1ed643be1586593d42c8f5b49 (patch) | |
tree | e7155973c1143415a655d1f54eb913b0a459217c | |
parent | 335d6bbdfd882eb98dc6ebd785ad2963abc6566d (diff) |
set continuous-frequency flag in get modes function
http://bugs.freedesktop.org/show_bug.cgi?id=19247
Because latest xorg will check whether the display is continuous frequency through one flag in monitor info structure,
if not it doesn't touch default modes. When laptop failed to fetch edid, We don't set the flag. In i830_lvds.c,
so currently we can not get default modes except only one mode line from bios.
In order to achieve default modes from xserver successfully,I set the flag and other EDID features.
(cherry picked from commit 3d206f9e46b5237bda7ca3c0f92d64c45ee8bdf5)
-rw-r--r-- | src/i830_lvds.c | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/src/i830_lvds.c b/src/i830_lvds.c index 3714142d..639450a1 100644 --- a/src/i830_lvds.c +++ b/src/i830_lvds.c @@ -775,6 +775,28 @@ i830_lvds_detect(xf86OutputPtr output) return XF86OutputStatusConnected; } +static void fill_detailed_block(struct detailed_monitor_section *det_mon, + DisplayModePtr mode) +{ + struct detailed_timings *timing = &det_mon->section.d_timings; + det_mon->type = DT; + timing->clock = mode->Clock * 1000; + timing->h_active = mode->HDisplay; + timing->h_blanking = mode->HTotal - mode->HDisplay; + timing->v_active = mode->VDisplay; + timing->v_blanking = mode->VTotal - mode->VDisplay; + timing->h_sync_off = mode->HSyncStart - mode->HDisplay; + timing->h_sync_width = mode->HSyncEnd - mode->HSyncStart; + timing->v_sync_off = mode->VSyncStart - mode->VDisplay; + timing->v_sync_width = mode->VSyncEnd - mode->VSyncStart; + + if (mode->Flags & V_PVSYNC) + timing->misc |= 0x02; + + if (mode->Flags & V_PHSYNC) + timing->misc |= 0x01; +} + /** * Return the list of DDC modes if available, or the BIOS fixed mode otherwise. */ @@ -819,7 +841,7 @@ i830_lvds_get_modes(xf86OutputPtr output) } } xf86OutputSetEDID (output, edid_mon); - + modes = xf86OutputGetEDIDModes (output); if (modes != NULL) return modes; @@ -829,15 +851,35 @@ i830_lvds_get_modes(xf86OutputPtr output) edid_mon = xcalloc (1, sizeof (xf86Monitor)); if (edid_mon) { + struct detailed_monitor_section *det_mon = edid_mon->det_mon; + /*support DPM, instead of DPMS*/ + edid_mon->features.dpms |= 0x1; + /*defaultly support RGB color display*/ + edid_mon->features.display_type |= 0x1; + /*defaultly display support continuous-freqencey*/ + edid_mon->features.msc |= 0x1; + /*defaultly the EDID version is 1.4 */ + edid_mon->ver.version = 1; + edid_mon->ver.revision = 4; + + if (pI830->lvds_fixed_mode != NULL) { + /* now we construct new EDID monitor, + * so filled one detailed timing block + */ + fill_detailed_block(det_mon, pI830->lvds_fixed_mode); + /* the filed timing block should be set preferred*/ + edid_mon->features.msc |= 0x2; + det_mon = det_mon + 1; + } + /* Set wide sync ranges so we get all modes * handed to valid_mode for checking */ - edid_mon->det_mon[0].type = DS_RANGES; - edid_mon->det_mon[0].section.ranges.min_v = 0; - edid_mon->det_mon[0].section.ranges.max_v = 200; - edid_mon->det_mon[0].section.ranges.min_h = 0; - edid_mon->det_mon[0].section.ranges.max_h = 200; - + det_mon->type = DS_RANGES; + det_mon->section.ranges.min_v = 0; + det_mon->section.ranges.max_v = 200; + det_mon->section.ranges.min_h = 0; + det_mon->section.ranges.max_h = 200; output->MonInfo = edid_mon; } } |