[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freedesktop-intel-gfx
Subject:    [Intel-gfx] [Resend] [PATCH 2/3] Get the LVDS panel limit and	check whether the given modeline is va
From:       yakui.zhao () intel ! com (yakui_zhao)
Date:       2009-05-31 4:01:30
Message-ID: 1243742490.3634.177.camel () localhost ! localdomain
[Download RAW message or body]

When the connector type is LVDS, it will traverse the mode list returned by KMS kernel to
get the LVDS panel limit.
Then it will use the panel limit to check whether the given modeline is valid.
If the given modeline exceeds the LVDS panel limit, it will be invalid.

Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
---
 src/drmmode_display.c |   38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

Index: xf86_video_intel/src/drmmode_display.c
===================================================================
--- xf86_video_intel.orig/src/drmmode_display.c	2009-05-21 11:39:38.000000000 +0800
+++ xf86_video_intel/src/drmmode_display.c	2009-05-21 11:39:45.000000000 +0800
@@ -471,6 +471,21 @@
 static Bool
 drmmode_output_mode_valid(xf86OutputPtr output, DisplayModePtr pModes)
 {
+	drmmode_output_private_ptr drmmode_output = output->driver_private;
+	drmModeConnectorPtr koutput = drmmode_output->mode_output;
+	struct fixed_panel_lvds *p_lvds = drmmode_output->private_data;
+
+	/*
+	 * If the connector type is LVDS, we will use the panel limit to
+	 * verfiy whether the mode is valid.
+	 */
+	if ((koutput->connector_type ==  DRM_MODE_CONNECTOR_LVDS) && p_lvds) {
+		if (pModes->HDisplay > p_lvds->hdisplay ||
+			pModes->VDisplay > p_lvds->vdisplay)
+			return MODE_PANEL;
+		else
+			return MODE_OK;
+	}
 	return MODE_OK;
 }
 
@@ -483,6 +498,8 @@
 	int i;
 	DisplayModePtr Modes = NULL, Mode;
 	drmModePropertyPtr props;
+	struct fixed_panel_lvds *p_lvds;
+	drmModeModeInfo *mode_ptr;
 
 	/* look for an EDID property */
 	for (i = 0; i < koutput->count_props; i++) {
@@ -518,6 +535,27 @@
 		Modes = xf86ModesAdd(Modes, Mode);
 
 	}
+	p_lvds = drmmode_output->private_data;
+	/*
+	 * If the connector type is LVDS, we will traverse the kernel mode to
+	 * get the panel limit.
+	 * If it is incorrect, please fix me.
+	 */
+	if ((koutput->connector_type ==  DRM_MODE_CONNECTOR_LVDS) && p_lvds) {
+		p_lvds->hdisplay = 0;
+		p_lvds->vdisplay = 0;
+		for (i = 0; i < koutput->count_modes; i++) {
+			mode_ptr = &koutput->modes[i];
+			if ((mode_ptr->hdisplay >= p_lvds->hdisplay) &&
+				(mode_ptr->vdisplay >= p_lvds->vdisplay)) {
+				p_lvds->hdisplay = mode_ptr->hdisplay;
+				p_lvds->vdisplay = mode_ptr->vdisplay;
+			}
+		}
+		if (!p_lvds->hdisplay || !p_lvds->vdisplay)
+			xf86DrvMsg(output->scrn->scrnIndex, X_ERROR,
+				"Incorrect KMS mode.\n");
+	}
 	return Modes;
 }
 




[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic