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@xxxxxxxxx> --- tests/i915/i915_pm_rpm.c | 75 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/tests/i915/i915_pm_rpm.c b/tests/i915/i915_pm_rpm.c index be296f5..af7a5d0 100644 --- a/tests/i915/i915_pm_rpm.c +++ b/tests/i915/i915_pm_rpm.c @@ -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) -- 2.7.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx