xf86-video-intel: 2 commits - src/intel_display.c

Chris Wilson ickle at kemper.freedesktop.org
Thu Aug 5 10:19:16 PDT 2010


 src/intel_display.c |  102 ++++++++++++++++++++++++++++------------------------
 1 file changed, 56 insertions(+), 46 deletions(-)

New commits:
commit 6304cb048c745be81dae13f1d936996e04eaa530
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Aug 5 18:13:55 2010 +0100

    display: Minor cleanup for adding extra LVDS modes
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_display.c b/src/intel_display.c
index f190c61..352b8a9 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -698,14 +698,12 @@ static Bool
 intel_output_mode_valid(xf86OutputPtr output, DisplayModePtr pModes)
 {
 	struct intel_output *intel_output = output->driver_private;
-	drmModeConnectorPtr koutput = intel_output->mode_output;
 
 	/*
 	 * 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 &&
-	    intel_output->has_lvds_limits) {
+	if (intel_output->has_lvds_limits) {
 		if (pModes->HDisplay > intel_output->lvds_hdisplay ||
 		    pModes->VDisplay > intel_output->lvds_vdisplay)
 			return MODE_PANEL;
@@ -808,29 +806,32 @@ intel_output_get_modes(xf86OutputPtr output)
 {
 	struct intel_output *intel_output = output->driver_private;
 	drmModeConnectorPtr koutput = intel_output->mode_output;
+	DisplayModePtr Modes = NULL;
 	int i;
-	DisplayModePtr Modes = NULL, Mode;
-	drmModeModeInfo *mode_ptr;
 
 	intel_output_attach_edid(output);
 
 	/* modes should already be available */
 	for (i = 0; i < koutput->count_modes; i++) {
-		Mode = xnfalloc(sizeof(DisplayModeRec));
-
-		mode_from_kmode(output->scrn, &koutput->modes[i], Mode);
-		Modes = xf86ModesAdd(Modes, Mode);
+		DisplayModePtr Mode;
 
+		Mode = calloc(1, sizeof(DisplayModeRec));
+		if (Mode) {
+			mode_from_kmode(output->scrn, &koutput->modes[i], Mode);
+			Modes = xf86ModesAdd(Modes, Mode);
+		}
 	}
 
 	/*
 	 * If the connector type is LVDS, we will traverse the kernel mode to
-	 * get the panel limit.
+	 * get the panel limit. And then add all the standard modes to fake
+	 * the fullscreen experience.
 	 * If it is incorrect, please fix me.
 	 */
 	intel_output->has_lvds_limits = FALSE;
 	if (koutput->connector_type == DRM_MODE_CONNECTOR_LVDS) {
 		for (i = 0; i < koutput->count_modes; i++) {
+			drmModeModeInfo *mode_ptr;
 
 			mode_ptr = &koutput->modes[i];
 			if (mode_ptr->hdisplay > intel_output->lvds_hdisplay)
@@ -842,10 +843,9 @@ intel_output_get_modes(xf86OutputPtr output)
 		intel_output->has_lvds_limits =
 			intel_output->lvds_hdisplay &&
 			intel_output->lvds_vdisplay;
-	}
 
-	if (koutput->connector_type ==  DRM_MODE_CONNECTOR_LVDS)
 		Modes = intel_output_lvds_edid(output, Modes);
+	}
 
 	return Modes;
 }
commit 41ae9564350cba8ac9f040f22bad8740e08e14c4
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Aug 5 18:13:30 2010 +0100

    display: Refactor EDID attachment to output.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_display.c b/src/intel_display.c
index 1539976..f190c61 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -82,7 +82,6 @@ struct intel_output {
 	int output_id;
 	drmModeConnectorPtr mode_output;
 	drmModeEncoderPtr mode_encoder;
-	drmModePropertyBlobPtr edid_blob;
 	int num_props;
 	struct intel_property *props;
 	void *private_data;
@@ -715,6 +714,49 @@ intel_output_mode_valid(xf86OutputPtr output, DisplayModePtr pModes)
 	return MODE_OK;
 }
 
