Enabled has_pc8 global for ICL and Gen9.
Added PC8+ residency test for display enabled case as well.

Signed-off-by: Anshuman Gupta <[email protected]>
---
 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
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to