summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorImre Deak <imre.deak@intel.com>2013-05-31 00:21:43 +0300
committerImre Deak <imre.deak@intel.com>2013-06-06 01:43:51 +0300
commitbfb0cdd668e6ecea56125586f5ddf1cf62cc0383 (patch)
treeb25c3ce0769391ce2ab1d6895aa03655939cf8cb /tests
parent334baf05ca4f90a49a86893a702f4cd1270a8dbb (diff)
lib: add kmstest_get_connector_config
This is used by multiple test cases, so make it shared. Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/kms_flip.c115
-rw-r--r--tests/testdisplay.c134
2 files changed, 58 insertions, 191 deletions
diff --git a/tests/kms_flip.c b/tests/kms_flip.c
index 735b4dda..c9b3d8a1 100644
--- a/tests/kms_flip.c
+++ b/tests/kms_flip.c
@@ -825,97 +825,23 @@ static void update_all_state(struct test_output *o,
update_state(&o->vblank_state);
}
-static void connector_find_preferred_mode(struct test_output *o, int crtc_id)
+static void connector_find_preferred_mode(uint32_t connector_id, int crtc_idx,
+ struct test_output *o)
{
- drmModeConnector *connector;
- drmModeEncoder *encoder = NULL;
- int i, j;
-
- /* First, find the connector & mode */
- o->mode_valid = 0;
- o->crtc = 0;
- connector = drmModeGetConnector(drm_fd, o->id);
- assert(connector);
-
- if (connector->connection != DRM_MODE_CONNECTED) {
- drmModeFreeConnector(connector);
- return;
- }
-
- if (!connector->count_modes) {
- fprintf(stderr, "connector %d has no modes\n", o->id);
- drmModeFreeConnector(connector);
- return;
- }
-
- if (connector->connector_id != o->id) {
- fprintf(stderr, "connector id doesn't match (%d != %d)\n",
- connector->connector_id, o->id);
- drmModeFreeConnector(connector);
- return;
- }
-
- for (j = 0; j < connector->count_modes; j++) {
- o->mode = connector->modes[j];
- if (o->mode.type & DRM_MODE_TYPE_PREFERRED) {
- o->mode_valid = 1;
- break;
- }
- }
-
- if (!o->mode_valid) {
- if (connector->count_modes > 0) {
- /* use the first mode as test mode */
- o->mode = connector->modes[0];
- o->mode_valid = 1;
- }
- else {
- fprintf(stderr, "failed to find any modes on connector %d\n",
- o->id);
- return;
- }
- }
+ struct kmstest_connector_config config;
- /* Now get the encoder */
- for (i = 0; i < connector->count_encoders; i++) {
- encoder = drmModeGetEncoder(drm_fd, connector->encoders[i]);
-
- if (!encoder) {
- fprintf(stderr, "could not get encoder %i: %s\n",
- resources->encoders[i], strerror(errno));
- drmModeFreeEncoder(encoder);
- continue;
- }
-
- break;
- }
-
- o->encoder = encoder;
-
- if (i == resources->count_encoders) {
- fprintf(stderr, "failed to find encoder\n");
- o->mode_valid = 0;
- return;
- }
-
- /* Find first CRTC not in use */
- for (i = 0; i < resources->count_crtcs; i++) {
- if (resources->crtcs[i] != crtc_id)
- continue;
- if (resources->crtcs[i] &&
- (o->encoder->possible_crtcs & (1<<i))) {
- o->crtc = resources->crtcs[i];
- break;
- }
- }
-
- if (!o->crtc) {
- fprintf(stderr, "could not find requested crtc %d\n", crtc_id);
+ if (kmstest_get_connector_config(drm_fd, connector_id, 1 << crtc_idx,
+ &config) < 0) {
o->mode_valid = 0;
return;
}
- o->connector = connector;
+ o->connector = config.connector;
+ o->encoder = config.encoder;
+ o->crtc = config.crtc->crtc_id;
+ o->pipe = config.pipe;
+ o->mode = config.default_mode;
+ o->mode_valid = 1;
}
static void
@@ -1042,21 +968,21 @@ static unsigned event_loop(struct test_output *o, unsigned duration_sec)
return end - start;
}
-static void run_test_on_crtc(struct test_output *o, int crtc, int duration)
+static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration)
{
unsigned ellapsed;
o->bpp = 32;
o->depth = 24;
- connector_find_preferred_mode(o, crtc);
+ connector_find_preferred_mode(o->id, crtc_idx, o);
if (!o->mode_valid)
return;
last_connector = o->connector;
fprintf(stdout, "Beginning %s on crtc %d, connector %d\n",
- o->test_name, crtc, o->id);
+ o->test_name, o->crtc, o->id);
o->fb_width = o->mode.hdisplay;
o->fb_height = o->mode.vdisplay;
@@ -1116,7 +1042,7 @@ static void run_test_on_crtc(struct test_output *o, int crtc, int duration)
check_final_state(o, &o->vblank_state, ellapsed);
fprintf(stdout, "\n%s on crtc %d, connector %d: PASSED\n\n",
- o->test_name, crtc, o->id);
+ o->test_name, o->crtc, o->id);
kmstest_remove_fb(drm_fd, o->fb_ids[2]);
kmstest_remove_fb(drm_fd, o->fb_ids[1]);
@@ -1131,7 +1057,8 @@ static void run_test_on_crtc(struct test_output *o, int crtc, int duration)
static int run_test(int duration, int flags, const char *test_name)
{
struct test_output o;
- int c, i;
+ int c;
+ int crtc_idx;
resources = drmModeGetResources(drm_fd);
if (!resources) {
@@ -1142,19 +1069,15 @@ static int run_test(int duration, int flags, const char *test_name)
/* Find any connected displays */
for (c = 0; c < resources->count_connectors; c++) {
- for (i = 0; i < resources->count_crtcs; i++) {
- int crtc;
-
+ for (crtc_idx = 0; crtc_idx < resources->count_crtcs; crtc_idx++) {
memset(&o, 0, sizeof(o));
o.test_name = test_name;
o.id = resources->connectors[c];
o.flags = flags;
o.flip_state.name = "flip";
o.vblank_state.name = "vblank";
- crtc = resources->crtcs[i];
- o.pipe = kmstest_get_pipe_from_crtc_id(drm_fd, crtc);
- run_test_on_crtc(&o, crtc, duration);
+ run_test_on_crtc(&o, crtc_idx, duration);
}
}
diff --git a/tests/testdisplay.c b/tests/testdisplay.c
index 67b70316..30474afb 100644
--- a/tests/testdisplay.c
+++ b/tests/testdisplay.c
@@ -102,6 +102,7 @@ struct connector {
drmModeEncoder *encoder;
drmModeConnector *connector;
int crtc;
+ int crtc_idx;
int pipe;
};
@@ -185,101 +186,31 @@ static void dump_crtcs_fd(int drmfd)
drmModeFreeResources(mode_resources);
}
-static void connector_find_preferred_mode(struct connector *c)
+static void connector_find_preferred_mode(uint32_t connector_id,
+ unsigned long crtc_idx_mask,
+ int mode_num, struct connector *c)
{
- drmModeConnector *connector;
- drmModeEncoder *encoder = NULL;
- int i, j;
-
- /* First, find the connector & mode */
- c->mode_valid = 0;
- connector = drmModeGetConnector(drm_fd, c->id);
- if (!connector) {
- fprintf(stderr, "could not get connector %d: %s\n",
- c->id, strerror(errno));
- drmModeFreeConnector(connector);
- return;
- }
-
- if (connector->connection != DRM_MODE_CONNECTED) {
- drmModeFreeConnector(connector);
- return;
- }
-
- if (!connector->count_modes) {
- fprintf(stderr, "connector %d has no modes\n", c->id);
- drmModeFreeConnector(connector);
- return;
- }
-
- if (connector->connector_id != c->id) {
- fprintf(stderr, "connector id doesn't match (%d != %d)\n",
- connector->connector_id, c->id);
- drmModeFreeConnector(connector);
- return;
- }
-
- for (j = 0; j < connector->count_modes; j++) {
- c->mode = connector->modes[j];
- if (c->mode.type & DRM_MODE_TYPE_PREFERRED) {
- c->mode_valid = 1;
- break;
- }
- }
-
- if ( specified_mode_num != -1 ){
- c->mode = connector->modes[specified_mode_num];
- if (c->mode.type & DRM_MODE_TYPE_PREFERRED)
- c->mode_valid = 1;
- }
-
- if (!c->mode_valid) {
- if (connector->count_modes > 0) {
- /* use the first mode as test mode */
- c->mode = connector->modes[0];
- c->mode_valid = 1;
- }
- else {
- fprintf(stderr, "failed to find any modes on connector %d\n",
- c->id);
- return;
- }
- }
-
- /* Now get the encoder */
- for (i = 0; i < connector->count_encoders; i++) {
- encoder = drmModeGetEncoder(drm_fd, connector->encoders[i]);
-
- if (!encoder) {
- fprintf(stderr, "could not get encoder %i: %s\n",
- resources->encoders[i], strerror(errno));
- drmModeFreeEncoder(encoder);
- continue;
- }
-
- break;
- }
-
- c->encoder = encoder;
+ struct kmstest_connector_config config;
- if (i == resources->count_encoders) {
- fprintf(stderr, "failed to find encoder\n");
+ if (kmstest_get_connector_config(drm_fd, connector_id, crtc_idx_mask,
+ &config) < 0) {
c->mode_valid = 0;
return;
}
- /* Find first CRTC not in use */
- for (i = 0; i < resources->count_crtcs; i++) {
- if (resources->crtcs[i] && (c->encoder->possible_crtcs & (1<<i)))
- break;
+ c->connector = config.connector;
+ c->encoder = config.encoder;
+ c->crtc = config.crtc->crtc_id;
+ c->crtc_idx = config.crtc_idx;
+ c->pipe = config.pipe;
+
+ if (mode_num != -1) {
+ assert(mode_num < config.connector->count_modes);
+ c->mode = config.connector->modes[mode_num];
+ } else {
+ c->mode = config.default_mode;
}
- c->crtc = resources->crtcs[i];
- c->pipe = i;
-
- if(test_preferred_mode || force_mode || specified_mode_num != -1)
- resources->crtcs[i] = 0;
-
- c->connector = connector;
+ c->mode_valid = 1;
}
static void
@@ -409,10 +340,6 @@ set_mode(struct connector *c)
else if (depth > 16 && depth <= 32)
bpp = 32;
- connector_find_preferred_mode(c);
- if (!c->mode_valid)
- return;
-
test_mode_num = 1;
if (force_mode){
memcpy( &c->mode, &force_timing, sizeof(force_timing));
@@ -506,13 +433,30 @@ int update_display(void)
}
if (test_preferred_mode || test_all_modes || force_mode || specified_disp_id != -1) {
+ unsigned long crtc_idx_mask = -1UL;
+
/* Find any connected displays */
for (c = 0; c < resources->count_connectors; c++) {
- connectors[c].id = resources->connectors[c];
- if ( specified_disp_id != -1 && connectors[c].id != specified_disp_id )
+ struct connector *connector = &connectors[c];
+
+ connector->id = resources->connectors[c];
+ if (specified_disp_id != -1 &&
+ connector->id != specified_disp_id)
+ continue;
+
+ connector_find_preferred_mode(connector->id,
+ crtc_idx_mask,
+ specified_mode_num,
+ connector);
+ if (!connector->mode_valid)
continue;
- set_mode(&connectors[c]);
+ set_mode(connector);
+
+ if (test_preferred_mode || force_mode ||
+ specified_mode_num != -1)
+ crtc_idx_mask &= ~(1 << connector->crtc_idx);
+
}
}
drmModeFreeResources(resources);