+static void
+intel_output_attach_edid(xf86OutputPtr output)
+{
+	struct intel_output *intel_output = output->driver_private;
+	drmModeConnectorPtr koutput = intel_output->mode_output;
+	struct intel_mode *mode = intel_output->mode;
+	drmModePropertyBlobPtr edid_blob = NULL;
+	int i;
+
+	/* look for an EDID property */
+	for (i = 0; i < koutput->count_props; i++) {
+		drmModePropertyPtr props;
+
+		props = drmModeGetProperty(mode->fd, koutput->props[i]);
+		if (!props)
+			continue;
+
+		if (!(props->flags & DRM_MODE_PROP_BLOB)) {
+			drmModeFreeProperty(props);
+			continue;
+		}
+
+		if (!strcmp(props->name, "EDID")) {
+			drmModeFreePropertyBlob(edid_blob);
+			edid_blob =
+				drmModeGetPropertyBlob(mode->fd,
+						       koutput->prop_values[i]);
+		}
+		drmModeFreeProperty(props);
+	}
+
+	if (edid_blob) {
+		xf86OutputSetEDID(output,
+				  xf86InterpretEDID(output->scrn->scrnIndex,
+						    edid_blob->data));
+		drmModeFreePropertyBlob(edid_blob);
+	} else {
+		xf86OutputSetEDID(output,
+				  xf86InterpretEDID(output->scrn->scrnIndex,
+						    NULL));
+	}
+}
+
 static DisplayModePtr
 intel_output_lvds_edid(xf86OutputPtr output, DisplayModePtr modes)
 {
@@ -766,40 +808,11 @@ intel_output_get_modes(xf86OutputPtr output)
 {
 	struct intel_output *intel_output = output->driver_private;
 	drmModeConnectorPtr koutput = intel_output->mode_output;
-	struct intel_mode *mode = intel_output->mode;
 	int i;
 	DisplayModePtr Modes = NULL, Mode;
-	drmModePropertyPtr props;
 	drmModeModeInfo *mode_ptr;
 
-	/* look for an EDID property */
-	for (i = 0; i < koutput->count_props; i++) {
-		props = drmModeGetProperty(mode->fd, koutput->props[i]);
-		if (!props)
-			continue;
-
-		if (!(props->flags & DRM_MODE_PROP_BLOB)) {
-			drmModeFreeProperty(props);
-			continue;
-		}
-
-		if (!strcmp(props->name, "EDID")) {
-			drmModeFreePropertyBlob(intel_output->edid_blob);
-			intel_output->edid_blob =
-				drmModeGetPropertyBlob(mode->fd,
-						       koutput->prop_values[i]);
-		}
-		drmModeFreeProperty(props);
-	}
-
-	if (intel_output->edid_blob)
-		xf86OutputSetEDID(output,
-				  xf86InterpretEDID(output->scrn->scrnIndex,
-						    intel_output->edid_blob->data));
-	else
-		xf86OutputSetEDID(output,
-				  xf86InterpretEDID(output->scrn->scrnIndex,
-						    NULL));
+	intel_output_attach_edid(output);
 
 	/* modes should already be available */
 	for (i = 0; i < koutput->count_modes; i++) {
@@ -843,9 +856,6 @@ intel_output_destroy(xf86OutputPtr output)
 	struct intel_output *intel_output = output->driver_private;
 	int i;
 
-	if (intel_output->edid_blob)
-		drmModeFreePropertyBlob(intel_output->edid_blob);
-
 	for (i = 0; i < intel_output->num_props; i++) {
 		drmModeFreeProperty(intel_output->props[i].mode_prop);
 		free(intel_output->props[i].atoms);


More information about the xorg-commit mailing list