diff mbox

[v4,21/21] modetest: Try all possible encoders for a connector

Message ID 1363704962-14077-22-git-send-email-laurent.pinchart@ideasonboard.com (mailing list archive)
State New, archived
Headers show

Commit Message

Laurent Pinchart March 19, 2013, 2:56 p.m. UTC
When building the pipeline, instead of using only the encoders attached
to a connector, take all possible encoders into account to locate a
CRTC.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 tests/modetest/modetest.c | 35 +++++++++++++++++++++++++----------
 1 file changed, 25 insertions(+), 10 deletions(-)
diff mbox

Patch

diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c
index 489cf2c..15aedc8 100644
--- a/tests/modetest/modetest.c
+++ b/tests/modetest/modetest.c
@@ -634,6 +634,19 @@  error:
 	return NULL;
 }
 
+static int get_crtc_index(struct device *dev, uint32_t id)
+{
+	int i;
+
+	for (i = 0; i < dev->resources->res->count_crtcs; ++i) {
+		drmModeCrtc *crtc = dev->resources->crtcs[i].crtc;
+		if (crtc && crtc->crtc_id == id)
+			return i;
+	}
+
+	return -1;
+}
+
 static drmModeConnector *get_connector_by_id(struct device *dev, uint32_t id)
 {
 	drmModeConnector *connector;
@@ -726,26 +739,28 @@  static struct crtc *pipe_find_crtc(struct device *dev, struct pipe_arg *pipe)
 	int j;
 
 	for (i = 0; i < pipe->num_cons; ++i) {
+		uint32_t crtcs_for_connector = 0;
 		drmModeConnector *connector;
 		drmModeEncoder *encoder;
+		int idx;
 
 		connector = get_connector_by_id(dev, pipe->con_ids[i]);
 		if (!connector)
 			return NULL;
 
-		encoder = get_encoder_by_id(dev, connector->encoder_id);
-		if (!encoder)
-			return NULL;
+		for (j = 0; j < connector->count_encoders; ++j) {
+			encoder = get_encoder_by_id(dev, connector->encoders[j]);
+			if (!encoder)
+				continue;
 
-		possible_crtcs &= encoder->possible_crtcs;
+			crtcs_for_connector |= encoder->possible_crtcs;
 
-		for (j = 0; j < dev->resources->res->count_crtcs; ++j) {
-			drmModeCrtc *crtc = dev->resources->crtcs[j].crtc;
-			if (crtc && crtc->crtc_id == encoder->crtc_id) {
-				active_crtcs |= 1 << j;
-				break;
-			}
+			idx = get_crtc_index(dev, encoder->crtc_id);
+			if (idx >= 0)
+				active_crtcs |= 1 << idx;
 		}
+
+		possible_crtcs &= crtcs_for_connector;
 	}
 
 	if (!possible_crtcs)