All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Modem, Bhanuprakash" <bhanuprakash.modem@intel.com>
To: Swati Sharma <swati2.sharma@intel.com>, <igt-dev@lists.freedesktop.org>
Cc: Patnana Venkata Sai <venkata.sai.patnana@intel.com>
Subject: Re: [igt-dev] [PATCH i-g-t v4] tests/i915/kms_dsc: IGT cleanup
Date: Thu, 19 May 2022 11:55:47 +0530	[thread overview]
Message-ID: <4550db20-a85d-4ff6-5097-061e43ea185a@intel.com> (raw)
In-Reply-To: <20220519053210.14201-1-swati2.sharma@intel.com>

Hi Swati,

Overall, this patch looks good to me. I have dropped few minor comments 
to be addressed inline.

On Thu-19-05-2022 11:02 am, Swati Sharma wrote:
> Remove redundant code and before starting the subtest,
> clean up the states to default by igt_display_reset().
> Few minor fixes in indentation. Added subtests description.
> 
> v2: -minor mistake in subtest name
>      -commit was missing after reset, added
> v3: -fixed styling error
>      -replaced drm calls with igt wrappers
> v4: -added igt_display_require_output() in igt_fixture
>      -modularized code, added func() for checks
>      -added func() to get highest mode
> 
> Signed-off-by: Patnana Venkata Sai <venkata.sai.patnana@intel.com>
> Signed-off-by: Swati Sharma <swati2.sharma@intel.com>
> ---
>   lib/igt_kms.c        |   1 -
>   tests/i915/kms_dsc.c | 263 +++++++++++++++++++++++--------------------
>   2 files changed, 139 insertions(+), 125 deletions(-)
> 
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index 7838ff28..50a965ad 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -5304,7 +5304,6 @@ bool igt_is_dsc_supported(int drmfd, drmModeConnector *connector)
>    */
>   bool igt_is_fec_supported(int drmfd, drmModeConnector *connector)
>   {
> -
>   	return check_dsc_debugfs(drmfd, connector, "FEC_Sink_Support: yes");
>   }
>   
> diff --git a/tests/i915/kms_dsc.c b/tests/i915/kms_dsc.c
> index 22d2216e..3adca600 100644
> --- a/tests/i915/kms_dsc.c
> +++ b/tests/i915/kms_dsc.c
> @@ -44,13 +44,16 @@
>   #include <fcntl.h>
>   #include <termios.h>
>   
> -/* currently dsc compression is verifying on 8bpc frame only */
> +IGT_TEST_DESCRIPTION("Test to validate display stream compression");
> +
> +#define HDISPLAY_5K	5120
> +
> +/* currently dsc is verifed on 8bpc frame only */
>   #define XRGB8888_DRM_FORMAT_MIN_BPP 8
>   
> -enum dsc_test_type
> -{
> -	test_basic_dsc_enable,
> -	test_dsc_compression_bpp
> +enum dsc_test_type {
> +	TEST_BASIC_DSC_ENABLE,
> +	TEST_DSC_COMPRESSION_BPP
>   };
>   
>   typedef struct {
> @@ -59,9 +62,6 @@ typedef struct {
>   	igt_display_t display;
>   	struct igt_fb fb_test_pattern;
>   	igt_output_t *output;
> -	int mode_valid;
> -	drmModeEncoder *encoder;
> -	int crtc;
>   	int compression_bpp;
>   	int n_pipes;
>   	enum pipe pipe;
> @@ -80,9 +80,9 @@ static void force_dsc_enable(data_t *data)
>   {
>   	int ret;
>   
> -	igt_debug ("Forcing DSC enable on %s\n", data->conn_name);
> +	igt_debug("Forcing DSC enable on %s\n", data->conn_name);
>   	ret = igt_force_dsc_enable(data->drm_fd,
> -				      data->output->config.connector);
> +				   data->output->config.connector);
>   	igt_assert_f(ret > 0, "debugfs_write failed");
>   }
>   
> @@ -93,8 +93,8 @@ static void force_dsc_enable_bpp(data_t *data)
>   	igt_debug("Forcing DSC BPP to %d on %s\n",
>   		  data->compression_bpp, data->conn_name);
>   	ret = igt_force_dsc_enable_bpp(data->drm_fd,
> -					  data->output->config.connector,
> -					  data->compression_bpp);
> +				       data->output->config.connector,
> +				       data->compression_bpp);
>   	igt_assert_f(ret > 0, "debugfs_write failed");
>   }
>   
> @@ -105,7 +105,7 @@ static void save_force_dsc_en(data_t *data)
>   					 data->output->config.connector);
>   	force_dsc_restore_fd =
>   		igt_get_dsc_debugfs_fd(data->drm_fd,
> -					  data->output->config.connector);
> +				       data->output->config.connector);
>   	igt_assert(force_dsc_restore_fd >= 0);
>   }
>   
> @@ -121,19 +121,6 @@ static void restore_force_dsc_en(void)
>   	force_dsc_restore_fd = -1;
>   }
>   
> -static void test_cleanup(data_t *data)
> -{
> -	igt_plane_t *primary;
> -
> -	if (data->output) {
> -		primary = igt_output_get_plane_type(data->output,
> -						    DRM_PLANE_TYPE_PRIMARY);
> -		igt_plane_set_fb(primary, NULL);
> -		igt_output_set_pipe(data->output, PIPE_NONE);
> -		igt_display_commit(&data->display);
> -	}
> -}
> -
>   static void kms_dsc_exit_handler(int sig)
>   {
>   	restore_force_dsc_en();
> @@ -159,29 +146,26 @@ static int sort_drm_modes(const void *a, const void *b)
>   	return (mode1->clock < mode2->clock) - (mode2->clock < mode1->clock);
>   }
>   
> -static bool check_dsc_on_connector(data_t *data, uint32_t drmConnector)
> +static drmModeModeInfo *get_highres_mode(drmModeConnector *connector)
>   {
> -	drmModeConnector *connector;
> -	igt_output_t *output;
> -
> -	connector = drmModeGetConnectorCurrent(data->drm_fd,
> -					       drmConnector);
> -	if (connector->connection != DRM_MODE_CONNECTED)
> -		return false;
> -
> -	output = igt_output_from_connector(&data->display, connector);
> +	drmModeModeInfo *highest_mode = NULL;
>   
> -	/*
> -	 * As dsc supports >= 5k modes, we need to suppress lower
> -	 * resolutions.
> -	 */
> -	qsort(output->config.connector->modes,
> -	      output->config.connector->count_modes,
> +	qsort(connector->modes,
> +	      connector->count_modes,
>   	      sizeof(drmModeModeInfo),
>   	      sort_drm_modes);
> -	if (output->config.connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort &&
> -	    output->config.connector->modes[0].hdisplay < 5120)
> -		return NULL;
> +
> +	highest_mode = &connector->modes[0];
> +
> +	return highest_mode;
> +}
> +
> +static bool check_dsc_on_connector(data_t *data, igt_output_t *output)
> +{
> +	drmModeConnector *connector = output->config.connector;
> +
> +	if (connector->connection != DRM_MODE_CONNECTED)
> +		return false;

This check is redundant, for_each_pipe_with_valid_output() is already 
doing this check.

>   
>   	sprintf(data->conn_name, "%s-%d",

Please drop data->conn_name, instead please use data->output->name;

>   		kmstest_connector_type_str(connector->connector_type),
> @@ -192,168 +176,199 @@ static bool check_dsc_on_connector(data_t *data, uint32_t drmConnector)
>   			  data->conn_name);
>   		return false;
>   	}
> +
>   	if (is_external_panel(connector) &&
>   	    !igt_is_fec_supported(data->drm_fd, connector)) {
>   		igt_debug("DSC cannot be enabled without FEC on %s\n",
>   			  data->conn_name);
>   		return false;
>   	}
> +
>   	data->output = output;

This could be moved to test_dsc()

>   	return true;
>   }
>   
> -/*
> - * Re-probe connectors and do a modeset with DSC
> - *
> - */
> -static void update_display(data_t *data, enum dsc_test_type test_type)
> +static bool check_big_joiner_test_constraint(data_t *data, igt_output_t *output,
> +					     enum dsc_test_type test_type)
> +{
> +	drmModeConnector *connector = output->config.connector;
> +	drmModeModeInfo *mode = get_highres_mode(connector);
> +
> +	if (test_type == TEST_DSC_COMPRESSION_BPP &&
> +	    mode->hdisplay >= HDISPLAY_5K) {
> +		igt_debug("Bigjoiner does not support force bpp\n");
> +		return false;
> +	}
> +
> +	return true;
> +}
> +
> +static bool check_big_joiner_pipe_constraint(data_t *data, igt_output_t *output,
> +					     enum pipe pipe)
> +{
> +	drmModeConnector *connector = output->config.connector;
> +	drmModeModeInfo *mode = get_highres_mode(connector);
> +
> +	if (mode->hdisplay >= HDISPLAY_5K &&
> +	    pipe == (data->n_pipes - 1 )) {
> +		igt_debug("pipe-%s not supported due to bigjoiner limitation\n",
> +			   kmstest_pipe_name(pipe));
> +		return false;
> +	}
> +
> +	return true;
> +}
> +
> +static bool check_dp_gen11_constraint(data_t *data, igt_output_t *output, enum pipe pipe)
> +{
> +	uint32_t devid = intel_get_drm_devid(data->drm_fd);
> +	drmModeConnector *connector = output->config.connector;
> +
> +	if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) &&
> +	    (pipe == PIPE_A) && IS_GEN11(devid)) {
> +		igt_debug("DSC not supported on pipe A on external DP in gen11 platforms\n");
> +		return false;
> +	}
> +
> +	return true;
> +}
> +/* re-probe connectors and do a modeset with DSC */
> +static void update_display(data_t *data, igt_output_t *output, enum pipe pipe,
> +			   enum dsc_test_type test_type)
>   {
>   	bool enabled;
>   	igt_plane_t *primary;
> +	drmModeModeInfo *mode;
> +	igt_display_t *display = &data->display;
> +	drmModeConnector *connector = data->output->config.connector;
>   
> -	/* Disable the output first */
> -	igt_output_set_pipe(data->output, PIPE_NONE);
> -	igt_display_commit(&data->display);
> +	/* sanitize the state before starting the subtest. */
> +	igt_display_reset(display);
> +	igt_display_commit(display);
>   
>   	igt_debug("DSC is supported on %s\n", data->conn_name);
>   	save_force_dsc_en(data);
>   	force_dsc_enable(data);
> -	if (test_type == test_dsc_compression_bpp) {
> +
> +	if (test_type == TEST_DSC_COMPRESSION_BPP) {
>   		igt_debug("Trying to set BPP to %d\n", data->compression_bpp);
>   		force_dsc_enable_bpp(data);
>   	}
>   
> -	igt_output_set_pipe(data->output, data->pipe);
> -	qsort(data->output->config.connector->modes,
> -			data->output->config.connector->count_modes,
> -			sizeof(drmModeModeInfo),
> -			sort_drm_modes);
> -	igt_output_override_mode(data->output, &data->output->config.connector->modes[0]);
> +	igt_output_set_pipe(data->output, pipe);
> +
> +	mode = get_highres_mode(connector);
> +	igt_require(mode != NULL);
> +	igt_output_override_mode(data->output, mode);
> +
>   	primary = igt_output_get_plane_type(data->output,
>   					    DRM_PLANE_TYPE_PRIMARY);
> +	igt_create_pattern_fb(data->drm_fd,
> +			      mode->hdisplay,
> +			      mode->vdisplay,
> +			      DRM_FORMAT_XRGB8888,
> +			      DRM_FORMAT_MOD_LINEAR,
> +			      &data->fb_test_pattern);
>   
> -	/* Now set the output to the desired mode */
>   	igt_plane_set_fb(primary, &data->fb_test_pattern);
>   	igt_display_commit(&data->display);
>   
>   	/*
> -	 * Until we have CRC check support, manually check if RGB test
> +	 * until we have CRC check support, manually check if RGB test
>   	 * pattern has no corruption.
>   	 */
>   	manual("RGB test pattern without corruption");
>   
> -	enabled = igt_is_dsc_enabled(data->drm_fd,
> -					data->output->config.connector);
> +	enabled = igt_is_dsc_enabled(data->drm_fd, connector);
>   	restore_force_dsc_en();
>   	igt_debug("Reset compression BPP\n");
>   	data->compression_bpp = 0;
>   	force_dsc_enable_bpp(data);
>   
>   	igt_assert_f(enabled,
> -		     "Default DSC enable failed on Connector: %s Pipe: %s\n",
> +		     "Default DSC enable failed on connector: %s pipe: %s\n",
>   		     data->conn_name,
> -		     kmstest_pipe_name(data->pipe));
> +		     kmstest_pipe_name(pipe));
> +
> +	igt_remove_fb(data->drm_fd, &data->fb_test_pattern);
> +	igt_plane_set_fb(primary, NULL);
> +	igt_output_set_pipe(data->output, PIPE_NONE);

Please do commit here.

>   }
>   
> -static void run_test(data_t *data, enum dsc_test_type test_type)
> +static void test_dsc(data_t *data, enum dsc_test_type test_type)
>   {
> +	igt_display_t *display = &data->display;
> +	igt_output_t *output;
>   	enum pipe pipe;
>   	char test_name[10];
>   
> -	igt_skip_on_f(test_type == test_dsc_compression_bpp &&
> -		      data->output->config.connector->modes[0].hdisplay >= 5120,
> -		      "bigjoiner does not support force bpp\n");
> -
> -	igt_create_pattern_fb(data->drm_fd,
> -			      data->output->config.connector->modes[0].hdisplay,
> -			      data->output->config.connector->modes[0].vdisplay,
> -			      DRM_FORMAT_XRGB8888,
> -			      DRM_FORMAT_MOD_LINEAR,
> -			      &data->fb_test_pattern);
> +	for_each_pipe_with_valid_output(display, pipe, output) {
> +		if (!check_dsc_on_connector(data, output))
> +			continue;
>   
> -	for_each_pipe(&data->display, pipe) {
> -		uint32_t devid = intel_get_drm_devid(data->drm_fd);
> +		if (!check_big_joiner_test_constraint(data, output, test_type))
> +			continue;
>   
> -		if (data->output->config.connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort &&
> -		    pipe == PIPE_A && IS_GEN11(devid)) {
> -			igt_debug("DSC not supported on Pipe A on external DP in Gen11 platforms\n");
> +		if (!check_dp_gen11_constraint(data, output, pipe))
>   			continue;
> -		}
>   
> -		snprintf(test_name, sizeof(test_name), "-%dbpp", data->compression_bpp);
> -		if (!igt_pipe_connector_valid(pipe, data->output))
> +		if (!check_big_joiner_pipe_constraint(data, output, pipe))
>   			continue;
>   
> -		igt_dynamic_f("%s-pipe-%s%s", data->output->name,
> -			      kmstest_pipe_name(pipe),
> -			      (test_type == test_dsc_compression_bpp) ?
> -			      test_name : "") {
> -			data->pipe = pipe;
> -			igt_skip_on_f((data->output->config.connector->modes[0].hdisplay >= 5120) &&
> -				      (pipe  == (data->n_pipes - 1)),
> -				      "pipe-%s not supported due to bigjoiner limitation\n",
> -				      kmstest_pipe_name(pipe));
> -			update_display(data, test_type);
> +		if (!igt_pipe_connector_valid(pipe, output))
> +			continue;

This check is redundant, for_each_pipe_with_valid_output() is already 
taken care of this check.

>   
> -		}
> -		if (test_type == test_dsc_compression_bpp)
> -			break;
> +		snprintf(test_name, sizeof(test_name), "-%dbpp", data->compression_bpp);
> +		igt_dynamic_f("pipe-%s-%s%s",  kmstest_pipe_name(pipe), output->name,
> +			     (test_type == TEST_DSC_COMPRESSION_BPP) ? test_name : "")
> +		      update_display(data, output, pipe, test_type);
>   	}
> -
> -	igt_remove_fb(data->drm_fd, &data->fb_test_pattern);
>   }
>   
>   igt_main
>   {
>   	data_t data = {};
> -	drmModeRes *res;
> -	drmModeConnector *connector = NULL;
> -	int i, j;
> +	int i;
> +
>   	igt_fixture {
>   		data.drm_fd = drm_open_driver_master(DRIVER_INTEL);
>   		data.devid = intel_get_drm_devid(data.drm_fd);
>   		kmstest_set_vt_graphics_mode();
>   		igt_install_exit_handler(kms_dsc_exit_handler);
>   		igt_display_require(&data.display, data.drm_fd);
> -		igt_require(res = drmModeGetResources(data.drm_fd));
> +		igt_display_require_output(&data.display);
>   		data.n_pipes = 0;
>   		for_each_pipe(&data.display, i)
>   			data.n_pipes++;
>   	}
> -	igt_subtest_with_dynamic("basic-dsc-enable") {
> -		for (j = 0; j < res->count_connectors; j++) {
> -			if (!check_dsc_on_connector(&data, res->connectors[j]))
> -				continue;
> -			run_test(&data, test_basic_dsc_enable);
> -		}
> -	}
> +
> +	igt_describe("Tests basic display stream compression functionality if supported "
> +		     "by a connector by forcing DSC on all connectors that support it "
> +		     "with default parameters");
> +	igt_subtest_with_dynamic("basic-dsc-enable")
> +			test_dsc(&data, TEST_BASIC_DSC_ENABLE);
> +
>   	/* currently we are validating compression bpp on XRGB8888 format only */
> +	igt_describe("Tests basic display stream compression functionality if supported "
> +		     "by a connector by forcing DSC on all connectors that support it "
> +		     "with certain BPP as the output BPP for the connector");
>   	igt_subtest_with_dynamic("XRGB8888-dsc-compression") {
>   		uint32_t bpp_list[] = {
>   			XRGB8888_DRM_FORMAT_MIN_BPP,
>   			(XRGB8888_DRM_FORMAT_MIN_BPP  +
> -			 (XRGB8888_DRM_FORMAT_MIN_BPP * 3) - 1) / 2,
> +			(XRGB8888_DRM_FORMAT_MIN_BPP * 3) - 1) / 2,
>   			(XRGB8888_DRM_FORMAT_MIN_BPP * 3) - 1
>   		};
>   
>   		igt_require(intel_display_ver(data.devid) >= 13);

This check can be in igt_fixture?

- Bhanu

>   
> -		for (j = 0; j < res->count_connectors; j++) {
> -			if (!check_dsc_on_connector(&data, res->connectors[j]))
> -				continue;
> -
> -			for (i = 0; i < ARRAY_SIZE(bpp_list); i++) {
> -				data.compression_bpp = bpp_list[i];
> -				run_test(&data, test_dsc_compression_bpp);
> -			}
> +		for (int j = 0; j < ARRAY_SIZE(bpp_list); j++) {
> +			data.compression_bpp = bpp_list[j];
> +			test_dsc(&data, TEST_DSC_COMPRESSION_BPP);
>   		}
>   	}
>   
>   	igt_fixture {
> -		if (connector)
> -			drmModeFreeConnector(connector);
> -		test_cleanup(&data);
> -		drmModeFreeResources(res);
>   		igt_display_fini(&data.display);
>   		close(data.drm_fd);
>   	}

  parent reply	other threads:[~2022-05-19  6:26 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-19  5:32 [igt-dev] [PATCH i-g-t v4] tests/i915/kms_dsc: IGT cleanup Swati Sharma
2022-05-19  6:17 ` [igt-dev] ✓ Fi.CI.BAT: success for tests/i915/kms_dsc: IGT cleanup (rev4) Patchwork
2022-05-19  6:25 ` Modem, Bhanuprakash [this message]
2022-05-24 16:44   ` [igt-dev] [PATCH i-g-t v4] tests/i915/kms_dsc: IGT cleanup Sharma, Swati2
2022-05-25  5:17     ` Modem, Bhanuprakash
2022-05-19  7:08 ` [igt-dev] ✓ Fi.CI.IGT: success for tests/i915/kms_dsc: IGT cleanup (rev4) Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4550db20-a85d-4ff6-5097-061e43ea185a@intel.com \
    --to=bhanuprakash.modem@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=swati2.sharma@intel.com \
    --cc=venkata.sai.patnana@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.