[Intel-gfx] [PATCH i-g-t 09/10] igt_kms: Add modeset support to atomic commits.
Maarten Lankhorst
maarten.lankhorst at linux.intel.com
Thu Jun 30 12:57:18 UTC 2016
Add the correct properties, add pipe_changed and mode_changed and go!
Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
---
lib/igt_kms.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++------------
lib/igt_kms.h | 10 +++--
2 files changed, 105 insertions(+), 29 deletions(-)
diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index cae99618b93b..fc0164f4f1a2 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -167,11 +167,13 @@ static const char *igt_crtc_prop_names[IGT_NUM_CRTC_PROPS] = {
"DEGAMMA_LUT",
"CTM",
"GAMMA_LUT",
+ "MODE_ID",
+ "ACTIVE"
};
static const char *igt_connector_prop_names[IGT_NUM_CONNECTOR_PROPS] = {
"scaling mode",
- "DPMS"
+ "CRTC_ID"
};
/*
@@ -312,6 +314,9 @@ const char *kmstest_pipe_name(enum pipe pipe)
{
const char *str[] = { "A", "B", "C" };
+ if (pipe == PIPE_NONE)
+ return "None";
+
if (pipe > 2)
return "invalid";
@@ -836,6 +841,8 @@ static bool _kmstest_connector_config(int drm_fd, uint32_t connector_id,
drmModeConnector *connector;
drmModeEncoder *encoder;
+ config->pipe = PIPE_NONE;
+
resources = drmModeGetResources(drm_fd);
if (!resources) {
igt_warn("drmModeGetResources failed");
@@ -1225,8 +1232,9 @@ static void igt_output_refresh(igt_output_t *output)
-1);
}
- igt_atomic_fill_connector_props(display, output,
- IGT_NUM_CONNECTOR_PROPS, igt_connector_prop_names);
+ if (output->config.connector)
+ igt_atomic_fill_connector_props(display, output,
+ IGT_NUM_CONNECTOR_PROPS, igt_connector_prop_names);
if (!output->valid)
return;
@@ -1458,8 +1466,13 @@ void igt_display_init(igt_display_t *display, int drm_fd)
/* planes = 1 primary, (p-1) sprites, 1 cursor */
pipe->n_planes = p + 1;
+ for_each_plane_on_pipe(display, i, plane)
+ plane->fb_changed = true;
+
/* make sure we don't overflow the plane array */
igt_assert(pipe->n_planes <= IGT_MAX_PLANES);
+
+ pipe->mode_changed = true;
}
/*
@@ -1483,6 +1496,8 @@ void igt_display_init(igt_display_t *display, int drm_fd)
output->display = display;
igt_output_refresh(output);
+
+ output->config.pipe_changed = true;
}
drmModeFreePlaneResources(plane_resources);
@@ -2016,6 +2031,22 @@ static int igt_pipe_commit(igt_pipe_t *pipe,
return 0;
}
+static void
+igt_pipe_replace_blob(igt_pipe_t *pipe, uint64_t *blob, void *ptr, size_t length)
+{
+ igt_display_t *display = pipe->display;
+ uint32_t blob_id = 0;
+
+ if (*blob != 0)
+ igt_assert(drmModeDestroyPropertyBlob(display->drm_fd,
+ *blob) == 0);
+
+ if (length > 0)
+ igt_assert(drmModeCreatePropertyBlob(display->drm_fd,
+ ptr, length, &blob_id) == 0);
+
+ *blob = blob_id;
+}
/*
* Add crtc property changes to the atomic property set
@@ -2031,6 +2062,28 @@ static void igt_atomic_prepare_crtc_commit(igt_pipe_t *pipe_obj, drmModeAtomicRe
igt_atomic_populate_crtc_req(req, pipe_obj, IGT_CRTC_GAMMA_LUT, pipe_obj->gamma_blob);
}
+ if (pipe_obj->mode_changed) {
+ igt_output_t *output = igt_pipe_get_output(pipe_obj);
+
+ if (!output) {
+ igt_pipe_replace_blob(pipe_obj, &pipe_obj->mode_blob, NULL, 0);
+
+ LOG(pipe_obj->display, "%s: Setting NULL mode\n",
+ kmstest_pipe_name(pipe_obj->pipe));
+ } else {
+ drmModeModeInfo *mode = igt_output_get_mode(output);
+
+ igt_pipe_replace_blob(pipe_obj, &pipe_obj->mode_blob, mode, sizeof(*mode));
+
+ LOG(pipe_obj->display, "%s: Setting mode %s from %s\n",
+ kmstest_pipe_name(pipe_obj->pipe),
+ mode->name, igt_output_name(output));
+ }
+
+ igt_atomic_populate_crtc_req(req, pipe_obj, IGT_CRTC_MODE_ID, pipe_obj->mode_blob);
+ igt_atomic_populate_crtc_req(req, pipe_obj, IGT_CRTC_ACTIVE, !!output);
+ }
+
/*
* TODO: Add all crtc level properties here
*/
@@ -2047,8 +2100,14 @@ static void igt_atomic_prepare_connector_commit(igt_output_t *output, drmModeAto
if (config->connector_scaling_mode_changed)
igt_atomic_populate_connector_req(req, output, IGT_CONNECTOR_SCALING_MODE, config->connector_scaling_mode);
- if (config->connector_dpms_changed)
- igt_atomic_populate_connector_req(req, output, IGT_CONNECTOR_DPMS, config->connector_dpms);
+ if (config->pipe_changed) {
+ uint32_t crtc_id = 0;
+
+ if (output->config.pipe != PIPE_NONE)
+ crtc_id = output->config.crtc->crtc_id;
+
+ igt_atomic_populate_connector_req(req, output, IGT_CONNECTOR_CRTC_ID, crtc_id);
+ }
/*
* TODO: Add all other connector level properties here
*/
@@ -2090,10 +2149,17 @@ static int igt_atomic_commit(igt_display_t *display)
for (i = 0; i < display->n_outputs; i++) {
output = &display->outputs[i];
+ if (!output->config.connector)
+ continue;
+
+ LOG(display, "%s: preparing atomic, pipe: %s\n",
+ igt_output_name(output),
+ kmstest_pipe_name(output->config.pipe));
+
igt_atomic_prepare_connector_commit(output, req);
}
- ret = drmModeAtomicCommit(display->drm_fd, req, 0, NULL);
+ ret = drmModeAtomicCommit(display->drm_fd, req, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
drmModeAtomicFree(req);
return ret;
@@ -2158,6 +2224,9 @@ static int do_display_commit(igt_display_t *display,
pipe_obj->background_changed = false;
}
+ if (s != COMMIT_UNIVERSAL)
+ pipe_obj->mode_changed = false;
+
for_each_plane_on_pipe(display, pipe, plane) {
plane->fb_changed = false;
plane->position_changed = false;
@@ -2168,11 +2237,14 @@ static int do_display_commit(igt_display_t *display,
}
}
- for (i = 0; i < display->n_outputs && s == COMMIT_ATOMIC; i++) {
+ for (i = 0; i < display->n_outputs; i++) {
igt_output_t *output = &display->outputs[i];
- output->config.connector_dpms_changed = false;
- output->config.connector_scaling_mode_changed = false;
+ if (s != COMMIT_UNIVERSAL)
+ output->config.pipe_changed = false;
+
+ if (s == COMMIT_ATOMIC)
+ output->config.connector_scaling_mode_changed = false;
}
igt_debug_wait_for_keypress("modeset");
@@ -2266,13 +2338,25 @@ drmModeModeInfo *igt_output_get_mode(igt_output_t *output)
*/
void igt_output_override_mode(igt_output_t *output, drmModeModeInfo *mode)
{
+ igt_pipe_t *pipe = igt_output_get_driving_pipe(output);
+
output->override_mode = *mode;
output->use_override_mode = true;
+
+ if (pipe)
+ pipe->mode_changed = true;
}
void igt_output_set_pipe(igt_output_t *output, enum pipe pipe)
{
igt_display_t *display = output->display;
+ igt_pipe_t *old_pipe;
+
+ if (output->pending_crtc_idx_mask) {
+ old_pipe = igt_output_get_driving_pipe(output);
+
+ old_pipe->mode_changed = true;
+ }
if (pipe == PIPE_NONE) {
LOG(display, "%s: set_pipe(any)\n", igt_output_name(output));
@@ -2281,7 +2365,12 @@ void igt_output_set_pipe(igt_output_t *output, enum pipe pipe)
LOG(display, "%s: set_pipe(%s)\n", igt_output_name(output),
kmstest_pipe_name(pipe));
output->pending_crtc_idx_mask = 1 << pipe;
+
+ display->pipes[pipe].mode_changed = true;
}
+
+ if (pipe != output->config.pipe)
+ output->config.pipe_changed = true;
}
igt_plane_t *igt_output_get_plane(igt_output_t *output, enum igt_plane plane)
@@ -2442,23 +2531,6 @@ void igt_plane_set_rotation(igt_plane_t *plane, igt_rotation_t rotation)
plane->rotation_changed = true;
}
-static void
-igt_pipe_replace_blob(igt_pipe_t *pipe, uint64_t *blob, void *ptr, size_t length)
-{
- igt_display_t *display = pipe->display;
- uint32_t blob_id = 0;
-
- if (*blob != 0)
- igt_assert(drmModeDestroyPropertyBlob(display->drm_fd,
- *blob) == 0);
-
- if (length > 0)
- igt_assert(drmModeCreatePropertyBlob(display->drm_fd,
- ptr, length, &blob_id) == 0);
-
- *blob = blob_id;
-}
-
void
igt_pipe_set_degamma_lut(igt_pipe_t *pipe, void *ptr, size_t length)
{
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 2c88c1be61e4..2e5547d664ca 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -93,12 +93,14 @@ enum igt_atomic_crtc_properties {
IGT_CRTC_CTM,
IGT_CRTC_DEGAMMA_LUT,
IGT_CRTC_GAMMA_LUT,
+ IGT_CRTC_MODE_ID,
+ IGT_CRTC_ACTIVE,
IGT_NUM_CRTC_PROPS
};
enum igt_atomic_connector_properties {
IGT_CONNECTOR_SCALING_MODE = 0,
- IGT_CONNECTOR_DPMS,
+ IGT_CONNECTOR_CRTC_ID,
IGT_NUM_CONNECTOR_PROPS
};
@@ -109,8 +111,7 @@ struct kmstest_connector_config {
drmModeModeInfo default_mode;
uint64_t connector_scaling_mode;
bool connector_scaling_mode_changed;
- uint64_t connector_dpms;
- bool connector_dpms_changed;
+ bool pipe_changed;
uint32_t atomic_props_connector[IGT_NUM_CONNECTOR_PROPS];
int pipe;
unsigned valid_crtc_idx_mask;
@@ -263,6 +264,9 @@ struct igt_pipe {
uint32_t color_mgmt_changed : 1;
uint32_t crtc_id;
+
+ uint64_t mode_blob;
+ bool mode_changed;
};
typedef struct {
--
2.5.5
More information about the Intel-gfx
mailing list