[Intel-gfx] [PATCH 2/2]i830_sdvo.c:fixup sdvo lvds mode
Ma Ling
ling.ma at intel.com
Mon Feb 23 06:20:41 CET 2009
based on sdvo fixed mode adjust mode to output in fixup function.
---
src/i830_sdvo.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 55 insertions(+), 3 deletions(-)
diff --git a/src/i830_sdvo.c b/src/i830_sdvo.c
index ff5d570..292a0ad 100644
--- a/src/i830_sdvo.c
+++ b/src/i830_sdvo.c
@@ -957,6 +957,51 @@ static void i830_sdvo_set_avi_infoframe(xf86OutputPtr output,
SDVO_HBUF_TX_VSYNC);
}
+static void i830_sdvo_lvds_fixup(xf86OutputPtr output,
+ DisplayModePtr adjusted_mode,
+ DisplayModePtr mode)
+{
+ I830Ptr pI830 = I830PTR(output->scrn);
+ int left_border = 0, right_border = 0,
+ top_border = 0, bottom_border = 0;
+
+ adjusted_mode->HDisplay = pI830->lvds_fixed_mode->HDisplay;
+ adjusted_mode->HSyncStart = pI830->lvds_fixed_mode->HSyncStart;
+ adjusted_mode->HSyncEnd = pI830->lvds_fixed_mode->HSyncEnd;
+ adjusted_mode->HTotal = pI830->lvds_fixed_mode->HTotal;
+ adjusted_mode->VDisplay = pI830->lvds_fixed_mode->VDisplay;
+ adjusted_mode->VSyncStart = pI830->lvds_fixed_mode->VSyncStart;
+ adjusted_mode->VSyncEnd = pI830->lvds_fixed_mode->VSyncEnd;
+ adjusted_mode->VTotal = pI830->lvds_fixed_mode->VTotal;
+ adjusted_mode->Clock = pI830->lvds_fixed_mode->Clock;
+ adjusted_mode->Clock *=
+ i830_sdvo_get_pixel_multiplier(pI830->lvds_fixed_mode);
+ xf86SetModeCrtc(adjusted_mode, INTERLACE_HALVE_V);
+
+ /* Currently only support fitting mode as Center*/
+ left_border = (adjusted_mode->HDisplay - mode->HDisplay) / 2;
+ right_border = left_border;
+ if (mode->HDisplay & 1)
+ right_border++;
+ top_border = (adjusted_mode->VDisplay - mode->VDisplay) / 2;
+ bottom_border = top_border;
+ if (mode->VDisplay & 1)
+ bottom_border++;
+
+ adjusted_mode->CrtcHDisplay = mode->HDisplay;
+ adjusted_mode->CrtcHBlankStart = mode->HDisplay + right_border - 1;
+ adjusted_mode->CrtcHBlankEnd = adjusted_mode->CrtcHTotal -
+ left_border - 1;
+ adjusted_mode->CrtcHSyncStart = adjusted_mode->CrtcHBlankStart;
+ adjusted_mode->CrtcHSyncEnd = adjusted_mode->CrtcHBlankEnd;
+ adjusted_mode->CrtcVDisplay = mode->VDisplay;
+ adjusted_mode->CrtcVBlankStart = mode->VDisplay + bottom_border - 1;
+ adjusted_mode->CrtcVBlankEnd = adjusted_mode->CrtcVTotal -
+ top_border - 1;
+ adjusted_mode->CrtcVSyncStart = adjusted_mode->CrtcVBlankStart;
+ adjusted_mode->CrtcVSyncEnd = adjusted_mode->CrtcVBlankEnd;
+}
+
static Bool
i830_sdvo_mode_fixup(xf86OutputPtr output, DisplayModePtr mode,
DisplayModePtr adjusted_mode)
@@ -964,11 +1009,16 @@ i830_sdvo_mode_fixup(xf86OutputPtr output, DisplayModePtr mode,
I830OutputPrivatePtr intel_output = output->driver_private;
struct i830_sdvo_priv *dev_priv = intel_output->dev_priv;
- if (!dev_priv->is_tv) {
+ if (!dev_priv->is_tv && !dev_priv->is_lvds) {
/* Make the CRTC code factor in the SDVO pixel multiplier. The SDVO
* device will be told of the multiplier during mode_set.
*/
adjusted_mode->Clock *= i830_sdvo_get_pixel_multiplier(mode);
+ } else if(dev_priv->is_lvds == TRUE) {
+ /* scale mode as adjusted mode based on
+ * fixed mode from init function.
+ */
+ i830_sdvo_lvds_fixup(output, adjusted_mode, mode);
} else {
struct i830_sdvo_dtd output_dtd;
Bool success;
@@ -1081,7 +1131,8 @@ i830_sdvo_mode_set(xf86OutputPtr output, DisplayModePtr mode,
i830_sdvo_set_input_timing(output, &input_dtd);
#endif
- switch (i830_sdvo_get_pixel_multiplier(mode)) {
+ switch (i830_sdvo_get_pixel_multiplier(
+ dev_priv->is_lvds == TRUE ? pI830->lvds_fixed_mode : mode)) {
case 1:
i830_sdvo_set_clock_rate_mult(output, SDVO_CLOCK_RATE_MULT_1X);
break;
@@ -1113,7 +1164,8 @@ i830_sdvo_mode_set(xf86OutputPtr output, DisplayModePtr mode,
if (intel_crtc->pipe == 1)
sdvox |= SDVO_PIPE_B_SELECT;
- sdvo_pixel_multiply = i830_sdvo_get_pixel_multiplier(mode);
+ sdvo_pixel_multiply = i830_sdvo_get_pixel_multiplier(
+ dev_priv->is_lvds == TRUE ? pI830->lvds_fixed_mode : mode);
if (IS_I965G(pI830)) {
/* done in crtc_mode_set as the dpll_md reg must be written early */
} else if (IS_I945G(pI830) || IS_I945GM(pI830) || IS_G33CLASS(pI830)) {
--
1.5.4.4
More information about the Intel-gfx
mailing list