diff --git a/src/i830_lvds.c b/src/i830_lvds.c index 4f64905..8256ac1 100644 --- a/src/i830_lvds.c +++ b/src/i830_lvds.c @@ -891,6 +891,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; + timing->sync = 0x03; + + 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. */ @@ -945,6 +967,13 @@ i830_lvds_get_modes(xf86OutputPtr output) edid_mon = xcalloc (1, sizeof (xf86Monitor)); if (edid_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; + /* Set wide sync ranges so we get all modes * handed to valid_mode for checking */ @@ -958,9 +987,15 @@ i830_lvds_get_modes(xf86OutputPtr output) } } - if (pI830->lvds_fixed_mode != NULL) + if (pI830->lvds_fixed_mode != NULL) { + /*now we construct new EDID monitor, + * so filled one detailed timing block + */ + fill_detailed_block(edid_mon->det_mon + 1, pI830->lvds_fixed_mode); + /*the filed timing block should be set preferred*/ + edid_mon->features.msc |= 0x2; return xf86DuplicateMode(pI830->lvds_fixed_mode); - + } return NULL; }