@@ -90,7 +90,7 @@ enum plane_type {
int drm_fd, msr_fd, pc8_status_fd;
int debugfs;
-bool has_runtime_pm, has_pc8;
+bool has_runtime_pm, has_pc8, connected_screens;
struct mode_set_data ms_data;
/* Stuff used when creating FBs and mode setting. */
@@ -98,8 +98,8 @@ struct mode_set_data {
drmModeResPtr res;
drmModeConnectorPtr connectors[MAX_CONNECTORS];
drmModePropertyBlobPtr edids[MAX_CONNECTORS];
-
uint32_t devid;
+ bool pc8_needs_screen_off;
};
/* Stuff we query at different times so we can compare. */
@@ -121,6 +121,7 @@ struct modeset_params {
struct modeset_params lpsp_mode_params;
struct modeset_params non_lpsp_mode_params;
struct modeset_params *default_mode_params;
+struct modeset_params *screens_mode_params[MAX_CONNECTORS];
static int8_t *pm_data = NULL;
@@ -297,6 +298,39 @@ static bool init_modeset_params_for_type(struct mode_set_data *data,
return true;
}
+static bool init_modeset_params_for_all_screen(struct mode_set_data *data)
+{
+ drmModeConnectorPtr connector = NULL;
+ drmModeModeInfoPtr mode = NULL;
+ int screen = 0;
+
+ if (!data->res)
+ return false;
+
+ for (int i = 0; i < data->res->count_connectors; i++) {
+ drmModeConnectorPtr c = data->connectors[i];
+
+ if (c->connection == DRM_MODE_CONNECTED && c->count_modes) {
+ screens_mode_params[screen] =
+ malloc(sizeof(struct modeset_params));
+ connector = c;
+ mode = &c->modes[0];
+ igt_create_pattern_fb(drm_fd, mode->hdisplay, mode->vdisplay,
+ DRM_FORMAT_XRGB8888, LOCAL_DRM_FORMAT_MOD_NONE,
+ &screens_mode_params[screen]->fb);
+ screens_mode_params[screen]->crtc_id =
+ kmstest_find_crtc_for_connector(drm_fd, data->res, connector, 0);
+ screens_mode_params[screen]->connector_id = connector->connector_id;
+ screens_mode_params[screen]->mode = mode;
+ screen++;
+ }
+ }
+
+ if (!connector)
+ return false;
+
+ return true;
+}
static void init_modeset_cached_params(struct mode_set_data *data)
{
bool lpsp, non_lpsp;
@@ -305,6 +339,7 @@ static void init_modeset_cached_params(struct mode_set_data *data)
SCREEN_TYPE_LPSP);
non_lpsp = init_modeset_params_for_type(data, &non_lpsp_mode_params,
SCREEN_TYPE_NON_LPSP);
+ connected_screens = init_modeset_params_for_all_screen(data);
if (lpsp)
default_mode_params = &lpsp_mode_params;
@@ -353,6 +388,23 @@ static bool enable_one_screen_with_type(struct mode_set_data *data,
return set_mode_for_params(params);
}
+static void enable_all_screens(struct mode_set_data *data)
+{
+ struct modeset_params *params = NULL;
+
+ /* SKIP if there are no connected screens. */
+ igt_require(connected_screens);
+
+ for (int i = 0; i < MAX_CONNECTORS ; i++) {
+ params = screens_mode_params[i];
+
+ if (params)
+ set_mode_for_params(params);
+ else
+ break;
+ }
+ return;
+}
static void enable_one_screen(struct mode_set_data *data)
{
/* SKIP if there are no connected screens. */
@@ -685,8 +737,12 @@ static void setup_pc8(void)
{
has_pc8 = false;
- /* Only Haswell supports the PC8 feature. */
- if (!IS_HASWELL(ms_data.devid) && !IS_BROADWELL(ms_data.devid))
+ if (IS_HASWELL(ms_data.devid) && IS_BROADWELL(ms_data.devid))
+ ms_data.pc8_needs_screen_off = true;
+ else if (AT_LEAST_GEN(ms_data.devid, 9))
+ ms_data.pc8_needs_screen_off = false;
+ /* Only Haswell supports the PC8 feature on lesser than GEN9. */
+ else
return;
/* Make sure our Kernel supports MSR and the module is loaded. */
@@ -778,7 +834,6 @@ static void teardown_environment(void)
igt_pm_restore_sata_link_power_management(pm_data);
free(pm_data);
-
fini_mode_set_data(&ms_data);
close(debugfs);
@@ -808,9 +863,15 @@ static void pc8_residency_subtest(void)
"configuration.\n");
/* Make sure PC8+ residencies stop! */
- enable_one_screen(&ms_data);
- igt_assert_f(!pc8_plus_residency_changed(10),
+ if (ms_data.pc8_needs_screen_off) {
+ enable_one_screen(&ms_data);
+ igt_assert_f(!pc8_plus_residency_changed(10),
"PC8+ residency didn't stop with screen enabled.\n");
+ } else {
+ enable_all_screens(&ms_data);
+ igt_assert_f(pc8_plus_residency_changed(10),
+ "Machine is not reaching PC8+ states with all screen enabled.\n");
+ }
}
static void modeset_subtest(enum screen_type type, int rounds, int wait_flags)
Enabled has_pc8 global for ICL and Gen9. Added PC8+ residency test for display enabled case as well. Signed-off-by: Anshuman Gupta <anshuman.gupta@intel.com> --- tests/i915/i915_pm_rpm.c | 75 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 7 deletions(-)