[PATCH i-g-t 2/2] tests/intel/kms_psr2_sf: extend tests for panel replay sf
Joshi, Kunal1
kunal1.joshi at intel.com
Mon Feb 19 05:25:13 UTC 2024
Hello Jouni,
On 2/16/2024 1:55 PM, Hogander, Jouni wrote:
> On Thu, 2024-02-08 at 20:24 +0530, Kunal Joshi wrote:
>> Extend the tests to cover panel replay selective fetch feature.
>>
>> From kms_psr2_sf test point of view we have
>> check_pr_psr2_sel_fetch_support
>> function to check if PR/PSR2 selective fetch is supported for an
>> output
>> if output supports selective fetch then we check we enter DEEP_SLEEP
>> mode
>> in run function
>>
>> v2: fixed dynamic test name
>> v3: use check_psr2_support (Jouni)
>> v4: correct order of checks in check_pr_psr2_sel_fetch_support
>> (Jouni)
>> use appropriate psr mode in psr_wait_entry (Jouni)
>>
>> Cc: Jouni Högander<jouni.hogander at intel.com>
>> Cc: Animesh Manna<animesh.manna at intel.com>
>> Cc: Arun R Murthy<arun.r.murthy at intel.com>
>> Signed-off-by: Kunal Joshi<kunal1.joshi at intel.com>
>> ---
>> tests/intel/kms_psr2_sf.c | 147 +++++++++++++++++++++++++++++++-----
>> --
>> 1 file changed, 120 insertions(+), 27 deletions(-)
>>
>> diff --git a/tests/intel/kms_psr2_sf.c b/tests/intel/kms_psr2_sf.c
>> index 8e6a9e02c..0595c1f11 100644
>> --- a/tests/intel/kms_psr2_sf.c
>> +++ b/tests/intel/kms_psr2_sf.c
>> @@ -172,6 +172,7 @@ typedef struct {
>> uint32_t screen_changes;
>> int cur_x, cur_y;
>> enum pipe pipe;
>> + enum psr_mode psr_mode;
>> enum {
>> FEATURE_NONE = 0,
>> FEATURE_DSC = 1,
>> @@ -179,6 +180,34 @@ typedef struct {
>> } coexist_feature;
>> } data_t;
>>
>> +static enum psr_mode get_sel_fetch_mode_for_output(data_t *data,
>> igt_output_t *output)
>> +{
>> + enum psr_mode mode = PSR_DISABLED;
>> +
>> + if (psr_sink_support(data->drm_fd, data->debugfs_fd,
>> + PR_MODE_SEL_FETCH,
>> output))
>> + mode = PR_MODE_SEL_FETCH;
>> + else if (psr_sink_support(data->drm_fd, data->debugfs_fd,
>> + PSR_MODE_2,
>> output))
>> + mode = PSR_MODE_2;
>> + else
>> + igt_info("selective fetch not supported on output
>> %s\n", output->name);
>> +
>> + return mode;
>> +}
>> +
>> +static const char *get_psr_mode_str_for_output(data_t *data,
>> igt_output_t *output)
>> +{
>> + const char *psr_mode = NULL;
> If you are doing it this way this variable should be static. I'm not
> sure if renaming these testcases to pr-* and psr2-* gives any benefit.
> I'll guess it is ok, if you want to do that change.
Have addressed your comment in the next revision, kept the naming just
to know
test executed on PR or PSR panel.
>
>> +
>> + if (get_sel_fetch_mode_for_output(data, output) ==
>> PR_MODE_SEL_FETCH)
>> + psr_mode = "pr-";
>> + else if (get_sel_fetch_mode_for_output(data, output) ==
>> PSR_MODE_2)
>> + psr_mode = "psr2-";
>> + igt_assert_f(psr_mode, "Invalid psr mode\n");
>> + return psr_mode;
>> +}
>> +
>> static const char *op_str(enum operations op)
>> {
>> static const char * const name[] = {
>> @@ -688,7 +717,7 @@ static void damaged_plane_move(data_t *data)
>>
>> igt_display_commit2(&data->display, COMMIT_ATOMIC);
>>
>> - igt_assert(psr_wait_entry(data->debugfs_fd, PSR_MODE_2,
>> NULL));
>> + igt_assert(psr_wait_entry(data->debugfs_fd, data->psr_mode,
>> data->output));
> Not really matter of this patch. I think at some point you need one
> more patch to differentiate in psr_wait_entry (psr_active_check) based
> on output type eDP vs. DP. See Bspec 68920 "Additional programming
> considerations (registers common between eDP and DP)".
>
Sure will send this changes as separate later.
>
> BR,
>
> Jouni Högander
>
>>
>> expected_output(data);
>> }
>> @@ -788,7 +817,7 @@ static void plane_move_continuous(data_t *data)
>> {
>> int target_x, target_y;
>>
>> - igt_assert(psr_wait_entry(data->debugfs_fd, PSR_MODE_2,
>> NULL));
>> + igt_assert(psr_wait_entry(data->debugfs_fd, data->psr_mode,
>> data->output));
>>
>> get_target_coords(data, &target_x, &target_y);
>>
>> @@ -865,7 +894,7 @@ static void damaged_plane_update(data_t *data)
>> igt_plane_set_position(data->test_plane, 0, 0);
>> igt_display_commit2(&data->display, COMMIT_ATOMIC);
>>
>> - igt_assert(psr_wait_entry(data->debugfs_fd, PSR_MODE_2,
>> NULL));
>> + igt_assert(psr_wait_entry(data->debugfs_fd, data->psr_mode,
>> data->output));
>>
>> expected_output(data);
>> }
>> @@ -874,7 +903,7 @@ static void run(data_t *data)
>> {
>> int i;
>>
>> - igt_assert(psr_wait_entry(data->debugfs_fd, PSR_MODE_2,
>> NULL));
>> + igt_assert(psr_wait_entry(data->debugfs_fd, data->psr_mode,
>> data->output));
>>
>> if (data->fbc_flag == true && data->op_fbc_mode ==
>> FBC_ENABLED)
>> igt_assert_f(intel_fbc_wait_until_enabled(data-
>>> drm_fd,
>> @@ -952,14 +981,24 @@ static void cleanup(data_t *data)
>> igt_remove_fb(data->drm_fd, &data->fb_test);
>> }
>>
>> -static int check_psr2_support(data_t *data)
>> +static bool check_pr_psr2_sel_fetch_support(data_t *data)
>> {
>> - int status;
>> + bool status = false;
>> + enum psr_mode psr_mode;
>> +
>> + /* Check sink supports PR/PSR2 selective fetch */
>> + psr_mode = get_sel_fetch_mode_for_output(data, data->output);
>> + if (psr_mode == PSR_DISABLED)
>> + return false;
>> +
>> + /* Check if selective fetch can be enabled */
>> + if (!selective_fetch_check(data->debugfs_fd, data->output))
>> + igt_assert("Selective fetch is not enabled even
>> though panel should support it\n");
>>
>> prepare(data);
>> - status = psr_wait_entry(data->debugfs_fd, PSR_MODE_2, NULL);
>> + /* We enter into DEEP_SLEEP for both PSR2 and PR sel fetch */
>> + status = psr_wait_entry(data->debugfs_fd, psr_mode, data-
>>> output);
>> cleanup(data);
>> -
>> return status;
>> }
>>
>> @@ -981,6 +1020,8 @@ pipe_output_combo_valid(igt_display_t *display,
>>
>> igt_main
>> {
>> + bool output_supports_pr_psr2_sel_fetch = false;
>> + bool pr_psr2_sel_fetch_supported = false;
>> data_t data = {};
>> igt_output_t *outputs[IGT_MAX_PIPES * IGT_MAX_PIPES];
>> int i, j, k, y;
>> @@ -1000,11 +1041,6 @@ igt_main
>> data.debugfs_fd = igt_debugfs_dir(data.drm_fd);
>> kmstest_set_vt_graphics_mode();
>>
>> - igt_require_f(psr_sink_support(data.drm_fd,
>> - data.debugfs_fd,
>> PSR_MODE_2,
>> - NULL),
>> - "Sink does not support PSR2\n");
>> -
>> display_init(&data);
>>
>> if
>> ((intel_display_ver(intel_get_drm_devid(data.drm_fd)) >= 20) &&
>> @@ -1023,7 +1059,8 @@ igt_main
>>
>> for_each_pipe_with_valid_output(&data.display,
>> data.pipe, data.output) {
>> coexist_features[n_pipes] = 0;
>> - if (check_psr2_support(&data)) {
>> + output_supports_pr_psr2_sel_fetch =
>> check_pr_psr2_sel_fetch_support(&data);
>> + if (output_supports_pr_psr2_sel_fetch) {
>> pipes[n_pipes] = data.pipe;
>> outputs[n_pipes] = data.output;
>>
>> @@ -1032,7 +1069,10 @@ igt_main
>>
>> n_pipes++;
>> }
>> + pr_psr2_sel_fetch_supported |=
>> output_supports_pr_psr2_sel_fetch;
>> }
>> + igt_require_f(pr_psr2_sel_fetch_supported,
>> + "No output supports
>> selective fetch\n");
>> }
>>
>> for (y = 0; y < ARRAY_SIZE(fbc_status); y++) {
>> @@ -1053,13 +1093,17 @@ igt_main
>> for (j = FEATURE_NONE; j <
>> FEATURE_COUNT; j++) {
>> if (j != FEATURE_NONE &&
>> !(coexist_features[i] & j))
>> continue;
>> - igt_dynamic_f("pipe-%s-%s%s",
>> kmstest_pipe_name(pipes[i]),
>> + igt_dynamic_f("%s-pipe-%s-
>> %s%s", get_psr_mode_str_for_output(&data, outputs[i]),
>> +
>> kmstest_pipe_name(pipes[i]),
>>
>> igt_output_name(outputs[i]),
>>
>> coexist_feature_str(j)) {
>> data.pipe = pipes[i];
>> data.output =
>> outputs[i];
>> data.test_plane_id =
>> DRM_PLANE_TYPE_PRIMARY;
>> data.coexist_feature
>> = j;
>> + data.psr_mode =
>> get_sel_fetch_mode_for_output(&data, data.output);
>> + igt_assert_f(data.psr
>> _mode != PSR_DISABLED,
>> +
>> "Invalid psr mode\n");
>> for (k = 1; k <=
>> MAX_DAMAGE_AREAS; k++) {
>> data.damage_a
>> rea_count = k;
>> prepare(&data
>> );
>> @@ -1086,7 +1130,8 @@ igt_main
>> for (j = FEATURE_NONE; j <
>> FEATURE_COUNT; j++) {
>> if (j != FEATURE_NONE
>> && !(coexist_features[i] & j))
>> continue;
>> - igt_dynamic_f("pipe-
>> %s-%s%s",
>> + igt_dynamic_f("%s-
>> pipe-%s-%s%s",
>> +
>> get_psr_mode_str_for_output(&data, outputs[i]),
>>
>> kmstest_pipe_name(pipes[i]),
>>
>> igt_output_name(outputs[i]),
>>
>> coexist_feature_str(j)) {
>> @@ -1094,6 +1139,9 @@ igt_main
>> data.output =
>> outputs[i];
>> data.test_pla
>> ne_id = DRM_PLANE_TYPE_PRIMARY;
>> data.coexist_
>> feature = j;
>> + data.psr_mode
>> = get_sel_fetch_mode_for_output(&data, data.output);
>> + igt_assert_f(
>> data.psr_mode != PSR_DISABLED,
>> +
>> "Invalid psr mode\n");
>> for (k = 1; k
>> <= MAX_DAMAGE_AREAS; k++) {
>> data.
>> damage_area_count = k;
>> prepa
>> re(&data);
>> @@ -1118,13 +1166,17 @@ igt_main
>> for (j = FEATURE_NONE; j <
>> FEATURE_COUNT; j++) {
>> if (j != FEATURE_NONE &&
>> !(coexist_features[i] & j))
>> continue;
>> - igt_dynamic_f("pipe-%s-%s%s",
>> kmstest_pipe_name(pipes[i]),
>> + igt_dynamic_f("%s-pipe-%s-
>> %s%s", get_psr_mode_str_for_output(&data, outputs[i]),
>> +
>> kmstest_pipe_name(pipes[i]),
>>
>> igt_output_name(outputs[i]),
>>
>> coexist_feature_str(j)) {
>> data.pipe = pipes[i];
>> data.output =
>> outputs[i];
>> data.test_plane_id =
>> DRM_PLANE_TYPE_OVERLAY;
>> data.coexist_feature
>> = j;
>> + data.psr_mode =
>> get_sel_fetch_mode_for_output(&data, data.output);
>> + igt_assert_f(data.psr
>> _mode != PSR_DISABLED,
>> +
>> "Invalid psr mode\n");
>> for (k = 1; k <=
>> MAX_DAMAGE_AREAS; k++) {
>> data.damage_a
>> rea_count = k;
>> prepare(&data
>> );
>> @@ -1148,13 +1200,17 @@ igt_main
>> for (j = FEATURE_NONE; j <
>> FEATURE_COUNT; j++) {
>> if (j != FEATURE_NONE &&
>> !(coexist_features[i] & j))
>> continue;
>> - igt_dynamic_f("pipe-%s-%s%s",
>> kmstest_pipe_name(pipes[i]),
>> + igt_dynamic_f("%s-pipe-%s-
>> %s%s", get_psr_mode_str_for_output(&data, outputs[i]),
>> +
>> kmstest_pipe_name(pipes[i]),
>>
>> igt_output_name(outputs[i]),
>>
>> coexist_feature_str(j)) {
>> data.pipe = pipes[i];
>> data.output =
>> outputs[i];
>> data.test_plane_id =
>> DRM_PLANE_TYPE_CURSOR;
>> data.coexist_feature
>> = j;
>> + data.psr_mode =
>> get_sel_fetch_mode_for_output(&data, data.output);
>> + igt_assert_f(data.psr
>> _mode != PSR_DISABLED,
>> +
>> "Invalid psr mode\n");
>> prepare(&data);
>> run(&data);
>> cleanup(&data);
>> @@ -1174,13 +1230,17 @@ igt_main
>> for (j = FEATURE_NONE; j <
>> FEATURE_COUNT; j++) {
>> if (j != FEATURE_NONE &&
>> !(coexist_features[i] & j))
>> continue;
>> - igt_dynamic_f("pipe-%s-%s%s",
>> kmstest_pipe_name(pipes[i]),
>> + igt_dynamic_f("%s-pipe-%s-
>> %s%s", get_psr_mode_str_for_output(&data, outputs[i]),
>> +
>> kmstest_pipe_name(pipes[i]),
>>
>> igt_output_name(outputs[i]),
>>
>> coexist_feature_str(j)) {
>> data.pipe = pipes[i];
>> data.output =
>> outputs[i];
>> data.test_plane_id =
>> DRM_PLANE_TYPE_CURSOR;
>> data.coexist_feature
>> = j;
>> + data.psr_mode =
>> get_sel_fetch_mode_for_output(&data, data.output);
>> + igt_assert_f(data.psr
>> _mode != PSR_DISABLED,
>> +
>> "Invalid psr mode\n");
>> prepare(&data);
>> run(&data);
>> cleanup(&data);
>> @@ -1201,13 +1261,17 @@ igt_main
>> for (j = FEATURE_NONE; j <
>> FEATURE_COUNT; j++) {
>> if (j != FEATURE_NONE &&
>> !(coexist_features[i] & j))
>> continue;
>> - igt_dynamic_f("pipe-%s-%s%s",
>> kmstest_pipe_name(pipes[i]),
>> + igt_dynamic_f("%s-pipe-%s-
>> %s%s", get_psr_mode_str_for_output(&data, outputs[i]),
>> +
>> kmstest_pipe_name(pipes[i]),
>>
>> igt_output_name(outputs[i]),
>>
>> coexist_feature_str(j)) {
>> data.pipe = pipes[i];
>> data.output =
>> outputs[i];
>> data.test_plane_id =
>> DRM_PLANE_TYPE_CURSOR;
>> data.coexist_feature
>> = j;
>> + data.psr_mode =
>> get_sel_fetch_mode_for_output(&data, data.output);
>> + igt_assert_f(data.psr
>> _mode != PSR_DISABLED,
>> +
>> "Invalid psr mode\n");
>> prepare(&data);
>> run(&data);
>> cleanup(&data);
>> @@ -1228,13 +1292,17 @@ igt_main
>> for (j = FEATURE_NONE; j <
>> FEATURE_COUNT; j++) {
>> if (j != FEATURE_NONE &&
>> !(coexist_features[i] & j))
>> continue;
>> - igt_dynamic_f("pipe-%s-%s%s",
>> kmstest_pipe_name(pipes[i]),
>> + igt_dynamic_f("%s-pipe-%s-
>> %s%s", get_psr_mode_str_for_output(&data, outputs[i]),
>> +
>> kmstest_pipe_name(pipes[i]),
>>
>> igt_output_name(outputs[i]),
>>
>> coexist_feature_str(j)) {
>> data.pipe = pipes[i];
>> data.output =
>> outputs[i];
>> data.test_plane_id =
>> DRM_PLANE_TYPE_CURSOR;
>> data.coexist_feature
>> = j;
>> + data.psr_mode =
>> get_sel_fetch_mode_for_output(&data, data.output);
>> + igt_assert_f(data.psr
>> _mode != PSR_DISABLED,
>> +
>> "Invalid psr mode\n");
>> prepare(&data);
>> run(&data);
>> cleanup(&data);
>> @@ -1256,13 +1324,18 @@ igt_main
>> for (j = FEATURE_NONE; j <
>> FEATURE_COUNT; j++) {
>> if (j != FEATURE_NONE &&
>> !(coexist_features[i] & j))
>> continue;
>> - igt_dynamic_f("pipe-%s-%s%s",
>> kmstest_pipe_name(pipes[i]),
>> + igt_dynamic_f("%s-pipe-%s-
>> %s%s",
>> +
>> get_psr_mode_str_for_output(&data, outputs[i]),
>> +
>> kmstest_pipe_name(pipes[i]),
>>
>> igt_output_name(outputs[i]),
>>
>> coexist_feature_str(j)) {
>> data.pipe = pipes[i];
>> data.output =
>> outputs[i];
>> data.test_plane_id =
>> DRM_PLANE_TYPE_OVERLAY;
>> data.coexist_feature
>> = j;
>> + data.psr_mode =
>> get_sel_fetch_mode_for_output(&data, data.output);
>> + igt_assert_f(data.psr
>> _mode != PSR_DISABLED,
>> +
>> "Invalid psr mode\n");
>> for (k =
>> POS_TOP_LEFT; k <= POS_BOTTOM_RIGHT ; k++) {
>> data.pos = k;
>> prepare(&data
>> );
>> @@ -1285,13 +1358,17 @@ igt_main
>> for (j = FEATURE_NONE; j <
>> FEATURE_COUNT; j++) {
>> if (j != FEATURE_NONE &&
>> !(coexist_features[i] & j))
>> continue;
>> - igt_dynamic_f("pipe-%s-%s%s",
>> kmstest_pipe_name(pipes[i]),
>> + igt_dynamic_f("%s-pipe-%s-
>> %s%s", get_psr_mode_str_for_output(&data, outputs[i]),
>> +
>> kmstest_pipe_name(pipes[i]),
>>
>> igt_output_name(outputs[i]),
>>
>> coexist_feature_str(j)) {
>> data.pipe = pipes[i];
>> data.output = outputs[i];
>> data.test_plane_id =
>> DRM_PLANE_TYPE_OVERLAY;
>> data.coexist_feature = j;
>> + data.psr_mode =
>> get_sel_fetch_mode_for_output(&data, data.output);
>> + igt_assert_f(data.psr_mode !=
>> PSR_DISABLED,
>> +
>> "Invalid psr mode\n");
>> prepare(&data);
>> run(&data);
>> cleanup(&data);
>> @@ -1312,13 +1389,17 @@ igt_main
>> for (j = FEATURE_NONE; j <
>> FEATURE_COUNT; j++) {
>> if (j != FEATURE_NONE &&
>> !(coexist_features[i] & j))
>> continue;
>> - igt_dynamic_f("pipe-%s-%s%s",
>> kmstest_pipe_name(pipes[i]),
>> + igt_dynamic_f("%s-pipe-%s-
>> %s%s", get_psr_mode_str_for_output(&data, outputs[i]),
>> +
>> kmstest_pipe_name(pipes[i]),
>>
>> igt_output_name(outputs[i]),
>>
>> coexist_feature_str(j)) {
>> data.pipe = pipes[i];
>> data.output =
>> outputs[i];
>> data.test_plane_id =
>> DRM_PLANE_TYPE_OVERLAY;
>> data.coexist_feature
>> = j;
>> + data.psr_mode =
>> get_sel_fetch_mode_for_output(&data, data.output);
>> + igt_assert_f(data.psr
>> _mode != PSR_DISABLED,
>> +
>> "Invalid psr mode\n");
>> prepare(&data);
>> run(&data);
>> cleanup(&data);
>> @@ -1339,13 +1420,17 @@ igt_main
>> for (j = FEATURE_NONE; j <
>> FEATURE_COUNT; j++) {
>> if (j != FEATURE_NONE &&
>> !(coexist_features[i] & j))
>> continue;
>> - igt_dynamic_f("pipe-%s-%s%s",
>> kmstest_pipe_name(pipes[i]),
>> + igt_dynamic_f("%s-pipe-%s-
>> %s%s", get_psr_mode_str_for_output(&data, outputs[i]),
>> +
>> kmstest_pipe_name(pipes[i]),
>>
>> igt_output_name(outputs[i]),
>>
>> coexist_feature_str(j)) {
>> data.pipe = pipes[i];
>> data.output =
>> outputs[i];
>> data.test_plane_id =
>> DRM_PLANE_TYPE_OVERLAY;
>> data.coexist_feature
>> = j;
>> + data.psr_mode =
>> get_sel_fetch_mode_for_output(&data, data.output);
>> + igt_assert_f(data.psr
>> _mode != PSR_DISABLED,
>> +
>> "Invalid psr mode\n");
>> prepare(&data);
>> run(&data);
>> cleanup(&data);
>> @@ -1367,7 +1452,8 @@ igt_main
>> for (j = FEATURE_NONE; j <
>> FEATURE_COUNT; j++) {
>> if (j != FEATURE_NONE &&
>> !(coexist_features[i] & j))
>> continue;
>> - igt_dynamic_f("pipe-%s-%s%s",
>> kmstest_pipe_name(pipes[i]),
>> + igt_dynamic_f("%s-pipe-%s-
>> %s%s", kmstest_pipe_name(pipes[i]),
>> +
>> get_psr_mode_str_for_output(&data, outputs[i]),
>>
>> igt_output_name(outputs[i]),
>>
>> coexist_feature_str(j)) {
>> data.pipe = pipes[i];
>> @@ -1376,6 +1462,9 @@ igt_main
>> data.damage_a
>> rea_count = k;
>> data.test_pla
>> ne_id = DRM_PLANE_TYPE_PRIMARY;
>> data.coexist_
>> feature = j;
>> + data.psr_mode
>> = get_sel_fetch_mode_for_output(&data, data.output);
>> + igt_assert_f(
>> data.psr_mode != PSR_DISABLED,
>> +
>> "Invalid psr mode\n");
>> prepare(&data
>> );
>> run(&data);
>> cleanup(&data
>> );
>> @@ -1400,7 +1489,8 @@ igt_main
>> for (j = FEATURE_NONE; j <
>> FEATURE_COUNT; j++) {
>> if (j != FEATURE_NONE &&
>> !(coexist_features[i] & j))
>> continue;
>> - igt_dynamic_f("pipe-%s-%s%s",
>> kmstest_pipe_name(pipes[i]),
>> + igt_dynamic_f("%s-pipe-%s-
>> %s%s", get_psr_mode_str_for_output(&data, outputs[i]),
>> +
>> kmstest_pipe_name(pipes[i]),
>>
>> igt_output_name(outputs[i]),
>>
>> coexist_feature_str(j)) {
>> data.pipe = pipes[i];
>> @@ -1412,6 +1502,9 @@ igt_main
>> data.primary_
>> format = DRM_FORMAT_NV12;
>> data.test_plane_id =
>> DRM_PLANE_TYPE_OVERLAY;
>> data.coexist_feature
>> = j;
>> + data.psr_mode =
>> get_sel_fetch_mode_for_output(&data, data.output);
>> + igt_assert_f(data.psr
>> _mode != PSR_DISABLED,
>> +
>> "Invalid psr mode\n");
>> prepare(&data);
>> run(&data);
>> cleanup(&data);
Regards
Kunal Joshi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/igt-dev/attachments/20240219/6b767a48/attachment-0001.htm>
More information about the igt-dev
mailing list