xf86-video-intel: 2 commits - src/sna/sna_display.c

Chris Wilson ickle at kemper.freedesktop.org
Wed May 29 04:30:32 PDT 2013


 src/sna/sna_display.c |   84 +++++++++++++++++++++++++++++++++++---------------
 1 file changed, 59 insertions(+), 25 deletions(-)

New commits:
commit 7f7c8087db6af58109e791763fe33582a1559646
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed May 29 12:25:37 2013 +0100

    sna: Log which outputs are being configured during a modeset
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 24fffb1..302a93a 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1332,6 +1332,25 @@ sna_crtc_damage(xf86CrtcPtr crtc)
 	RegionUnion(damage, damage, &region);
 }
 
+static char *outputs_for_crtc(xf86CrtcPtr crtc, char *outputs, int max)
+{
+	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
+	int len, i;
+
+	for (i = len = 0; i < xf86_config->num_output; i++) {
+		xf86OutputPtr output = xf86_config->output[i];
+
+		if (output->crtc != crtc)
+			continue;
+
+		len += snprintf(outputs+len, max-len, "%s, ", output->name);
+	}
+	assert(len >= 2);
+	outputs[len-2] = '\0';
+
+	return outputs;
+}
+
 static Bool
 sna_crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 			Rotation rotation, int x, int y)
@@ -1342,14 +1361,15 @@ sna_crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 	struct kgem_bo *saved_bo, *bo;
 	struct drm_mode_modeinfo saved_kmode;
 	bool saved_transform;
+	char outputs[256];
 
 	if (mode->HDisplay == 0 || mode->VDisplay == 0)
 		return FALSE;
 
 	xf86DrvMsg(crtc->scrn->scrnIndex, X_INFO,
-		   "switch to mode %dx%d on crtc %d (pipe %d)\n",
-		   mode->HDisplay, mode->VDisplay,
-		   sna_crtc->id, sna_crtc->pipe);
+		   "switch to mode %dx%d on pipe %d using %s\n",
+		   mode->HDisplay, mode->VDisplay, sna_crtc->pipe,
+		   outputs_for_crtc(crtc, outputs, sizeof(outputs)));
 
 	DBG(("%s(crtc=%d [pipe=%d] rotation=%d, x=%d, y=%d, mode=%dx%d@%d)\n",
 	     __FUNCTION__, sna_crtc->id, sna_crtc->pipe, rotation, x, y,
commit fc1e0702b25e647cb423851fb7228989fec28bd6
Author: Daniel Vetter <daniel.vetter at ffwll.ch>
Date:   Wed May 29 11:25:28 2013 +0100

    sna: fixup up possible_clones kms->X impedance mismatch
    
    We need to be a notch more careful with remapping the possible clones
    mask from the kernel:
    - SDVO and Haswell DDI have multiple connectors mapping to the same encoder.
    - The connector list can be reordered compared to the encoder list.
      This is used to move eDP/LVDS to the front.
    
    Also add even more debug output.
    
    Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index e927282..24fffb1 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -84,6 +84,7 @@ struct sna_property {
 struct sna_output {
 	int id;
 	drmModeConnectorPtr mode_output;
+	int encoder_idx;
 	int num_props;
 	struct sna_property *props;
 
@@ -98,6 +99,16 @@ struct sna_output {
 	struct list link;
 };
 
+static inline struct sna_output *to_sna_output(xf86OutputPtr output)
+{
+	return output->driver_private;
+}
+
+static inline int to_connector_id(xf86OutputPtr output)
+{
+	return to_sna_output(output)->mode_output->connector_id;
+}
+
 static inline struct sna_crtc *to_sna_crtc(xf86CrtcPtr crtc)
 {
 	return crtc->driver_private;
@@ -735,22 +746,17 @@ sna_crtc_apply(xf86CrtcPtr crtc)
 
 	for (i = 0; i < xf86_config->num_output; i++) {
 		xf86OutputPtr output = xf86_config->output[i];
-		struct sna_output *sna_output;
 
 		if (output->crtc != crtc)
 			continue;
 
 		assert(output->possible_crtcs & (1 << i));
 
-		sna_output = output->driver_private;
-
 		DBG(("%s: attaching output '%s' %d [%d] to crtc:%d (pipe %d) (possible crtc:%x, possible clones:%x)\n",
-		     __FUNCTION__, output->name, i,
-		     sna_output->mode_output->connector_id,
+		     __FUNCTION__, output->name, i, to_connector_id(output),
 		     sna_crtc->id, sna_crtc->pipe,
 		     output->possible_crtcs, output->possible_clones));
-		output_ids[output_count] =
-			sna_output->mode_output->connector_id;
+		output_ids[output_count] = to_connector_id(output);
 		output_count++;
 	}
 
@@ -2336,6 +2342,7 @@ sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 	struct sna_output *sna_output;
 	const char *output_name;
 	char name[32];
+	int i;
 
 	koutput = drmModeGetConnector(sna->kgem.fd,
 				      mode->kmode->connectors[num]);
@@ -2390,6 +2397,13 @@ sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 	output->subpixel_order = subpixel_conv_table[koutput->subpixel];
 	output->driver_private = sna_output;
 
+	for (i = 0; i < mode->kmode->count_encoders; i++) {
+		if (enc.encoder_id == mode->kmode->encoders[i]) {
+			sna_output->encoder_idx = i;
+			break;
+		}
+	}
+
 	if (is_panel(koutput->connector_type))
 		sna_output_backlight_init(output);
 
@@ -2398,8 +2412,7 @@ sna_output_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 	output->interlaceAllowed = TRUE;
 
 	DBG(("%s: created output '%s' %d [%d]  (possible crtc:%x, possible clones:%x)\n",
-	     __FUNCTION__, name, num,
-	     sna_output->mode_output->connector_id,
+	     __FUNCTION__, name, num, to_connector_id(output),
 	     output->possible_crtcs, output->possible_clones));
 
 	return;
@@ -2410,33 +2423,34 @@ cleanup_connector:
 	drmModeFreeConnector(koutput);
 }
 
-/* The kernel reports possible encoder clones, whereas X uses a list of
- * possible connector clones. This is works when we have a 1:1 mapping
- * between encoders and connectors, but breaks for Haswell which has a pair
- * of DP/HDMI connectors hanging off a single encoder.
+/* We need to map from kms encoder based possible_clones mask to X output based
+ * possible clones masking. Note that for SDVO and on Haswell with DP/HDMI we
+ * can have more than one output hanging off the same encoder.
  */
 static void
 sna_mode_compute_possible_clones(ScrnInfoPtr scrn)
 {
 	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
-	unsigned clones[32] = { 0 };
 	int i, j;
 
 	assert(config->num_output <= 32);
 
 	/* Convert from encoder numbering to output numbering */
 	for (i = 0; i < config->num_output; i++) {
-		unsigned mask = config->output[i]->possible_clones;
-		for (j = 0; mask != 0; j++, mask >>= 1) {
-			if ((mask & 1) == 0)
-				continue;
+		xf86OutputPtr output = config->output[i];
+		unsigned mask = output->possible_clones;
+		unsigned clones = 0;
 
-			clones[j] |= 1 << i;
+		for (j = 0; j < config->num_output; j++) {
+			if (mask & (1 << to_sna_output(config->output[j])->encoder_idx))
+				clones |= 1 << j;
 		}
-	}
 
-	for (i = 0; i < config->num_output; i++)
-		config->output[i]->possible_clones = clones[i];
+		output->possible_clones = clones;
+		DBG(("%s: updated output '%s' %d [%d] (possible crtc:%x, possible clones:%x)\n",
+		     __FUNCTION__, output->name, i, to_connector_id(output),
+		     output->possible_crtcs, output->possible_clones));
+	}
 }
 
 struct sna_visit_set_pixmap_window {


More information about the xorg-commit mailing list