All of lore.kernel.org
 help / color / mirror / Atom feed
* [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight
@ 2022-09-26  3:13 Nidhi Gupta
  2022-09-26  3:50 ` [igt-dev] ✗ Fi.CI.BUILD: failure for tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight (rev3) Patchwork
                   ` (3 more replies)
  0 siblings, 4 replies; 15+ messages in thread
From: Nidhi Gupta @ 2022-09-26  3:13 UTC (permalink / raw)
  To: igt-dev; +Cc: Nidhi Gupta

Since driver can now support multiple eDPs and Debugfs structure for
backlight changed per connector the test should then iterate through
all eDP connectors.

Signed-off-by: Nidhi Gupta <nidhi1.gupta@intel.com>
---
 tests/i915/i915_pm_backlight.c | 70 +++++++++++++++++++---------------
 1 file changed, 39 insertions(+), 31 deletions(-)

diff --git a/tests/i915/i915_pm_backlight.c b/tests/i915/i915_pm_backlight.c
index cafae7f7..1532193b 100644
--- a/tests/i915/i915_pm_backlight.c
+++ b/tests/i915/i915_pm_backlight.c
@@ -37,25 +37,26 @@
 
 struct context {
 	int max;
+	const char *path;
 };
 
 
 #define TOLERANCE 5 /* percent */
-#define BACKLIGHT_PATH "/sys/class/backlight/intel_backlight"
+#define BACKLIGHT_PATH "/sys/class/backlight"
 
 #define FADESTEPS 10
 #define FADESPEED 100 /* milliseconds between steps */
 
 IGT_TEST_DESCRIPTION("Basic backlight sysfs test");
 
-static int backlight_read(int *result, const char *fname)
+static int backlight_read(int *result, const char *fname, struct context *context)
 {
 	int fd;
 	char full[PATH_MAX];
 	char dst[64];
 	int r, e;
 
-	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
+	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
 
 	fd = open(full, O_RDONLY);
 	if (fd == -1)
@@ -73,14 +74,14 @@ static int backlight_read(int *result, const char *fname)
 	return errno;
 }
 
-static int backlight_write(int value, const char *fname)
+static int backlight_write(int value, const char *fname, struct context *context)
 {
 	int fd;
 	char full[PATH_MAX];
 	char src[64];
 	int len;
 
-	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
+	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
 	fd = open(full, O_WRONLY);
 	if (fd == -1)
 		return -errno;
@@ -100,12 +101,12 @@ static void test_and_verify(struct context *context, int val)
 	const int tolerance = val * TOLERANCE / 100;
 	int result;
 
-	igt_assert_eq(backlight_write(val, "brightness"), 0);
-	igt_assert_eq(backlight_read(&result, "brightness"), 0);
+	igt_assert_eq(backlight_write(val, "brightness", context), 0);
+	igt_assert_eq(backlight_read(&result, "brightness", context), 0);
 	/* Check that the exact value sticks */
 	igt_assert_eq(result, val);
 
-	igt_assert_eq(backlight_read(&result, "actual_brightness"), 0);
+	igt_assert_eq(backlight_read(&result, "actual_brightness", context), 0);
 	/* Some rounding may happen depending on hw */
 	igt_assert_f(result >= max(0, val - tolerance) &&
 		     result <= min(context->max, val + tolerance),
@@ -124,16 +125,16 @@ static void test_bad_brightness(struct context *context)
 {
 	int val;
 	/* First write some sane value */
-	backlight_write(context->max / 2, "brightness");
+	backlight_write(context->max / 2, "brightness", context);
 	/* Writing invalid values should fail and not change the value */
-	igt_assert_lt(backlight_write(-1, "brightness"), 0);
-	backlight_read(&val, "brightness");
+	igt_assert_lt(backlight_write(-1, "brightness", context), 0);
+	backlight_read(&val, "brightness", context);
 	igt_assert_eq(val, context->max / 2);
-	igt_assert_lt(backlight_write(context->max + 1, "brightness"), 0);
-	backlight_read(&val, "brightness");
+	igt_assert_lt(backlight_write(context->max + 1, "brightness", context), 0);
+	backlight_read(&val, "brightness", context);
 	igt_assert_eq(val, context->max / 2);
-	igt_assert_lt(backlight_write(INT_MAX, "brightness"), 0);
-	backlight_read(&val, "brightness");
+	igt_assert_lt(backlight_write(INT_MAX, "brightness", context), 0);
+	backlight_read(&val, "brightness", context);
 	igt_assert_eq(val, context->max / 2);
 }
 
@@ -186,6 +187,7 @@ igt_main
 	igt_display_t display;
 	igt_output_t *output;
 	struct igt_fb fb;
+	char paths[][50] = { "intel_backlight", "card0-eDP-2-backlight" };
 
 	igt_fixture {
 		enum pipe pipe;
@@ -203,11 +205,14 @@ igt_main
 		igt_display_require(&display, drm_open_driver(DRIVER_INTEL));
 
 		/* Get the max value and skip the whole test if sysfs interface not available */
-		igt_skip_on(backlight_read(&old, "brightness"));
-		igt_assert(backlight_read(&context.max, "max_brightness") > -1);
+		for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) {
+			context.path = paths[i];
+			igt_skip_on(backlight_read(&old, "brightness", &context));
+			igt_assert(backlight_read(&context.max, "max_brightness", &context) > -1);
+		}
 
 		/* should be ../../cardX-$output */
-		igt_assert_lt(12, readlink(BACKLIGHT_PATH "/device", full_name, sizeof(full_name) - 1));
+		igt_assert_lt(12, readlink(BACKLIGHT_PATH "/intel_backlight/device", full_name, sizeof(full_name) - 1));
 		name = basename(full_name);
 
 		for_each_pipe_with_valid_output(&display, pipe, output) {
@@ -234,22 +239,25 @@ igt_main
 		igt_display_commit2(&display, display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
 		igt_pm_enable_sata_link_power_management();
 	}
+	for (size_t j = 0; j < sizeof(paths) / sizeof(paths[0]); j++) {
+		context.path = paths[j];
+
+		igt_subtest("basic-brightness")
+			test_brightness(&context);
+		igt_subtest("bad-brightness")
+			test_bad_brightness(&context);
+		igt_subtest("fade")
+			test_fade(&context);
+		igt_subtest("fade_with_dpms")
+			test_fade_with_dpms(&context, output);
+		igt_subtest("fade_with_suspend")
+			test_fade_with_suspend(&context, output);
 
-	igt_subtest("basic-brightness")
-		test_brightness(&context);
-	igt_subtest("bad-brightness")
-		test_bad_brightness(&context);
-	igt_subtest("fade")
-		test_fade(&context);
-	igt_subtest("fade_with_dpms")
-		test_fade_with_dpms(&context, output);
-	igt_subtest("fade_with_suspend")
-		test_fade_with_suspend(&context, output);
-
-	igt_fixture {
 		/* Restore old brightness */
-		backlight_write(old, "brightness");
+                backlight_write(old, "brightness", &context);
+	}
 
+	igt_fixture {
 		igt_display_fini(&display);
 		igt_remove_fb(display.drm_fd, &fb);
 		igt_pm_restore_sata_link_power_management();
-- 
2.36.0

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [igt-dev] ✗ Fi.CI.BUILD: failure for tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight (rev3)
  2022-09-26  3:13 [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight Nidhi Gupta
@ 2022-09-26  3:50 ` Patchwork
  2022-09-26 10:04 ` [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight Hogander, Jouni
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 15+ messages in thread
From: Patchwork @ 2022-09-26  3:50 UTC (permalink / raw)
  To: Nidhi Gupta; +Cc: igt-dev

== Series Details ==

Series: tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight (rev3)
URL   : https://patchwork.freedesktop.org/series/108246/
State : failure

== Summary ==

IGT patchset build failed on latest successful build
dcb1d7a8822e62935f4fe3f2e6a04caaee669369 Revert "tests/kms_concurrent: remove an AMD device check"

299/331 testcase check amdgpu/amd_bypass              OK               0.22s
300/331 testcase check amdgpu/amd_deadlock            OK               0.22s
301/331 testcase check amdgpu/amd_color               OK               0.21s
302/331 testcase check amdgpu/amd_cs_nop              OK               0.21s
303/331 testcase check amdgpu/amd_hotplug             OK               0.20s
304/331 testcase check amdgpu/amd_info                OK               0.20s
305/331 testcase check amdgpu/amd_prime               OK               0.19s
306/331 testcase check amdgpu/amd_max_bpc             OK               0.17s
307/331 testcase check amdgpu/amd_module_load         OK               0.16s
308/331 testcase check amdgpu/amd_mem_leak            OK               0.16s
309/331 testcase check amdgpu/amd_link_settings       OK               0.16s
310/331 testcase check amdgpu/amd_vrr_range           OK               0.15s
311/331 testcase check amdgpu/amd_mode_switch         OK               0.15s
312/331 testcase check amdgpu/amd_dp_dsc              OK               0.14s
313/331 testcase check amdgpu/amd_psr                 OK               0.14s
314/331 testcase check amdgpu/amd_plane               OK               0.13s
315/331 testcase check amdgpu/amd_ilr                 OK               0.13s
316/331 runner_json                                   OK               0.12s
317/331 assembler test/mov                            OK               0.11s
318/331 assembler test/frc                            OK               0.11s
319/331 assembler test/regtype                        OK               0.10s
320/331 assembler test/rndd                           OK               0.09s
321/331 assembler test/rndu                           OK               0.08s
322/331 assembler test/rnde                           OK               0.07s
323/331 assembler test/rnde-intsrc                    OK               0.07s
324/331 assembler test/rndz                           OK               0.06s
325/331 assembler test/lzd                            OK               0.05s
326/331 assembler test/not                            OK               0.05s
327/331 assembler test/immediate                      OK               0.04s
328/331 lib igt_nesting                               OK               2.23s
329/331 lib igt_fork                                  OK               2.71s
330/331 testcase check gem_concurrent_all             OK               4.71s
331/331 runner                                        OK               5.20s

Summary of Failures:

242/331 testcase check i915_pm_backlight              FAIL             0.29s   exit status 1


Ok:                 327 
Expected Fail:      3   
Fail:               1   
Unexpected Pass:    0   
Skipped:            0   
Timeout:            0   

Full log written to /home/cidrm/igt-gpu-tools/build/meson-logs/testlog.txt
FAILED: meson-test 
/usr/bin/meson test --no-rebuild --print-errorlogs
ninja: build stopped: subcommand failed.


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight
  2022-09-26  3:13 [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight Nidhi Gupta
  2022-09-26  3:50 ` [igt-dev] ✗ Fi.CI.BUILD: failure for tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight (rev3) Patchwork
@ 2022-09-26 10:04 ` Hogander, Jouni
  2022-12-26 19:52   ` [igt-dev] [PATCH i-g-t, v5, 05/52] tests/kms_atomic_interruptible: Add support for Bigjoiner Gupta, Nidhi1
  2022-09-26 10:05 ` [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight Petri Latvala
  2022-09-26 10:06 ` Petri Latvala
  3 siblings, 1 reply; 15+ messages in thread
From: Hogander, Jouni @ 2022-09-26 10:04 UTC (permalink / raw)
  To: igt-dev, Gupta, Nidhi1

On Mon, 2022-09-26 at 08:43 +0530, Nidhi Gupta wrote:
> Since driver can now support multiple eDPs and Debugfs structure for
> backlight changed per connector the test should then iterate through
> all eDP connectors.
> 
> Signed-off-by: Nidhi Gupta <nidhi1.gupta@intel.com>
> ---
>  tests/i915/i915_pm_backlight.c | 70 +++++++++++++++++++-------------
> --
>  1 file changed, 39 insertions(+), 31 deletions(-)
> 
> diff --git a/tests/i915/i915_pm_backlight.c
> b/tests/i915/i915_pm_backlight.c
> index cafae7f7..1532193b 100644
> --- a/tests/i915/i915_pm_backlight.c
> +++ b/tests/i915/i915_pm_backlight.c
> @@ -37,25 +37,26 @@
>  
>  struct context {
>         int max;
> +       const char *path;
>  };
>  
>  
>  #define TOLERANCE 5 /* percent */
> -#define BACKLIGHT_PATH "/sys/class/backlight/intel_backlight"
> +#define BACKLIGHT_PATH "/sys/class/backlight"
>  
>  #define FADESTEPS 10
>  #define FADESPEED 100 /* milliseconds between steps */
>  
>  IGT_TEST_DESCRIPTION("Basic backlight sysfs test");
>  
> -static int backlight_read(int *result, const char *fname)
> +static int backlight_read(int *result, const char *fname, struct
> context *context)
>  {
>         int fd;
>         char full[PATH_MAX];
>         char dst[64];
>         int r, e;
>  
> -       igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH,
> fname) < PATH_MAX);
> +       igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s",
> BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
>  
>         fd = open(full, O_RDONLY);
>         if (fd == -1)
> @@ -73,14 +74,14 @@ static int backlight_read(int *result, const char
> *fname)
>         return errno;
>  }
>  
> -static int backlight_write(int value, const char *fname)
> +static int backlight_write(int value, const char *fname, struct
> context *context)
>  {
>         int fd;
>         char full[PATH_MAX];
>         char src[64];
>         int len;
>  
> -       igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH,
> fname) < PATH_MAX);
> +       igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s",
> BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
>         fd = open(full, O_WRONLY);
>         if (fd == -1)
>                 return -errno;
> @@ -100,12 +101,12 @@ static void test_and_verify(struct context
> *context, int val)
>         const int tolerance = val * TOLERANCE / 100;
>         int result;
>  
> -       igt_assert_eq(backlight_write(val, "brightness"), 0);
> -       igt_assert_eq(backlight_read(&result, "brightness"), 0);
> +       igt_assert_eq(backlight_write(val, "brightness", context),
> 0);
> +       igt_assert_eq(backlight_read(&result, "brightness", context),
> 0);
>         /* Check that the exact value sticks */
>         igt_assert_eq(result, val);
>  
> -       igt_assert_eq(backlight_read(&result, "actual_brightness"),
> 0);
> +       igt_assert_eq(backlight_read(&result, "actual_brightness",
> context), 0);
>         /* Some rounding may happen depending on hw */
>         igt_assert_f(result >= max(0, val - tolerance) &&
>                      result <= min(context->max, val + tolerance),
> @@ -124,16 +125,16 @@ static void test_bad_brightness(struct context
> *context)
>  {
>         int val;
>         /* First write some sane value */
> -       backlight_write(context->max / 2, "brightness");
> +       backlight_write(context->max / 2, "brightness", context);
>         /* Writing invalid values should fail and not change the
> value */
> -       igt_assert_lt(backlight_write(-1, "brightness"), 0);
> -       backlight_read(&val, "brightness");
> +       igt_assert_lt(backlight_write(-1, "brightness", context), 0);
> +       backlight_read(&val, "brightness", context);
>         igt_assert_eq(val, context->max / 2);
> -       igt_assert_lt(backlight_write(context->max + 1,
> "brightness"), 0);
> -       backlight_read(&val, "brightness");
> +       igt_assert_lt(backlight_write(context->max + 1, "brightness",
> context), 0);
> +       backlight_read(&val, "brightness", context);
>         igt_assert_eq(val, context->max / 2);
> -       igt_assert_lt(backlight_write(INT_MAX, "brightness"), 0);
> -       backlight_read(&val, "brightness");
> +       igt_assert_lt(backlight_write(INT_MAX, "brightness",
> context), 0);
> +       backlight_read(&val, "brightness", context);
>         igt_assert_eq(val, context->max / 2);
>  }
>  
> @@ -186,6 +187,7 @@ igt_main
>         igt_display_t display;
>         igt_output_t *output;
>         struct igt_fb fb;
> +       char paths[][50] = { "intel_backlight", "card0-eDP-2-
> backlight" };

const char *paths[] = {"intel_backlight","card0-eDP-2-backlight"};

>  
>         igt_fixture {
>                 enum pipe pipe;
> @@ -203,11 +205,14 @@ igt_main
>                 igt_display_require(&display,
> drm_open_driver(DRIVER_INTEL));
>  
>                 /* Get the max value and skip the whole test if sysfs
> interface not available */
> -               igt_skip_on(backlight_read(&old, "brightness"));
> -               igt_assert(backlight_read(&context.max,
> "max_brightness") > -1);
> +               for (size_t i = 0; i < sizeof(paths) /
> sizeof(paths[0]); i++) {

ARRAY_SIZE

> +                       context.path = paths[i];
> +                       igt_skip_on(backlight_read(&old,
> "brightness", &context));
> +                       igt_assert(backlight_read(&context.max,
> "max_brightness", &context) > -1);
> +               }

I don't think we want to skip completely if second panel is missing.

How about using dynamic approach? Add check if context.path exists and
add dynamic subtest based on that. See patch set from Jeevan here as an
example:

https://patchwork.freedesktop.org/series/108299/

>  
>                 /* should be ../../cardX-$output */
> -               igt_assert_lt(12, readlink(BACKLIGHT_PATH "/device",
> full_name, sizeof(full_name) - 1));
> +               igt_assert_lt(12, readlink(BACKLIGHT_PATH
> "/intel_backlight/device", full_name, sizeof(full_name) - 1));
>                 name = basename(full_name);
>  
>                 for_each_pipe_with_valid_output(&display, pipe,
> output) {
> @@ -234,22 +239,25 @@ igt_main
>                 igt_display_commit2(&display, display.is_atomic ?
> COMMIT_ATOMIC : COMMIT_LEGACY);
>                 igt_pm_enable_sata_link_power_management();
>         }
> +       for (size_t j = 0; j < sizeof(paths) / sizeof(paths[0]); j++)
> {
> +               context.path = paths[j];
> +
> +               igt_subtest("basic-brightness")
> +                       test_brightness(&context);
> +               igt_subtest("bad-brightness")
> +                       test_bad_brightness(&context);
> +               igt_subtest("fade")
> +                       test_fade(&context);
> +               igt_subtest("fade_with_dpms")
> +                       test_fade_with_dpms(&context, output);
> +               igt_subtest("fade_with_suspend")
> +                       test_fade_with_suspend(&context, output);
>  
> -       igt_subtest("basic-brightness")
> -               test_brightness(&context);
> -       igt_subtest("bad-brightness")
> -               test_bad_brightness(&context);
> -       igt_subtest("fade")
> -               test_fade(&context);
> -       igt_subtest("fade_with_dpms")
> -               test_fade_with_dpms(&context, output);
> -       igt_subtest("fade_with_suspend")
> -               test_fade_with_suspend(&context, output);
> -
> -       igt_fixture {
>                 /* Restore old brightness */
> -               backlight_write(old, "brightness");
> +                backlight_write(old, "brightness", &context);
> +       }
>  
> +       igt_fixture {
>                 igt_display_fini(&display);
>                 igt_remove_fb(display.drm_fd, &fb);
>                 igt_pm_restore_sata_link_power_management();


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight
  2022-09-26  3:13 [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight Nidhi Gupta
  2022-09-26  3:50 ` [igt-dev] ✗ Fi.CI.BUILD: failure for tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight (rev3) Patchwork
  2022-09-26 10:04 ` [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight Hogander, Jouni
@ 2022-09-26 10:05 ` Petri Latvala
  2022-09-26 10:16   ` Jani Nikula
  2022-09-26 10:06 ` Petri Latvala
  3 siblings, 1 reply; 15+ messages in thread
From: Petri Latvala @ 2022-09-26 10:05 UTC (permalink / raw)
  To: Nidhi Gupta; +Cc: igt-dev

On Mon, Sep 26, 2022 at 08:43:18AM +0530, Nidhi Gupta wrote:
> Since driver can now support multiple eDPs and Debugfs structure for
> backlight changed per connector the test should then iterate through
> all eDP connectors.
> 
> Signed-off-by: Nidhi Gupta <nidhi1.gupta@intel.com>
> ---
>  tests/i915/i915_pm_backlight.c | 70 +++++++++++++++++++---------------
>  1 file changed, 39 insertions(+), 31 deletions(-)
> 
> diff --git a/tests/i915/i915_pm_backlight.c b/tests/i915/i915_pm_backlight.c
> index cafae7f7..1532193b 100644
> --- a/tests/i915/i915_pm_backlight.c
> +++ b/tests/i915/i915_pm_backlight.c
> @@ -37,25 +37,26 @@
>  
>  struct context {
>  	int max;
> +	const char *path;
>  };
>  
>  
>  #define TOLERANCE 5 /* percent */
> -#define BACKLIGHT_PATH "/sys/class/backlight/intel_backlight"
> +#define BACKLIGHT_PATH "/sys/class/backlight"
>  
>  #define FADESTEPS 10
>  #define FADESPEED 100 /* milliseconds between steps */
>  
>  IGT_TEST_DESCRIPTION("Basic backlight sysfs test");
>  
> -static int backlight_read(int *result, const char *fname)
> +static int backlight_read(int *result, const char *fname, struct context *context)
>  {
>  	int fd;
>  	char full[PATH_MAX];
>  	char dst[64];
>  	int r, e;
>  
> -	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
> +	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
>  
>  	fd = open(full, O_RDONLY);
>  	if (fd == -1)
> @@ -73,14 +74,14 @@ static int backlight_read(int *result, const char *fname)
>  	return errno;
>  }
>  
> -static int backlight_write(int value, const char *fname)
> +static int backlight_write(int value, const char *fname, struct context *context)
>  {
>  	int fd;
>  	char full[PATH_MAX];
>  	char src[64];
>  	int len;
>  
> -	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
> +	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
>  	fd = open(full, O_WRONLY);
>  	if (fd == -1)
>  		return -errno;
> @@ -100,12 +101,12 @@ static void test_and_verify(struct context *context, int val)
>  	const int tolerance = val * TOLERANCE / 100;
>  	int result;
>  
> -	igt_assert_eq(backlight_write(val, "brightness"), 0);
> -	igt_assert_eq(backlight_read(&result, "brightness"), 0);
> +	igt_assert_eq(backlight_write(val, "brightness", context), 0);
> +	igt_assert_eq(backlight_read(&result, "brightness", context), 0);
>  	/* Check that the exact value sticks */
>  	igt_assert_eq(result, val);
>  
> -	igt_assert_eq(backlight_read(&result, "actual_brightness"), 0);
> +	igt_assert_eq(backlight_read(&result, "actual_brightness", context), 0);
>  	/* Some rounding may happen depending on hw */
>  	igt_assert_f(result >= max(0, val - tolerance) &&
>  		     result <= min(context->max, val + tolerance),
> @@ -124,16 +125,16 @@ static void test_bad_brightness(struct context *context)
>  {
>  	int val;
>  	/* First write some sane value */
> -	backlight_write(context->max / 2, "brightness");
> +	backlight_write(context->max / 2, "brightness", context);
>  	/* Writing invalid values should fail and not change the value */
> -	igt_assert_lt(backlight_write(-1, "brightness"), 0);
> -	backlight_read(&val, "brightness");
> +	igt_assert_lt(backlight_write(-1, "brightness", context), 0);
> +	backlight_read(&val, "brightness", context);
>  	igt_assert_eq(val, context->max / 2);
> -	igt_assert_lt(backlight_write(context->max + 1, "brightness"), 0);
> -	backlight_read(&val, "brightness");
> +	igt_assert_lt(backlight_write(context->max + 1, "brightness", context), 0);
> +	backlight_read(&val, "brightness", context);
>  	igt_assert_eq(val, context->max / 2);
> -	igt_assert_lt(backlight_write(INT_MAX, "brightness"), 0);
> -	backlight_read(&val, "brightness");
> +	igt_assert_lt(backlight_write(INT_MAX, "brightness", context), 0);
> +	backlight_read(&val, "brightness", context);
>  	igt_assert_eq(val, context->max / 2);
>  }
>  
> @@ -186,6 +187,7 @@ igt_main
>  	igt_display_t display;
>  	igt_output_t *output;
>  	struct igt_fb fb;
> +	char paths[][50] = { "intel_backlight", "card0-eDP-2-backlight" };

Hardcoding "intel_backlight" is ok but is it possible to construct
that other name from the used device? "eDP-2" is easy with
igt_output_name, but I'm not sure how to elegantly get "card0" out of
an fd...

Also consider having dynamic subtests instead for each output that has
backlight controls available.


-- 
Petri Latvala


>  
>  	igt_fixture {
>  		enum pipe pipe;
> @@ -203,11 +205,14 @@ igt_main
>  		igt_display_require(&display, drm_open_driver(DRIVER_INTEL));
>  
>  		/* Get the max value and skip the whole test if sysfs interface not available */
> -		igt_skip_on(backlight_read(&old, "brightness"));
> -		igt_assert(backlight_read(&context.max, "max_brightness") > -1);
> +		for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) {
> +			context.path = paths[i];
> +			igt_skip_on(backlight_read(&old, "brightness", &context));
> +			igt_assert(backlight_read(&context.max, "max_brightness", &context) > -1);
> +		}
>  
>  		/* should be ../../cardX-$output */
> -		igt_assert_lt(12, readlink(BACKLIGHT_PATH "/device", full_name, sizeof(full_name) - 1));
> +		igt_assert_lt(12, readlink(BACKLIGHT_PATH "/intel_backlight/device", full_name, sizeof(full_name) - 1));
>  		name = basename(full_name);
>  
>  		for_each_pipe_with_valid_output(&display, pipe, output) {
> @@ -234,22 +239,25 @@ igt_main
>  		igt_display_commit2(&display, display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
>  		igt_pm_enable_sata_link_power_management();
>  	}
> +	for (size_t j = 0; j < sizeof(paths) / sizeof(paths[0]); j++) {
> +		context.path = paths[j];
> +
> +		igt_subtest("basic-brightness")
> +			test_brightness(&context);
> +		igt_subtest("bad-brightness")
> +			test_bad_brightness(&context);
> +		igt_subtest("fade")
> +			test_fade(&context);
> +		igt_subtest("fade_with_dpms")
> +			test_fade_with_dpms(&context, output);
> +		igt_subtest("fade_with_suspend")
> +			test_fade_with_suspend(&context, output);
>  
> -	igt_subtest("basic-brightness")
> -		test_brightness(&context);
> -	igt_subtest("bad-brightness")
> -		test_bad_brightness(&context);
> -	igt_subtest("fade")
> -		test_fade(&context);
> -	igt_subtest("fade_with_dpms")
> -		test_fade_with_dpms(&context, output);
> -	igt_subtest("fade_with_suspend")
> -		test_fade_with_suspend(&context, output);
> -
> -	igt_fixture {
>  		/* Restore old brightness */
> -		backlight_write(old, "brightness");
> +                backlight_write(old, "brightness", &context);
> +	}
>  
> +	igt_fixture {
>  		igt_display_fini(&display);
>  		igt_remove_fb(display.drm_fd, &fb);
>  		igt_pm_restore_sata_link_power_management();
> -- 
> 2.36.0
> 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight
  2022-09-26  3:13 [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight Nidhi Gupta
                   ` (2 preceding siblings ...)
  2022-09-26 10:05 ` [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight Petri Latvala
@ 2022-09-26 10:06 ` Petri Latvala
  3 siblings, 0 replies; 15+ messages in thread
From: Petri Latvala @ 2022-09-26 10:06 UTC (permalink / raw)
  To: Nidhi Gupta; +Cc: igt-dev

On Mon, Sep 26, 2022 at 08:43:18AM +0530, Nidhi Gupta wrote:
> Since driver can now support multiple eDPs and Debugfs structure for
> backlight changed per connector the test should then iterate through
> all eDP connectors.
> 
> Signed-off-by: Nidhi Gupta <nidhi1.gupta@intel.com>
> ---
>  tests/i915/i915_pm_backlight.c | 70 +++++++++++++++++++---------------
>  1 file changed, 39 insertions(+), 31 deletions(-)
> 
> diff --git a/tests/i915/i915_pm_backlight.c b/tests/i915/i915_pm_backlight.c
> index cafae7f7..1532193b 100644
> --- a/tests/i915/i915_pm_backlight.c
> +++ b/tests/i915/i915_pm_backlight.c
> @@ -37,25 +37,26 @@
>  
>  struct context {
>  	int max;
> +	const char *path;
>  };
>  
>  
>  #define TOLERANCE 5 /* percent */
> -#define BACKLIGHT_PATH "/sys/class/backlight/intel_backlight"
> +#define BACKLIGHT_PATH "/sys/class/backlight"
>  
>  #define FADESTEPS 10
>  #define FADESPEED 100 /* milliseconds between steps */
>  
>  IGT_TEST_DESCRIPTION("Basic backlight sysfs test");
>  
> -static int backlight_read(int *result, const char *fname)
> +static int backlight_read(int *result, const char *fname, struct context *context)
>  {
>  	int fd;
>  	char full[PATH_MAX];
>  	char dst[64];
>  	int r, e;
>  
> -	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
> +	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
>  
>  	fd = open(full, O_RDONLY);
>  	if (fd == -1)
> @@ -73,14 +74,14 @@ static int backlight_read(int *result, const char *fname)
>  	return errno;
>  }
>  
> -static int backlight_write(int value, const char *fname)
> +static int backlight_write(int value, const char *fname, struct context *context)
>  {
>  	int fd;
>  	char full[PATH_MAX];
>  	char src[64];
>  	int len;
>  
> -	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
> +	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
>  	fd = open(full, O_WRONLY);
>  	if (fd == -1)
>  		return -errno;
> @@ -100,12 +101,12 @@ static void test_and_verify(struct context *context, int val)
>  	const int tolerance = val * TOLERANCE / 100;
>  	int result;
>  
> -	igt_assert_eq(backlight_write(val, "brightness"), 0);
> -	igt_assert_eq(backlight_read(&result, "brightness"), 0);
> +	igt_assert_eq(backlight_write(val, "brightness", context), 0);
> +	igt_assert_eq(backlight_read(&result, "brightness", context), 0);
>  	/* Check that the exact value sticks */
>  	igt_assert_eq(result, val);
>  
> -	igt_assert_eq(backlight_read(&result, "actual_brightness"), 0);
> +	igt_assert_eq(backlight_read(&result, "actual_brightness", context), 0);
>  	/* Some rounding may happen depending on hw */
>  	igt_assert_f(result >= max(0, val - tolerance) &&
>  		     result <= min(context->max, val + tolerance),
> @@ -124,16 +125,16 @@ static void test_bad_brightness(struct context *context)
>  {
>  	int val;
>  	/* First write some sane value */
> -	backlight_write(context->max / 2, "brightness");
> +	backlight_write(context->max / 2, "brightness", context);
>  	/* Writing invalid values should fail and not change the value */
> -	igt_assert_lt(backlight_write(-1, "brightness"), 0);
> -	backlight_read(&val, "brightness");
> +	igt_assert_lt(backlight_write(-1, "brightness", context), 0);
> +	backlight_read(&val, "brightness", context);
>  	igt_assert_eq(val, context->max / 2);
> -	igt_assert_lt(backlight_write(context->max + 1, "brightness"), 0);
> -	backlight_read(&val, "brightness");
> +	igt_assert_lt(backlight_write(context->max + 1, "brightness", context), 0);
> +	backlight_read(&val, "brightness", context);
>  	igt_assert_eq(val, context->max / 2);
> -	igt_assert_lt(backlight_write(INT_MAX, "brightness"), 0);
> -	backlight_read(&val, "brightness");
> +	igt_assert_lt(backlight_write(INT_MAX, "brightness", context), 0);
> +	backlight_read(&val, "brightness", context);
>  	igt_assert_eq(val, context->max / 2);
>  }
>  
> @@ -186,6 +187,7 @@ igt_main
>  	igt_display_t display;
>  	igt_output_t *output;
>  	struct igt_fb fb;
> +	char paths[][50] = { "intel_backlight", "card0-eDP-2-backlight" };
>  
>  	igt_fixture {
>  		enum pipe pipe;
> @@ -203,11 +205,14 @@ igt_main
>  		igt_display_require(&display, drm_open_driver(DRIVER_INTEL));
>  
>  		/* Get the max value and skip the whole test if sysfs interface not available */
> -		igt_skip_on(backlight_read(&old, "brightness"));
> -		igt_assert(backlight_read(&context.max, "max_brightness") > -1);
> +		for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) {
> +			context.path = paths[i];
> +			igt_skip_on(backlight_read(&old, "brightness", &context));
> +			igt_assert(backlight_read(&context.max, "max_brightness", &context) > -1);
> +		}
>  
>  		/* should be ../../cardX-$output */
> -		igt_assert_lt(12, readlink(BACKLIGHT_PATH "/device", full_name, sizeof(full_name) - 1));
> +		igt_assert_lt(12, readlink(BACKLIGHT_PATH "/intel_backlight/device", full_name, sizeof(full_name) - 1));
>  		name = basename(full_name);
>  
>  		for_each_pipe_with_valid_output(&display, pipe, output) {
> @@ -234,22 +239,25 @@ igt_main
>  		igt_display_commit2(&display, display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
>  		igt_pm_enable_sata_link_power_management();
>  	}
> +	for (size_t j = 0; j < sizeof(paths) / sizeof(paths[0]); j++) {
> +		context.path = paths[j];
> +
> +		igt_subtest("basic-brightness")
> +			test_brightness(&context);
> +		igt_subtest("bad-brightness")
> +			test_bad_brightness(&context);
> +		igt_subtest("fade")
> +			test_fade(&context);
> +		igt_subtest("fade_with_dpms")
> +			test_fade_with_dpms(&context, output);
> +		igt_subtest("fade_with_suspend")
> +			test_fade_with_suspend(&context, output);
>  
> -	igt_subtest("basic-brightness")
> -		test_brightness(&context);
> -	igt_subtest("bad-brightness")
> -		test_bad_brightness(&context);
> -	igt_subtest("fade")
> -		test_fade(&context);
> -	igt_subtest("fade_with_dpms")
> -		test_fade_with_dpms(&context, output);
> -	igt_subtest("fade_with_suspend")
> -		test_fade_with_suspend(&context, output);
> -
> -	igt_fixture {
>  		/* Restore old brightness */
> -		backlight_write(old, "brightness");
> +                backlight_write(old, "brightness", &context);

Also, this backlight_write is outside of a fixture or subtest, you
can't do that.


-- 
Petri Latvala



> +	}
>  
> +	igt_fixture {
>  		igt_display_fini(&display);
>  		igt_remove_fb(display.drm_fd, &fb);
>  		igt_pm_restore_sata_link_power_management();
> -- 
> 2.36.0
> 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight
  2022-09-26 10:05 ` [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight Petri Latvala
@ 2022-09-26 10:16   ` Jani Nikula
  0 siblings, 0 replies; 15+ messages in thread
From: Jani Nikula @ 2022-09-26 10:16 UTC (permalink / raw)
  To: Petri Latvala, Nidhi Gupta; +Cc: igt-dev

On Mon, 26 Sep 2022, Petri Latvala <petri.latvala@intel.com> wrote:
> On Mon, Sep 26, 2022 at 08:43:18AM +0530, Nidhi Gupta wrote:
>> Since driver can now support multiple eDPs and Debugfs structure for
>> backlight changed per connector the test should then iterate through
>> all eDP connectors.
>> 
>> Signed-off-by: Nidhi Gupta <nidhi1.gupta@intel.com>
>> ---
>>  tests/i915/i915_pm_backlight.c | 70 +++++++++++++++++++---------------
>>  1 file changed, 39 insertions(+), 31 deletions(-)
>> 
>> diff --git a/tests/i915/i915_pm_backlight.c b/tests/i915/i915_pm_backlight.c
>> index cafae7f7..1532193b 100644
>> --- a/tests/i915/i915_pm_backlight.c
>> +++ b/tests/i915/i915_pm_backlight.c
>> @@ -37,25 +37,26 @@
>>  
>>  struct context {
>>  	int max;
>> +	const char *path;
>>  };
>>  
>>  
>>  #define TOLERANCE 5 /* percent */
>> -#define BACKLIGHT_PATH "/sys/class/backlight/intel_backlight"
>> +#define BACKLIGHT_PATH "/sys/class/backlight"
>>  
>>  #define FADESTEPS 10
>>  #define FADESPEED 100 /* milliseconds between steps */
>>  
>>  IGT_TEST_DESCRIPTION("Basic backlight sysfs test");
>>  
>> -static int backlight_read(int *result, const char *fname)
>> +static int backlight_read(int *result, const char *fname, struct context *context)
>>  {
>>  	int fd;
>>  	char full[PATH_MAX];
>>  	char dst[64];
>>  	int r, e;
>>  
>> -	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
>> +	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
>>  
>>  	fd = open(full, O_RDONLY);
>>  	if (fd == -1)
>> @@ -73,14 +74,14 @@ static int backlight_read(int *result, const char *fname)
>>  	return errno;
>>  }
>>  
>> -static int backlight_write(int value, const char *fname)
>> +static int backlight_write(int value, const char *fname, struct context *context)
>>  {
>>  	int fd;
>>  	char full[PATH_MAX];
>>  	char src[64];
>>  	int len;
>>  
>> -	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
>> +	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
>>  	fd = open(full, O_WRONLY);
>>  	if (fd == -1)
>>  		return -errno;
>> @@ -100,12 +101,12 @@ static void test_and_verify(struct context *context, int val)
>>  	const int tolerance = val * TOLERANCE / 100;
>>  	int result;
>>  
>> -	igt_assert_eq(backlight_write(val, "brightness"), 0);
>> -	igt_assert_eq(backlight_read(&result, "brightness"), 0);
>> +	igt_assert_eq(backlight_write(val, "brightness", context), 0);
>> +	igt_assert_eq(backlight_read(&result, "brightness", context), 0);
>>  	/* Check that the exact value sticks */
>>  	igt_assert_eq(result, val);
>>  
>> -	igt_assert_eq(backlight_read(&result, "actual_brightness"), 0);
>> +	igt_assert_eq(backlight_read(&result, "actual_brightness", context), 0);
>>  	/* Some rounding may happen depending on hw */
>>  	igt_assert_f(result >= max(0, val - tolerance) &&
>>  		     result <= min(context->max, val + tolerance),
>> @@ -124,16 +125,16 @@ static void test_bad_brightness(struct context *context)
>>  {
>>  	int val;
>>  	/* First write some sane value */
>> -	backlight_write(context->max / 2, "brightness");
>> +	backlight_write(context->max / 2, "brightness", context);
>>  	/* Writing invalid values should fail and not change the value */
>> -	igt_assert_lt(backlight_write(-1, "brightness"), 0);
>> -	backlight_read(&val, "brightness");
>> +	igt_assert_lt(backlight_write(-1, "brightness", context), 0);
>> +	backlight_read(&val, "brightness", context);
>>  	igt_assert_eq(val, context->max / 2);
>> -	igt_assert_lt(backlight_write(context->max + 1, "brightness"), 0);
>> -	backlight_read(&val, "brightness");
>> +	igt_assert_lt(backlight_write(context->max + 1, "brightness", context), 0);
>> +	backlight_read(&val, "brightness", context);
>>  	igt_assert_eq(val, context->max / 2);
>> -	igt_assert_lt(backlight_write(INT_MAX, "brightness"), 0);
>> -	backlight_read(&val, "brightness");
>> +	igt_assert_lt(backlight_write(INT_MAX, "brightness", context), 0);
>> +	backlight_read(&val, "brightness", context);
>>  	igt_assert_eq(val, context->max / 2);
>>  }
>>  
>> @@ -186,6 +187,7 @@ igt_main
>>  	igt_display_t display;
>>  	igt_output_t *output;
>>  	struct igt_fb fb;
>> +	char paths[][50] = { "intel_backlight", "card0-eDP-2-backlight" };
>
> Hardcoding "intel_backlight" is ok but is it possible to construct
> that other name from the used device? "eDP-2" is easy with
> igt_output_name, but I'm not sure how to elegantly get "card0" out of
> an fd...

They're symlinks of the form:

intel_backlight -> ../../devices/pci0000:00/0000:00:02.0/drm/card0/card0-eDP-1/intel_backlight

so should be possible to figure out.


BR,
Jani.


> 
>
> Also consider having dynamic subtests instead for each output that has
> backlight controls available.

-- 
Jani Nikula, Intel Open Source Graphics Center

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [igt-dev] [PATCH i-g-t, v5, 05/52] tests/kms_atomic_interruptible: Add support for Bigjoiner
  2022-09-26 10:04 ` [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight Hogander, Jouni
@ 2022-12-26 19:52   ` Gupta, Nidhi1
  2022-12-26 20:12     ` [igt-dev] [i-g-t v5 " Gupta, Nidhi1
  2022-12-28  3:39     ` [igt-dev] [i-g-t v5 06/52] tests/kms_atomic_transition: " Gupta, Nidhi1
  0 siblings, 2 replies; 15+ messages in thread
From: Gupta, Nidhi1 @ 2022-12-26 19:52 UTC (permalink / raw)
  To: igt-dev

 On Tue, 2022-11-15 at 08:43 +0530, Bhanuprakash Modem wrote:
>This patch will add a check to Skip the subtest if a selected pipe/output
>combo won't support Bigjoiner or 8K mode.
>
>Example:
>* Pipe-D wont support a mode > 5K
>* To use 8K mode on a pipe then consecutive pipe must be available & free.
>
>V2: - Use updated helper name
>
>Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
Reviewed-by: Nidhi Gupta <nidhi1.gupta@intel.com> 
---
 tests/kms_atomic_interruptible.c | 40 ++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)
>diff --git a/tests/kms_atomic_interruptible.c b/tests/kms_atomic_interruptible.c
>index f461a15c..74b2e246 100644
>--- a/tests/kms_atomic_interruptible.c
>+++ b/tests/kms_atomic_interruptible.c
>@@ -82,11 +82,15 @@  static void run_plane_test(igt_display_t *display, enum pipe pipe, igt_output_t
>	igt_plane_t *primary, *plane;
>	int block;
>
>+	igt_info("Using (pipe %s + %s) to run the subtest.\n",
>+		 kmstest_pipe_name(pipe), igt_output_name(output));
>+
> 	/*
>	 * Make sure we start with everything disabled to force a real modeset.
> 	 * igt_display_require only sets sw state, and assumes the first test
> 	 * doesn't care about hw state.
> 	 */
>+	igt_display_reset(display);
> 	igt_display_commit2(display, COMMIT_ATOMIC);
> 
> 	igt_output_set_pipe(output, pipe);
>@@ -265,6 +269,21 @@  static void run_plane_test(igt_display_t *display, enum pipe pipe, igt_output_t
> 	igt_remove_fb(display->drm_fd, &fb);
> }
> 
>+static bool pipe_output_combo_valid(igt_display_t *display,
>+				    enum pipe pipe, igt_output_t *output)
>+{
>+	bool ret = true;
>+
>+	igt_display_reset(display);
>+
>+	igt_output_set_pipe(output, pipe);
>+	if (!i915_pipe_output_combo_valid(display))
>+		ret = false;
>+	igt_output_set_pipe(output, PIPE_NONE);
>+
>+	return ret;
>+}
>+
>igt_main
>{
> 	igt_display_t display;
>@@ -286,6 +305,9 @@  igt_main
> 	igt_describe("Tests the interrupt properties of legacy modeset");
> 	igt_subtest_with_dynamic("legacy-setmode") {
> 		for_each_pipe_with_valid_output(&display, pipe, output) {
>+			if (!pipe_output_combo_valid(&display, pipe, output))
>+				continue;
>+
> 			igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> 				run_plane_test(&display, pipe, output, test_legacy_modeset, DRM_PLANE_TYPE_PRIMARY);
> 			break;
>@@ -295,6 +317,9 @@  igt_main
> 	igt_describe("Tests the interrupt properties of atomic modeset");
> 	igt_subtest_with_dynamic("atomic-setmode") {
> 		for_each_pipe_with_valid_output(&display, pipe, output) {
>+			if (!pipe_output_combo_valid(&display, pipe, output))
>+				continue;
>+
> 			igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> 				run_plane_test(&display, pipe, output, test_atomic_modeset, DRM_PLANE_TYPE_PRIMARY);
> 			break;
>@@ -304,6 +329,9 @@  igt_main
> 	igt_describe("Tests the interrupt properties for DPMS");
> 	igt_subtest_with_dynamic("legacy-dpms") {
> 		for_each_pipe_with_valid_output(&display, pipe, output) {
>+			if (!pipe_output_combo_valid(&display, pipe, output))
>+				continue;
>+
> 			igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> 				run_plane_test(&display, pipe, output, test_legacy_dpms, DRM_PLANE_TYPE_PRIMARY);
> 			break;
>@@ -313,6 +341,9 @@  igt_main
> 	igt_describe("Tests the interrupt properties for pageflip");
> 	igt_subtest_with_dynamic("legacy-pageflip") {
> 		for_each_pipe_with_valid_output(&display, pipe, output) {
>+			if (!pipe_output_combo_valid(&display, pipe, output))
>+				continue;
>+
> 			igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> 				run_plane_test(&display, pipe, output, test_pageflip, DRM_PLANE_TYPE_PRIMARY);
> 			break;
>@@ -322,6 +353,9 @@  igt_main
> 	igt_describe("Tests the interrupt properties for cursor");
> 	igt_subtest_with_dynamic("legacy-cursor") {
> 		for_each_pipe_with_valid_output(&display, pipe, output) {
>+			if (!pipe_output_combo_valid(&display, pipe, output))
>+				continue;
>+
> 			igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> 				run_plane_test(&display, pipe, output, test_setcursor, DRM_PLANE_TYPE_CURSOR);
> 			break;
>@@ -331,6 +365,9 @@  igt_main
> 	igt_describe("Tests the interrupt properties for primary plane");
> 	igt_subtest_with_dynamic("universal-setplane-primary") {
> 		for_each_pipe_with_valid_output(&display, pipe, output) {
>+			if (!pipe_output_combo_valid(&display, pipe, output))
>+				continue;
>+
> 			igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> 				run_plane_test(&display, pipe, output, test_setplane, DRM_PLANE_TYPE_PRIMARY);
> 			break;
>@@ -340,6 +377,9 @@  igt_main
> 	igt_describe("Tests the interrupt properties for cursor plane");
> 	igt_subtest_with_dynamic("universal-setplane-cursor") {
> 		for_each_pipe_with_valid_output(&display, pipe, output) {
>+			if (!pipe_output_combo_valid(&display, pipe, output))
>+				continue;
>+
> 			igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> 				run_plane_test(&display, pipe, output, test_setplane, DRM_PLANE_TYPE_CURSOR);
> 			break;


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [igt-dev] [i-g-t v5 05/52] tests/kms_atomic_interruptible: Add support for Bigjoiner
  2022-12-26 19:52   ` [igt-dev] [PATCH i-g-t, v5, 05/52] tests/kms_atomic_interruptible: Add support for Bigjoiner Gupta, Nidhi1
@ 2022-12-26 20:12     ` Gupta, Nidhi1
  2022-12-28  3:39     ` [igt-dev] [i-g-t v5 06/52] tests/kms_atomic_transition: " Gupta, Nidhi1
  1 sibling, 0 replies; 15+ messages in thread
From: Gupta, Nidhi1 @ 2022-12-26 20:12 UTC (permalink / raw)
  To: igt-dev

On Tue, 2022-11-15 at 08:43 +0530, Bhanuprakash Modem wrote:
>This patch will add a check to Skip the subtest if a selected 
>pipe/output combo won't support Bigjoiner or 8K mode.
>
>Example:
>* Pipe-D wont support a mode > 5K
>* To use 8K mode on a pipe then consecutive pipe must be available & free.
>
>V2: - Use updated helper name
>
>Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
Reviewed-by: Nidhi Gupta <nidhi1.gupta@intel.com>
---
 tests/kms_atomic_interruptible.c | 40 ++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)
>diff --git a/tests/kms_atomic_interruptible.c 
>b/tests/kms_atomic_interruptible.c
>index f461a15c..74b2e246 100644
>--- a/tests/kms_atomic_interruptible.c
>+++ b/tests/kms_atomic_interruptible.c
>@@ -82,11 +82,15 @@  static void run_plane_test(igt_display_t *display, enum pipe pipe, igt_output_t
>	igt_plane_t *primary, *plane;
>	int block;
>
>+	igt_info("Using (pipe %s + %s) to run the subtest.\n",
>+		 kmstest_pipe_name(pipe), igt_output_name(output));
>+
> 	/*
>	 * Make sure we start with everything disabled to force a real modeset.
> 	 * igt_display_require only sets sw state, and assumes the first test
> 	 * doesn't care about hw state.
> 	 */
>+	igt_display_reset(display);
> 	igt_display_commit2(display, COMMIT_ATOMIC);
> 
> 	igt_output_set_pipe(output, pipe);
>@@ -265,6 +269,21 @@  static void run_plane_test(igt_display_t *display, enum pipe pipe, igt_output_t
> 	igt_remove_fb(display->drm_fd, &fb);
> }
> 
>+static bool pipe_output_combo_valid(igt_display_t *display,
>+				    enum pipe pipe, igt_output_t *output) {
>+	bool ret = true;
>+
>+	igt_display_reset(display);
>+
>+	igt_output_set_pipe(output, pipe);
>+	if (!i915_pipe_output_combo_valid(display))
>+		ret = false;
>+	igt_output_set_pipe(output, PIPE_NONE);
>+
>+	return ret;
>+}
>+
>igt_main
>{
> 	igt_display_t display;
>@@ -286,6 +305,9 @@  igt_main
> 	igt_describe("Tests the interrupt properties of legacy modeset");
> 	igt_subtest_with_dynamic("legacy-setmode") {
> 		for_each_pipe_with_valid_output(&display, pipe, output) {
>+			if (!pipe_output_combo_valid(&display, pipe, output))
>+				continue;
>+
> 			igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> 				run_plane_test(&display, pipe, output, test_legacy_modeset, DRM_PLANE_TYPE_PRIMARY);
> 			break;
>@@ -295,6 +317,9 @@  igt_main
> 	igt_describe("Tests the interrupt properties of atomic modeset");
> 	igt_subtest_with_dynamic("atomic-setmode") {
> 		for_each_pipe_with_valid_output(&display, pipe, output) {
>+			if (!pipe_output_combo_valid(&display, pipe, output))
>+				continue;
>+
> 			igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> 				run_plane_test(&display, pipe, output, test_atomic_modeset, DRM_PLANE_TYPE_PRIMARY);
> 			break;
>@@ -304,6 +329,9 @@  igt_main
> 	igt_describe("Tests the interrupt properties for DPMS");
> 	igt_subtest_with_dynamic("legacy-dpms") {
> 		for_each_pipe_with_valid_output(&display, pipe, output) {
>+			if (!pipe_output_combo_valid(&display, pipe, output))
>+				continue;
>+
> 			igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> 				run_plane_test(&display, pipe, output, test_legacy_dpms, DRM_PLANE_TYPE_PRIMARY);
> 			break;
>@@ -313,6 +341,9 @@  igt_main
> 	igt_describe("Tests the interrupt properties for pageflip");
> 	igt_subtest_with_dynamic("legacy-pageflip") {
> 		for_each_pipe_with_valid_output(&display, pipe, output) {
>+			if (!pipe_output_combo_valid(&display, pipe, output))
>+				continue;
>+
> 			igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> 				run_plane_test(&display, pipe, output, test_pageflip, DRM_PLANE_TYPE_PRIMARY);
> 			break;
>@@ -322,6 +353,9 @@  igt_main
> 	igt_describe("Tests the interrupt properties for cursor");
> 	igt_subtest_with_dynamic("legacy-cursor") {
> 		for_each_pipe_with_valid_output(&display, pipe, output) {
>+			if (!pipe_output_combo_valid(&display, pipe, output))
>+				continue;
>+
> 			igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> 				run_plane_test(&display, pipe, output, test_setcursor, DRM_PLANE_TYPE_CURSOR);
> 			break;
>@@ -331,6 +365,9 @@  igt_main
> 	igt_describe("Tests the interrupt properties for primary plane");
> 	igt_subtest_with_dynamic("universal-setplane-primary") {
> 		for_each_pipe_with_valid_output(&display, pipe, output) {
>+			if (!pipe_output_combo_valid(&display, pipe, output))
>+				continue;
>+
> 			igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> 				run_plane_test(&display, pipe, output, test_setplane, DRM_PLANE_TYPE_PRIMARY);
> 			break;
>@@ -340,6 +377,9 @@  igt_main
> 	igt_describe("Tests the interrupt properties for cursor plane");
> 	igt_subtest_with_dynamic("universal-setplane-cursor") {
> 		for_each_pipe_with_valid_output(&display, pipe, output) {
>+			if (!pipe_output_combo_valid(&display, pipe, output))
>+				continue;
>+
> 			igt_dynamic_f("%s-pipe-%s", igt_output_name(output), kmstest_pipe_name(pipe))
> 				run_plane_test(&display, pipe, output, test_setplane, DRM_PLANE_TYPE_CURSOR);
> 			break;

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [igt-dev] [i-g-t v5 06/52] tests/kms_atomic_transition: Add support for Bigjoiner
  2022-12-26 19:52   ` [igt-dev] [PATCH i-g-t, v5, 05/52] tests/kms_atomic_interruptible: Add support for Bigjoiner Gupta, Nidhi1
  2022-12-26 20:12     ` [igt-dev] [i-g-t v5 " Gupta, Nidhi1
@ 2022-12-28  3:39     ` Gupta, Nidhi1
  1 sibling, 0 replies; 15+ messages in thread
From: Gupta, Nidhi1 @ 2022-12-28  3:39 UTC (permalink / raw)
  To: igt-dev

On Tue, 2022-11-15 at 04:43 +0530, Bhanuprakash Modem wrote:
>This patch will add a check to Skip the subtest if a selected pipe/output
>combo won't support Bigjoiner or 8K mode.
>
>Example:
>* Pipe-D wont support a mode > 5K
>* To use 8K mode on a pipe then consecutive pipe must be available & free.
>
>V2: - Use updated helper name
>
>Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
Reviewed-by: Nidhi Gupta <nidhi1.gupta@intel.com>
>---
 >tests/kms_atomic_transition.c | 50 ++++++++++++++++++++++++++++++++---
 >1 file changed, 46 insertions(+), 4 deletions(-)
>diff --git a/tests/kms_atomic_transition.c b/tests/kms_atomic_transition.c
>index 6d2ebbbf..5285585f 100644
>--- a/tests/kms_atomic_transition.c
>+++ b/tests/kms_atomic_transition.c
>@@ -68,6 +68,10 @@  run_primary_test(data_t *data, enum pipe pipe, igt_output_t *output)
> 	unsigned flags = DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET;
> 
> 	igt_display_reset(&data->display);
>+
>+	igt_info("Using (pipe %s + %s) to run the subtest.\n",
>+		 kmstest_pipe_name(pipe), igt_output_name(output));
>+
> 	igt_output_set_pipe(output, pipe);
> 	primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> 
>@@ -487,6 +491,9 @@  run_transition_test(data_t *data, enum pipe pipe, igt_output_t *output,
> 	unsigned flags = 0;
>	int ret;
> 
>+	igt_info("Using (pipe %s + %s) to run the subtest.\n",
>+		 kmstest_pipe_name(pipe), igt_output_name(output));
>+
> 	if (fencing)
> 		prepare_fencing(data, pipe);
> 	else
>@@ -753,8 +760,13 @@  static unsigned set_combinations(data_t *data, unsigned mask, struct igt_fb *fb)
> 			if (output->pending_pipe != PIPE_NONE)
> 				continue;
> 
>-			mode = igt_output_get_mode(output);
>-			break;
>+			igt_output_set_pipe(output, pipe);
>+			if (i915_pipe_output_combo_valid(&data->display)) {
>+				mode = igt_output_get_mode(output);
>+				break;
>+			} else {
>+				igt_output_set_pipe(output, PIPE_NONE);
>+			}
> 		}
> 
> 		if (!mode)
>@@ -840,8 +852,17 @@  retry:
> 				continue;
> 
> 			igt_output_set_pipe(output, i);
>-			mode = igt_output_get_mode(output);
>-			break;
>+			if (i915_pipe_output_combo_valid(&data->display)) {
>+				mode = igt_output_get_mode(output);
>+
>+				igt_info("(pipe %s + %s), mode:",
>+					 kmstest_pipe_name(i), igt_output_name(output));
>+				kmstest_dump_mode(mode);
>+
>+				break;
>+			} else {
>+				igt_output_set_pipe(output, PIPE_NONE);
>+			}
> 		}
> 
> 		if (mode) {
>@@ -980,6 +1001,21 @@  static void run_modeset_transition(data_t *data, int requested_outputs, bool non
> 	igt_remove_fb(data->drm_fd, &data->fbs[1]);
>}
> 
>+static bool pipe_output_combo_valid(igt_display_t *display,
>+				    enum pipe pipe, igt_output_t *output)
>+{
>+	bool ret = true;
>+
>+	igt_display_reset(display);
>+
>+	igt_output_set_pipe(output, pipe);
>+	if (!i915_pipe_output_combo_valid(display))
>+		ret = false;
>+	igt_output_set_pipe(output, PIPE_NONE);
>+
>+	return ret;
>+}
>+
>static int opt_handler(int opt, int opt_index, void *_data)
>{
> 	data_t *data = _data;
>@@ -1079,6 +1115,9 @@  igt_main_args("", long_opts, help_str, opt_handler, &data)
> 			if (pipe_count == 2 * count && !data.extended)
> 				break;
> 
>+			if (!pipe_output_combo_valid(&data.display, pipe, output))
>+				continue;
>+
> 			pipe_count++;
> 			igt_dynamic_f("pipe-%s-%s", kmstest_pipe_name(pipe), igt_output_name(output))
> 				run_primary_test(&data, pipe, output);
>@@ -1108,6 +1147,9 @@  igt_main_args("", long_opts, help_str, opt_handler, &data)
> 				if (pipe_count == 2 * count && !data.extended)
> 					break;
> 
>+				if (!pipe_output_combo_valid(&data.display, pipe, output))
>+					continue;
>+
> 				pipe_count++;
> 				igt_dynamic_f("pipe-%s-%s",
> 					      kmstest_pipe_name(pipe),

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight
  2022-11-02 17:08 Nidhi Gupta
  2022-11-04  2:34 ` Modem, Bhanuprakash
@ 2022-11-04 11:04 ` Hogander, Jouni
  1 sibling, 0 replies; 15+ messages in thread
From: Hogander, Jouni @ 2022-11-04 11:04 UTC (permalink / raw)
  To: igt-dev, Gupta, Nidhi1

On Wed, 2022-11-02 at 22:38 +0530, Nidhi Gupta wrote:
> Since driver can now support multiple eDPs and Debugfs structure for
> backlight changed per connector the test should then iterate through
> all eDP connectors.

I think you should split this patch as well. One which is adding
testing several eDPs which is described in this commit message and
another one doing the other change adding that array of tests structs
etc...

> 
> Signed-off-by: Nidhi Gupta <nidhi1.gupta@intel.com>
> Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
> ---
>  tests/i915/i915_pm_backlight.c | 208 ++++++++++++++++++++++++++++---
> ----------
>  1 file changed, 144 insertions(+), 64 deletions(-)
> 
> diff --git a/tests/i915/i915_pm_backlight.c
> b/tests/i915/i915_pm_backlight.c
> index cafae7f..54e51b7 100644
> --- a/tests/i915/i915_pm_backlight.c
> +++ b/tests/i915/i915_pm_backlight.c
> @@ -34,29 +34,39 @@
>  #include <errno.h>
>  #include <unistd.h>
>  #include <time.h>
> +#include "igt_device.h"
> +#include "igt_device_scan.h"
>  
>  struct context {
>         int max;
> +       igt_output_t *output;
> +       char path[PATH_MAX];
>  };
>  
> +enum {
> +       TEST_NONE = 0,
> +       TEST_DPMS,
> +       TEST_SUSPEND,
> +};
>  
>  #define TOLERANCE 5 /* percent */
> -#define BACKLIGHT_PATH "/sys/class/backlight/intel_backlight"
> +#define BACKLIGHT_PATH "/sys/class/backlight"
>  
>  #define FADESTEPS 10
>  #define FADESPEED 100 /* milliseconds between steps */
>  
> +#define NUM_EDP_OUTPUTS 2
> +
>  IGT_TEST_DESCRIPTION("Basic backlight sysfs test");
>  
> -static int backlight_read(int *result, const char *fname)
> +static int backlight_read(int *result, const char *fname, struct
> context *context)
>  {
>         int fd;
>         char full[PATH_MAX];
> -       char dst[64];
> +       char dst[512];

There is no need to change this.

>         int r, e;
>  
> -       igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH,
> fname) < PATH_MAX);
> -
> +       igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s",
> BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
>         fd = open(full, O_RDONLY);
>         if (fd == -1)
>                 return -errno;
> @@ -73,14 +83,14 @@ static int backlight_read(int *result, const char
> *fname)
>         return errno;
>  }
>  
> -static int backlight_write(int value, const char *fname)
> +static int backlight_write(int value, const char *fname, struct
> context *context)
>  {
>         int fd;
>         char full[PATH_MAX];
>         char src[64];
>         int len;
>  
> -       igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH,
> fname) < PATH_MAX);
> +       igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s",
> BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
>         fd = open(full, O_WRONLY);
>         if (fd == -1)
>                 return -errno;
> @@ -100,12 +110,12 @@ static void test_and_verify(struct context
> *context, int val)
>         const int tolerance = val * TOLERANCE / 100;
>         int result;
>  
> -       igt_assert_eq(backlight_write(val, "brightness"), 0);
> -       igt_assert_eq(backlight_read(&result, "brightness"), 0);
> +       igt_assert_eq(backlight_write(val, "brightness", context),
> 0);
> +       igt_assert_eq(backlight_read(&result, "brightness", context),
> 0);
>         /* Check that the exact value sticks */
>         igt_assert_eq(result, val);
>  
> -       igt_assert_eq(backlight_read(&result, "actual_brightness"),
> 0);
> +       igt_assert_eq(backlight_read(&result, "actual_brightness",
> context), 0);
>         /* Some rounding may happen depending on hw */
>         igt_assert_f(result >= max(0, val - tolerance) &&
>                      result <= min(context->max, val + tolerance),
> @@ -124,16 +134,16 @@ static void test_bad_brightness(struct context
> *context)
>  {
>         int val;
>         /* First write some sane value */
> -       backlight_write(context->max / 2, "brightness");
> +       backlight_write(context->max / 2, "brightness", context);
>         /* Writing invalid values should fail and not change the
> value */
> -       igt_assert_lt(backlight_write(-1, "brightness"), 0);
> -       backlight_read(&val, "brightness");
> +       igt_assert_lt(backlight_write(-1, "brightness", context), 0);
> +       backlight_read(&val, "brightness", context);
>         igt_assert_eq(val, context->max / 2);
> -       igt_assert_lt(backlight_write(context->max + 1,
> "brightness"), 0);
> -       backlight_read(&val, "brightness");
> +       igt_assert_lt(backlight_write(context->max + 1, "brightness",
> context), 0);
> +       backlight_read(&val, "brightness", context);
>         igt_assert_eq(val, context->max / 2);
> -       igt_assert_lt(backlight_write(INT_MAX, "brightness"), 0);
> -       backlight_read(&val, "brightness");
> +       igt_assert_lt(backlight_write(INT_MAX, "brightness",
> context), 0);
> +       backlight_read(&val, "brightness", context);
>         igt_assert_eq(val, context->max / 2);
>  }
>  
> @@ -154,7 +164,7 @@ static void test_fade(struct context *context)
>  }
>  
>  static void
> -test_fade_with_dpms(struct context *context, igt_output_t *output)
> +check_dpms(igt_output_t *output)
>  {
>         igt_require(igt_setup_runtime_pm(output->display->drm_fd));
>  
> @@ -167,33 +177,77 @@ test_fade_with_dpms(struct context *context,
> igt_output_t *output)
>                                    output->config.connector,
>                                    DRM_MODE_DPMS_ON);
>         igt_assert(igt_wait_for_pm_status(IGT_RUNTIME_PM_STATUS_ACTIV
> E));
> -
> -       test_fade(context);
>  }
>  
>  static void
> -test_fade_with_suspend(struct context *context, igt_output_t
> *output)
> +check_suspend(igt_output_t *output)
>  {
>         igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
> SUSPEND_TEST_NONE);
> +}
>  
> -       test_fade(context);
> +static void test_cleanup(igt_display_t *display, igt_output_t
> *output)
> +{
> +       igt_output_set_pipe(output, PIPE_NONE);
> +       igt_display_commit2(display, display->is_atomic ?
> COMMIT_ATOMIC : COMMIT_LEGACY);
> +       igt_pm_restore_sata_link_power_management();
> +}
> +
> +static void test_setup(igt_display_t display, igt_output_t *output)
> +{
> +       igt_plane_t *primary;
> +       drmModeModeInfo *mode;
> +       struct igt_fb fb;
> +       enum pipe pipe;
> +
> +       igt_display_reset(&display);
> +
> +       for_each_pipe(&display, pipe) {
> +               if (!igt_pipe_connector_valid(pipe, output))
> +                       continue;
> +
> +               igt_output_set_pipe(output, pipe);
> +               mode = igt_output_get_mode(output);
> +
> +               igt_create_pattern_fb(display.drm_fd,
> +                                     mode->hdisplay, mode->vdisplay,
> +                                     DRM_FORMAT_XRGB8888,
> +                                     DRM_FORMAT_MOD_LINEAR, &fb);
> +               primary = igt_output_get_plane_type(output,
> DRM_PLANE_TYPE_PRIMARY);
> +               igt_plane_set_fb(primary, &fb);
> +
> +               igt_display_commit2(&display, display.is_atomic ?
> COMMIT_ATOMIC : COMMIT_LEGACY);
> +               igt_pm_enable_sata_link_power_management();
> +
> +               break;
> +       }
>  }
>  
>  igt_main
>  {
> -       struct context context = {0};
> -       int old;
> +       int old, fd;
> +       int i = 0;
>         igt_display_t display;
>         igt_output_t *output;
> -       struct igt_fb fb;
> +       char file_path_n[PATH_MAX] = "";
> +       bool dual_edp = false;
> +       struct context contexts[NUM_EDP_OUTPUTS];
> +       struct {
> +               const char *name;
> +               const char *desc;
> +               void (*test_t) (struct context *);
> +               int flags;
> +       } tests[] = {
> +               { "basic-brightness", "desc", test_brightness,
> TEST_NONE },
> +               { "bad-brightness", "desc", test_bad_brightness,
> TEST_NONE },
> +               { "fade", "desc", test_fade, TEST_NONE },
> +               { "fade-with-dpms", "desc", test_fade, TEST_DPMS },
> +               { "fade-with-suspend", "desc", test_fade,
> TEST_SUSPEND },
> +       };
>  
>         igt_fixture {
> -               enum pipe pipe;
>                 bool found = false;
>                 char full_name[32] = {};
>                 char *name;
> -               drmModeModeInfo *mode;
> -               igt_plane_t *primary;
>  
>                 /*
>                  * Backlight tests requires the output to be enabled,
> @@ -202,56 +256,82 @@ igt_main
>                 kmstest_set_vt_graphics_mode();
>                 igt_display_require(&display,
> drm_open_driver(DRIVER_INTEL));
>  
> -               /* Get the max value and skip the whole test if sysfs
> interface not available */
> -               igt_skip_on(backlight_read(&old, "brightness"));
> -               igt_assert(backlight_read(&context.max,
> "max_brightness") > -1);
> +               for_each_connected_output(&display, output) {
> +                       if (output->config.connector->connector_type
> != DRM_MODE_CONNECTOR_eDP)
> +                               continue;
>  
> -               /* should be ../../cardX-$output */
> -               igt_assert_lt(12, readlink(BACKLIGHT_PATH "/device",
> full_name, sizeof(full_name) - 1));
> -               name = basename(full_name);
> +                       if (found)
> +                               snprintf(file_path_n, PATH_MAX,
> "%s/card%i-%s-backlight/brightness",
> +                                        BACKLIGHT_PATH,
> igt_device_get_card_index(display.drm_fd),
> +                                        igt_output_name(output));
> +                       else
> +                               snprintf(file_path_n, PATH_MAX,
> "%s/intel_backlight/brightness", BACKLIGHT_PATH);
>  
> -               for_each_pipe_with_valid_output(&display, pipe,
> output) {
> -                       if (strcmp(name + 6, output->name))
> +                       fd = open(file_path_n, O_RDONLY);
> +                       if (fd == -1) {
>                                 continue;
> -                       found = true;
> -                       break;
> +                       }
> +                       if (found)
> +                               snprintf(contexts[i].path, PATH_MAX,
> "card%i-%s-backlight",
> +                                       
> igt_device_get_card_index(display.drm_fd),
> +                                        igt_output_name(output));
> +                       else
> +                               snprintf(contexts[i].path, PATH_MAX,
> "intel_backlight");
> +
> +                       close(fd);
> +
> +                       /* should be ../../cardX-$output */
> +                       snprintf(file_path_n, PATH_MAX,
> "%s/%s/device", BACKLIGHT_PATH, contexts[i].path);
> +                       igt_assert_lt(16, readlink(file_path_n,
> full_name, sizeof(full_name) - 1));
> +                       name = basename(full_name);
> +
> +                       if (!strcmp(name + 6, output->name)) {
> +                               contexts[i++].output = output;
> +
> +                               if (found)
> +                                       dual_edp = true;
> +                               else
> +                                       found = true;
> +                       }
>                 }
> +               igt_require_f(found, "No valid output found.\n");
> +       }
>  
> -               igt_require_f(found,
> -                             "Could not map backlight for \"%s\" to
> connected output\n",
> -                             name);
> +       for (i = 0; i < ARRAY_SIZE(tests); i++) {
> +               igt_describe(tests[i].desc);
> +               igt_subtest_with_dynamic(tests[i].name) {
> +                       for (int j = 0; j < (dual_edp ? 2 : 1); j++)
> {
> +                               test_setup(display, &contexts-
> >output[j]);
>  
> -               igt_output_set_pipe(output, pipe);
> -               mode = igt_output_get_mode(output);
> +                               if (backlight_read(&old,
> "brightness", &contexts[j]))
> +                                       continue;
>  
> -               igt_create_pattern_fb(display.drm_fd,
> -                                     mode->hdisplay, mode->vdisplay,
> -                                     DRM_FORMAT_XRGB8888,
> -                                     DRM_FORMAT_MOD_LINEAR, &fb);
> -               primary = igt_output_get_plane_type(output,
> DRM_PLANE_TYPE_PRIMARY);
> -               igt_plane_set_fb(primary, &fb);
> +                               igt_assert(backlight_read(&contexts[j
> ].max, "max_brightness", &contexts[j]) > -1);
>  
> -               igt_display_commit2(&display, display.is_atomic ?
> COMMIT_ATOMIC : COMMIT_LEGACY);
> -               igt_pm_enable_sata_link_power_management();
> -       }
> +                               if (tests[i].flags == TEST_DPMS)
> +                                       check_dpms(contexts[j].output
> );
>  
> -       igt_subtest("basic-brightness")
> -               test_brightness(&context);
> -       igt_subtest("bad-brightness")
> -               test_bad_brightness(&context);
> -       igt_subtest("fade")
> -               test_fade(&context);
> -       igt_subtest("fade_with_dpms")
> -               test_fade_with_dpms(&context, output);
> -       igt_subtest("fade_with_suspend")
> -               test_fade_with_suspend(&context, output);
> +                               if (tests[i].flags == TEST_SUSPEND)
> +                                       check_suspend(contexts[j].out
> put);
> +
> +                               igt_dynamic_f("%s",
> igt_output_name(contexts[j].output)) {
> +                                       igt_assert(backlight_read(&co
> ntexts[j].max, "max_brightness", &contexts[j]) > -1);
> +                                       tests[i].test_t(&contexts[j])
> ;
> +                               }
> +
> +                               test_cleanup(&display, output);
> +                       }
> +                       /* TODO: Add tests for dual eDP. */
> +               }
> +       }
>  
>         igt_fixture {
>                 /* Restore old brightness */
> -               backlight_write(old, "brightness");
> +               for (int j = 0; j < (dual_edp ? 2 : 1); j++) {
> +                       backlight_write(old, "brightness",
> &contexts[j]);
> +               }
>  
>                 igt_display_fini(&display);
> -               igt_remove_fb(display.drm_fd, &fb);
>                 igt_pm_restore_sata_link_power_management();
>                 close(display.drm_fd);
>         }


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight
  2022-11-02 17:08 Nidhi Gupta
@ 2022-11-04  2:34 ` Modem, Bhanuprakash
  2022-11-04 11:04 ` Hogander, Jouni
  1 sibling, 0 replies; 15+ messages in thread
From: Modem, Bhanuprakash @ 2022-11-04  2:34 UTC (permalink / raw)
  To: Nidhi Gupta, igt-dev

On Wed-02-11-2022 10:38 pm, Nidhi Gupta wrote:
> Since driver can now support multiple eDPs and Debugfs structure for
> backlight changed per connector the test should then iterate through
> all eDP connectors.
> 
> Signed-off-by: Nidhi Gupta <nidhi1.gupta@intel.com>
> Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
> ---
>   tests/i915/i915_pm_backlight.c | 208 ++++++++++++++++++++++++++++-------------
>   1 file changed, 144 insertions(+), 64 deletions(-)
> 
> diff --git a/tests/i915/i915_pm_backlight.c b/tests/i915/i915_pm_backlight.c
> index cafae7f..54e51b7 100644
> --- a/tests/i915/i915_pm_backlight.c
> +++ b/tests/i915/i915_pm_backlight.c
> @@ -34,29 +34,39 @@
>   #include <errno.h>
>   #include <unistd.h>
>   #include <time.h>
> +#include "igt_device.h"
> +#include "igt_device_scan.h"
>   
>   struct context {
>   	int max;
> +	igt_output_t *output;
> +	char path[PATH_MAX];
>   };
>   
> +enum {
> +	TEST_NONE = 0,
> +	TEST_DPMS,
> +	TEST_SUSPEND,
> +};
>   
>   #define TOLERANCE 5 /* percent */
> -#define BACKLIGHT_PATH "/sys/class/backlight/intel_backlight"
> +#define BACKLIGHT_PATH "/sys/class/backlight"
>   
>   #define FADESTEPS 10
>   #define FADESPEED 100 /* milliseconds between steps */
>   
> +#define NUM_EDP_OUTPUTS 2
> +
>   IGT_TEST_DESCRIPTION("Basic backlight sysfs test");
>   
> -static int backlight_read(int *result, const char *fname)
> +static int backlight_read(int *result, const char *fname, struct context *context)
>   {
>   	int fd;
>   	char full[PATH_MAX];
> -	char dst[64];
> +	char dst[512];
>   	int r, e;
>   
> -	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
> -
> +	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);

As we are using dynamic subtests, don't assert here. Instead return some 
error.

>   	fd = open(full, O_RDONLY);
>   	if (fd == -1)
>   		return -errno;
> @@ -73,14 +83,14 @@ static int backlight_read(int *result, const char *fname)
>   	return errno;
>   }
>   
> -static int backlight_write(int value, const char *fname)
> +static int backlight_write(int value, const char *fname, struct context *context)
>   {
>   	int fd;
>   	char full[PATH_MAX];
>   	char src[64];
>   	int len;
>   
> -	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
> +	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);

Please check above comment.

>   	fd = open(full, O_WRONLY);
>   	if (fd == -1)
>   		return -errno;
> @@ -100,12 +110,12 @@ static void test_and_verify(struct context *context, int val)
>   	const int tolerance = val * TOLERANCE / 100;
>   	int result;
>   
> -	igt_assert_eq(backlight_write(val, "brightness"), 0);
> -	igt_assert_eq(backlight_read(&result, "brightness"), 0);
> +	igt_assert_eq(backlight_write(val, "brightness", context), 0);
> +	igt_assert_eq(backlight_read(&result, "brightness", context), 0);
>   	/* Check that the exact value sticks */
>   	igt_assert_eq(result, val);
>   
> -	igt_assert_eq(backlight_read(&result, "actual_brightness"), 0);
> +	igt_assert_eq(backlight_read(&result, "actual_brightness", context), 0);
>   	/* Some rounding may happen depending on hw */
>   	igt_assert_f(result >= max(0, val - tolerance) &&
>   		     result <= min(context->max, val + tolerance),
> @@ -124,16 +134,16 @@ static void test_bad_brightness(struct context *context)
>   {
>   	int val;
>   	/* First write some sane value */
> -	backlight_write(context->max / 2, "brightness");
> +	backlight_write(context->max / 2, "brightness", context);
>   	/* Writing invalid values should fail and not change the value */
> -	igt_assert_lt(backlight_write(-1, "brightness"), 0);
> -	backlight_read(&val, "brightness");
> +	igt_assert_lt(backlight_write(-1, "brightness", context), 0);
> +	backlight_read(&val, "brightness", context);
>   	igt_assert_eq(val, context->max / 2);
> -	igt_assert_lt(backlight_write(context->max + 1, "brightness"), 0);
> -	backlight_read(&val, "brightness");
> +	igt_assert_lt(backlight_write(context->max + 1, "brightness", context), 0);
> +	backlight_read(&val, "brightness", context);
>   	igt_assert_eq(val, context->max / 2);
> -	igt_assert_lt(backlight_write(INT_MAX, "brightness"), 0);
> -	backlight_read(&val, "brightness");
> +	igt_assert_lt(backlight_write(INT_MAX, "brightness", context), 0);
> +	backlight_read(&val, "brightness", context);
>   	igt_assert_eq(val, context->max / 2);
>   }
>   
> @@ -154,7 +164,7 @@ static void test_fade(struct context *context)
>   }
>   
>   static void
> -test_fade_with_dpms(struct context *context, igt_output_t *output)
> +check_dpms(igt_output_t *output)
>   {
>   	igt_require(igt_setup_runtime_pm(output->display->drm_fd));

Please check above comments.

>   
> @@ -167,33 +177,77 @@ test_fade_with_dpms(struct context *context, igt_output_t *output)
>   				   output->config.connector,
>   				   DRM_MODE_DPMS_ON);
>   	igt_assert(igt_wait_for_pm_status(IGT_RUNTIME_PM_STATUS_ACTIVE));

Please check above comments.

> -
> -	test_fade(context);
>   }
>   
>   static void
> -test_fade_with_suspend(struct context *context, igt_output_t *output)
> +check_suspend(igt_output_t *output)
>   {
>   	igt_system_suspend_autoresume(SUSPEND_STATE_MEM, SUSPEND_TEST_NONE);
> +}
>   
> -	test_fade(context);
> +static void test_cleanup(igt_display_t *display, igt_output_t *output)
> +{
> +	igt_output_set_pipe(output, PIPE_NONE);
> +	igt_display_commit2(display, display->is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
> +	igt_pm_restore_sata_link_power_management();
> +}
> +
> +static void test_setup(igt_display_t display, igt_output_t *output)
> +{
> +	igt_plane_t *primary;
> +	drmModeModeInfo *mode;
> +	struct igt_fb fb;
> +	enum pipe pipe;
> +
> +	igt_display_reset(&display);
> +
> +	for_each_pipe(&display, pipe) {
> +		if (!igt_pipe_connector_valid(pipe, output))
> +			continue;
> +
> +		igt_output_set_pipe(output, pipe);
> +		mode = igt_output_get_mode(output);
> +
> +		igt_create_pattern_fb(display.drm_fd,
> +				      mode->hdisplay, mode->vdisplay,
> +				      DRM_FORMAT_XRGB8888,
> +				      DRM_FORMAT_MOD_LINEAR, &fb);
> +		primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> +		igt_plane_set_fb(primary, &fb);
> +
> +		igt_display_commit2(&display, display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
> +		igt_pm_enable_sata_link_power_management();
> +
> +		break;
> +	}

There is a possibility that all pipes are invalid to use the selected 
output.

>   }
>   
>   igt_main
>   {
> -	struct context context = {0};
> -	int old;
> +	int old, fd;
> +	int i = 0;
>   	igt_display_t display;
>   	igt_output_t *output;
> -	struct igt_fb fb;
> +	char file_path_n[PATH_MAX] = "";
> +	bool dual_edp = false;
> +	struct context contexts[NUM_EDP_OUTPUTS];
> +	struct {
> +		const char *name;
> +		const char *desc;
> +		void (*test_t) (struct context *);
> +		int flags;
> +	} tests[] = {
> +		{ "basic-brightness", "desc", test_brightness, TEST_NONE },
> +		{ "bad-brightness", "desc", test_bad_brightness, TEST_NONE },
> +		{ "fade", "desc", test_fade, TEST_NONE },
> +		{ "fade-with-dpms", "desc", test_fade, TEST_DPMS },
> +		{ "fade-with-suspend", "desc", test_fade, TEST_SUSPEND },
> +	};
>   
>   	igt_fixture {
> -		enum pipe pipe;
>   		bool found = false;
>   		char full_name[32] = {};
>   		char *name;
> -		drmModeModeInfo *mode;
> -		igt_plane_t *primary;
>   
>   		/*
>   		 * Backlight tests requires the output to be enabled,
> @@ -202,56 +256,82 @@ igt_main
>   		kmstest_set_vt_graphics_mode();
>   		igt_display_require(&display, drm_open_driver(DRIVER_INTEL));
>   
> -		/* Get the max value and skip the whole test if sysfs interface not available */
> -		igt_skip_on(backlight_read(&old, "brightness"));
> -		igt_assert(backlight_read(&context.max, "max_brightness") > -1);
> +		for_each_connected_output(&display, output) {
> +			if (output->config.connector->connector_type != DRM_MODE_CONNECTOR_eDP)
> +				continue;
>   
> -		/* should be ../../cardX-$output */
> -		igt_assert_lt(12, readlink(BACKLIGHT_PATH "/device", full_name, sizeof(full_name) - 1));
> -		name = basename(full_name);
> +			if (found)
> +				snprintf(file_path_n, PATH_MAX, "%s/card%i-%s-backlight/brightness",
> +					 BACKLIGHT_PATH, igt_device_get_card_index(display.drm_fd),
> +					 igt_output_name(output));
> +			else
> +				snprintf(file_path_n, PATH_MAX, "%s/intel_backlight/brightness", BACKLIGHT_PATH);

It is perfectly fine, if display->outputs[] exposes list of connectors 
as eDP-1 followed by eDP-2. In case the order got changed, this code 
does't work.

>   
> -		for_each_pipe_with_valid_output(&display, pipe, output) {
> -			if (strcmp(name + 6, output->name))
> +			fd = open(file_path_n, O_RDONLY);
> +			if (fd == -1) {
>   				continue;
> -			found = true;
> -			break;
> +			}
> +			if (found)
> +				snprintf(contexts[i].path, PATH_MAX, "card%i-%s-backlight",
> +					 igt_device_get_card_index(display.drm_fd),
> +					 igt_output_name(output));
> +			else
> +				snprintf(contexts[i].path, PATH_MAX, "intel_backlight");
> +
> +			close(fd);
> +
> +			/* should be ../../cardX-$output */
> +			snprintf(file_path_n, PATH_MAX, "%s/%s/device", BACKLIGHT_PATH, contexts[i].path);
> +			igt_assert_lt(16, readlink(file_path_n, full_name, sizeof(full_name) - 1));
> +			name = basename(full_name);
> +
> +			if (!strcmp(name + 6, output->name)) {
> +				contexts[i++].output = output;
> +
> +				if (found)
> +					dual_edp = true;
> +				else
> +					found = true;
> +			}

Once we find the duel edp, there is no point in checking for other 
connectors.

>   		}
> +		igt_require_f(found, "No valid output found.\n");
> +	}
>   
> -		igt_require_f(found,
> -			      "Could not map backlight for \"%s\" to connected output\n",
> -			      name);
> +	for (i = 0; i < ARRAY_SIZE(tests); i++) {
> +		igt_describe(tests[i].desc);
> +		igt_subtest_with_dynamic(tests[i].name) {

Probably, we should have a separate patch for dynamic subtests.

> +			for (int j = 0; j < (dual_edp ? 2 : 1); j++) {
> +				test_setup(display, &contexts->output[j]);
>   
> -		igt_output_set_pipe(output, pipe);
> -		mode = igt_output_get_mode(output);
> +				if (backlight_read(&old, "brightness", &contexts[j]))
> +					continue;
>   
> -		igt_create_pattern_fb(display.drm_fd,
> -				      mode->hdisplay, mode->vdisplay,
> -				      DRM_FORMAT_XRGB8888,
> -				      DRM_FORMAT_MOD_LINEAR, &fb);
> -		primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> -		igt_plane_set_fb(primary, &fb);
> +				igt_assert(backlight_read(&contexts[j].max, "max_brightness", &contexts[j]) > -1);

Please drop this. This is redundant & also igt_assert is not allowed 
inside the igt_subtest_with_dynamic() before execting the igt_dynamic() 
block.

>   
> -		igt_display_commit2(&display, display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
> -		igt_pm_enable_sata_link_power_management();
> -	}
> +				if (tests[i].flags == TEST_DPMS)
> +					check_dpms(contexts[j].output);
>   
> -	igt_subtest("basic-brightness")
> -		test_brightness(&context);
> -	igt_subtest("bad-brightness")
> -		test_bad_brightness(&context);
> -	igt_subtest("fade")
> -		test_fade(&context);
> -	igt_subtest("fade_with_dpms")
> -		test_fade_with_dpms(&context, output);
> -	igt_subtest("fade_with_suspend")
> -		test_fade_with_suspend(&context, output);
> +				if (tests[i].flags == TEST_SUSPEND)
> +					check_suspend(contexts[j].output);
> +
> +				igt_dynamic_f("%s", igt_output_name(contexts[j].output)) {
> +					igt_assert(backlight_read(&contexts[j].max, "max_brightness", &contexts[j]) > -1);
> +					tests[i].test_t(&contexts[j]);
> +				}
> +
> +				test_cleanup(&display, output);
> +			}
> +			/* TODO: Add tests for dual eDP. */
> +		}
> +	}
>   
>   	igt_fixture {
>   		/* Restore old brightness */
> -		backlight_write(old, "brightness");
> +		for (int j = 0; j < (dual_edp ? 2 : 1); j++) {
> +			backlight_write(old, "brightness", &contexts[j]);

Same "old" content for both the eDPs?

- Bhanu

> +		}
>   
>   		igt_display_fini(&display);
> -		igt_remove_fb(display.drm_fd, &fb);
>   		igt_pm_restore_sata_link_power_management();
>   		close(display.drm_fd);
>   	}

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight
@ 2022-11-02 17:08 Nidhi Gupta
  2022-11-04  2:34 ` Modem, Bhanuprakash
  2022-11-04 11:04 ` Hogander, Jouni
  0 siblings, 2 replies; 15+ messages in thread
From: Nidhi Gupta @ 2022-11-02 17:08 UTC (permalink / raw)
  To: igt-dev; +Cc: Nidhi Gupta

Since driver can now support multiple eDPs and Debugfs structure for
backlight changed per connector the test should then iterate through
all eDP connectors.

Signed-off-by: Nidhi Gupta <nidhi1.gupta@intel.com>
Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
---
 tests/i915/i915_pm_backlight.c | 208 ++++++++++++++++++++++++++++-------------
 1 file changed, 144 insertions(+), 64 deletions(-)

diff --git a/tests/i915/i915_pm_backlight.c b/tests/i915/i915_pm_backlight.c
index cafae7f..54e51b7 100644
--- a/tests/i915/i915_pm_backlight.c
+++ b/tests/i915/i915_pm_backlight.c
@@ -34,29 +34,39 @@
 #include <errno.h>
 #include <unistd.h>
 #include <time.h>
+#include "igt_device.h"
+#include "igt_device_scan.h"
 
 struct context {
 	int max;
+	igt_output_t *output;
+	char path[PATH_MAX];
 };
 
+enum {
+	TEST_NONE = 0,
+	TEST_DPMS,
+	TEST_SUSPEND,
+};
 
 #define TOLERANCE 5 /* percent */
-#define BACKLIGHT_PATH "/sys/class/backlight/intel_backlight"
+#define BACKLIGHT_PATH "/sys/class/backlight"
 
 #define FADESTEPS 10
 #define FADESPEED 100 /* milliseconds between steps */
 
+#define NUM_EDP_OUTPUTS 2
+
 IGT_TEST_DESCRIPTION("Basic backlight sysfs test");
 
-static int backlight_read(int *result, const char *fname)
+static int backlight_read(int *result, const char *fname, struct context *context)
 {
 	int fd;
 	char full[PATH_MAX];
-	char dst[64];
+	char dst[512];
 	int r, e;
 
-	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
-
+	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
 	fd = open(full, O_RDONLY);
 	if (fd == -1)
 		return -errno;
@@ -73,14 +83,14 @@ static int backlight_read(int *result, const char *fname)
 	return errno;
 }
 
-static int backlight_write(int value, const char *fname)
+static int backlight_write(int value, const char *fname, struct context *context)
 {
 	int fd;
 	char full[PATH_MAX];
 	char src[64];
 	int len;
 
-	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
+	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
 	fd = open(full, O_WRONLY);
 	if (fd == -1)
 		return -errno;
@@ -100,12 +110,12 @@ static void test_and_verify(struct context *context, int val)
 	const int tolerance = val * TOLERANCE / 100;
 	int result;
 
-	igt_assert_eq(backlight_write(val, "brightness"), 0);
-	igt_assert_eq(backlight_read(&result, "brightness"), 0);
+	igt_assert_eq(backlight_write(val, "brightness", context), 0);
+	igt_assert_eq(backlight_read(&result, "brightness", context), 0);
 	/* Check that the exact value sticks */
 	igt_assert_eq(result, val);
 
-	igt_assert_eq(backlight_read(&result, "actual_brightness"), 0);
+	igt_assert_eq(backlight_read(&result, "actual_brightness", context), 0);
 	/* Some rounding may happen depending on hw */
 	igt_assert_f(result >= max(0, val - tolerance) &&
 		     result <= min(context->max, val + tolerance),
@@ -124,16 +134,16 @@ static void test_bad_brightness(struct context *context)
 {
 	int val;
 	/* First write some sane value */
-	backlight_write(context->max / 2, "brightness");
+	backlight_write(context->max / 2, "brightness", context);
 	/* Writing invalid values should fail and not change the value */
-	igt_assert_lt(backlight_write(-1, "brightness"), 0);
-	backlight_read(&val, "brightness");
+	igt_assert_lt(backlight_write(-1, "brightness", context), 0);
+	backlight_read(&val, "brightness", context);
 	igt_assert_eq(val, context->max / 2);
-	igt_assert_lt(backlight_write(context->max + 1, "brightness"), 0);
-	backlight_read(&val, "brightness");
+	igt_assert_lt(backlight_write(context->max + 1, "brightness", context), 0);
+	backlight_read(&val, "brightness", context);
 	igt_assert_eq(val, context->max / 2);
-	igt_assert_lt(backlight_write(INT_MAX, "brightness"), 0);
-	backlight_read(&val, "brightness");
+	igt_assert_lt(backlight_write(INT_MAX, "brightness", context), 0);
+	backlight_read(&val, "brightness", context);
 	igt_assert_eq(val, context->max / 2);
 }
 
@@ -154,7 +164,7 @@ static void test_fade(struct context *context)
 }
 
 static void
-test_fade_with_dpms(struct context *context, igt_output_t *output)
+check_dpms(igt_output_t *output)
 {
 	igt_require(igt_setup_runtime_pm(output->display->drm_fd));
 
@@ -167,33 +177,77 @@ test_fade_with_dpms(struct context *context, igt_output_t *output)
 				   output->config.connector,
 				   DRM_MODE_DPMS_ON);
 	igt_assert(igt_wait_for_pm_status(IGT_RUNTIME_PM_STATUS_ACTIVE));
-
-	test_fade(context);
 }
 
 static void
-test_fade_with_suspend(struct context *context, igt_output_t *output)
+check_suspend(igt_output_t *output)
 {
 	igt_system_suspend_autoresume(SUSPEND_STATE_MEM, SUSPEND_TEST_NONE);
+}
 
-	test_fade(context);
+static void test_cleanup(igt_display_t *display, igt_output_t *output)
+{
+	igt_output_set_pipe(output, PIPE_NONE);
+	igt_display_commit2(display, display->is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
+	igt_pm_restore_sata_link_power_management();
+}
+
+static void test_setup(igt_display_t display, igt_output_t *output)
+{
+	igt_plane_t *primary;
+	drmModeModeInfo *mode;
+	struct igt_fb fb;
+	enum pipe pipe;
+
+	igt_display_reset(&display);
+
+	for_each_pipe(&display, pipe) {
+		if (!igt_pipe_connector_valid(pipe, output))
+			continue;
+
+		igt_output_set_pipe(output, pipe);
+		mode = igt_output_get_mode(output);
+
+		igt_create_pattern_fb(display.drm_fd,
+				      mode->hdisplay, mode->vdisplay,
+				      DRM_FORMAT_XRGB8888,
+				      DRM_FORMAT_MOD_LINEAR, &fb);
+		primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
+		igt_plane_set_fb(primary, &fb);
+
+		igt_display_commit2(&display, display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
+		igt_pm_enable_sata_link_power_management();
+
+		break;
+	}
 }
 
 igt_main
 {
-	struct context context = {0};
-	int old;
+	int old, fd;
+	int i = 0;
 	igt_display_t display;
 	igt_output_t *output;
-	struct igt_fb fb;
+	char file_path_n[PATH_MAX] = "";
+	bool dual_edp = false;
+	struct context contexts[NUM_EDP_OUTPUTS];
+	struct {
+		const char *name;
+		const char *desc;
+		void (*test_t) (struct context *);
+		int flags;
+	} tests[] = {
+		{ "basic-brightness", "desc", test_brightness, TEST_NONE },
+		{ "bad-brightness", "desc", test_bad_brightness, TEST_NONE },
+		{ "fade", "desc", test_fade, TEST_NONE },
+		{ "fade-with-dpms", "desc", test_fade, TEST_DPMS },
+		{ "fade-with-suspend", "desc", test_fade, TEST_SUSPEND },
+	};
 
 	igt_fixture {
-		enum pipe pipe;
 		bool found = false;
 		char full_name[32] = {};
 		char *name;
-		drmModeModeInfo *mode;
-		igt_plane_t *primary;
 
 		/*
 		 * Backlight tests requires the output to be enabled,
@@ -202,56 +256,82 @@ igt_main
 		kmstest_set_vt_graphics_mode();
 		igt_display_require(&display, drm_open_driver(DRIVER_INTEL));
 
-		/* Get the max value and skip the whole test if sysfs interface not available */
-		igt_skip_on(backlight_read(&old, "brightness"));
-		igt_assert(backlight_read(&context.max, "max_brightness") > -1);
+		for_each_connected_output(&display, output) {
+			if (output->config.connector->connector_type != DRM_MODE_CONNECTOR_eDP)
+				continue;
 
-		/* should be ../../cardX-$output */
-		igt_assert_lt(12, readlink(BACKLIGHT_PATH "/device", full_name, sizeof(full_name) - 1));
-		name = basename(full_name);
+			if (found)
+				snprintf(file_path_n, PATH_MAX, "%s/card%i-%s-backlight/brightness",
+					 BACKLIGHT_PATH, igt_device_get_card_index(display.drm_fd),
+					 igt_output_name(output));
+			else
+				snprintf(file_path_n, PATH_MAX, "%s/intel_backlight/brightness", BACKLIGHT_PATH);
 
-		for_each_pipe_with_valid_output(&display, pipe, output) {
-			if (strcmp(name + 6, output->name))
+			fd = open(file_path_n, O_RDONLY);
+			if (fd == -1) {
 				continue;
-			found = true;
-			break;
+			}
+			if (found)
+				snprintf(contexts[i].path, PATH_MAX, "card%i-%s-backlight",
+					 igt_device_get_card_index(display.drm_fd),
+					 igt_output_name(output));
+			else
+				snprintf(contexts[i].path, PATH_MAX, "intel_backlight");
+
+			close(fd);
+
+			/* should be ../../cardX-$output */
+			snprintf(file_path_n, PATH_MAX, "%s/%s/device", BACKLIGHT_PATH, contexts[i].path);
+			igt_assert_lt(16, readlink(file_path_n, full_name, sizeof(full_name) - 1));
+			name = basename(full_name);
+
+			if (!strcmp(name + 6, output->name)) {
+				contexts[i++].output = output;
+
+				if (found)
+					dual_edp = true;
+				else
+					found = true;
+			}
 		}
+		igt_require_f(found, "No valid output found.\n");
+	}
 
-		igt_require_f(found,
-			      "Could not map backlight for \"%s\" to connected output\n",
-			      name);
+	for (i = 0; i < ARRAY_SIZE(tests); i++) {
+		igt_describe(tests[i].desc);
+		igt_subtest_with_dynamic(tests[i].name) {
+			for (int j = 0; j < (dual_edp ? 2 : 1); j++) {
+				test_setup(display, &contexts->output[j]);
 
-		igt_output_set_pipe(output, pipe);
-		mode = igt_output_get_mode(output);
+				if (backlight_read(&old, "brightness", &contexts[j]))
+					continue;
 
-		igt_create_pattern_fb(display.drm_fd,
-				      mode->hdisplay, mode->vdisplay,
-				      DRM_FORMAT_XRGB8888,
-				      DRM_FORMAT_MOD_LINEAR, &fb);
-		primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
-		igt_plane_set_fb(primary, &fb);
+				igt_assert(backlight_read(&contexts[j].max, "max_brightness", &contexts[j]) > -1);
 
-		igt_display_commit2(&display, display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
-		igt_pm_enable_sata_link_power_management();
-	}
+				if (tests[i].flags == TEST_DPMS)
+					check_dpms(contexts[j].output);
 
-	igt_subtest("basic-brightness")
-		test_brightness(&context);
-	igt_subtest("bad-brightness")
-		test_bad_brightness(&context);
-	igt_subtest("fade")
-		test_fade(&context);
-	igt_subtest("fade_with_dpms")
-		test_fade_with_dpms(&context, output);
-	igt_subtest("fade_with_suspend")
-		test_fade_with_suspend(&context, output);
+				if (tests[i].flags == TEST_SUSPEND)
+					check_suspend(contexts[j].output);
+
+				igt_dynamic_f("%s", igt_output_name(contexts[j].output)) {
+					igt_assert(backlight_read(&contexts[j].max, "max_brightness", &contexts[j]) > -1);
+					tests[i].test_t(&contexts[j]);
+				}
+
+				test_cleanup(&display, output);
+			}
+			/* TODO: Add tests for dual eDP. */
+		}
+	}
 
 	igt_fixture {
 		/* Restore old brightness */
-		backlight_write(old, "brightness");
+		for (int j = 0; j < (dual_edp ? 2 : 1); j++) {
+			backlight_write(old, "brightness", &contexts[j]);
+		}
 
 		igt_display_fini(&display);
-		igt_remove_fb(display.drm_fd, &fb);
 		igt_pm_restore_sata_link_power_management();
 		close(display.drm_fd);
 	}
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight
  2022-09-29  9:28 Nidhi Gupta
  2022-10-03 11:01 ` Hogander, Jouni
@ 2022-10-03 13:31 ` Kamil Konieczny
  1 sibling, 0 replies; 15+ messages in thread
From: Kamil Konieczny @ 2022-10-03 13:31 UTC (permalink / raw)
  To: igt-dev; +Cc: Nidhi Gupta, Arun R Murthy, Petri Latvala

Hi Nidhi,

On 2022-09-29 at 14:58:45 +0530, Nidhi Gupta wrote:
> Since driver can now support multiple eDPs and Debugfs structure for
> backlight changed per connector the test should then iterate through
> all eDP connectors.
> 
> Signed-off-by: Nidhi Gupta <nidhi1.gupta@intel.com>

I will not review kms parts, only some notes about descriptions,
see below.

> ---
>  tests/i915/i915_pm_backlight.c | 110 ++++++++++++++++++++++++---------
>  1 file changed, 80 insertions(+), 30 deletions(-)
> 
> diff --git a/tests/i915/i915_pm_backlight.c b/tests/i915/i915_pm_backlight.c
> index cafae7f7..bf67b50c 100644
> --- a/tests/i915/i915_pm_backlight.c
> +++ b/tests/i915/i915_pm_backlight.c
> @@ -34,9 +34,12 @@
>  #include <errno.h>
>  #include <unistd.h>
>  #include <time.h>
> +#include "igt_device.h"
> +#include "igt_device_scan.h"
>  
>  struct context {
>  	int max;
> +	const char *path;
>  };
>  
>  
> @@ -48,14 +51,14 @@ struct context {
>  
>  IGT_TEST_DESCRIPTION("Basic backlight sysfs test");
>  
> -static int backlight_read(int *result, const char *fname)
> +static int backlight_read(int *result, const char *fname, struct context *context)
>  {
>  	int fd;
>  	char full[PATH_MAX];
>  	char dst[64];
>  	int r, e;
>  
> -	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
> +	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
>  
>  	fd = open(full, O_RDONLY);
>  	if (fd == -1)
> @@ -73,14 +76,14 @@ static int backlight_read(int *result, const char *fname)
>  	return errno;
>  }
>  
> -static int backlight_write(int value, const char *fname)
> +static int backlight_write(int value, const char *fname, struct context *context)
>  {
>  	int fd;
>  	char full[PATH_MAX];
>  	char src[64];
>  	int len;
>  
> -	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
> +	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
>  	fd = open(full, O_WRONLY);
>  	if (fd == -1)
>  		return -errno;
> @@ -100,12 +103,12 @@ static void test_and_verify(struct context *context, int val)
>  	const int tolerance = val * TOLERANCE / 100;
>  	int result;
>  
> -	igt_assert_eq(backlight_write(val, "brightness"), 0);
> -	igt_assert_eq(backlight_read(&result, "brightness"), 0);
> +	igt_assert_eq(backlight_write(val, "brightness", context), 0);
> +	igt_assert_eq(backlight_read(&result, "brightness", context), 0);
>  	/* Check that the exact value sticks */
>  	igt_assert_eq(result, val);
>  
> -	igt_assert_eq(backlight_read(&result, "actual_brightness"), 0);
> +	igt_assert_eq(backlight_read(&result, "actual_brightness", context), 0);
>  	/* Some rounding may happen depending on hw */
>  	igt_assert_f(result >= max(0, val - tolerance) &&
>  		     result <= min(context->max, val + tolerance),
> @@ -124,16 +127,16 @@ static void test_bad_brightness(struct context *context)
>  {
>  	int val;
>  	/* First write some sane value */
> -	backlight_write(context->max / 2, "brightness");
> +	backlight_write(context->max / 2, "brightness", context);
>  	/* Writing invalid values should fail and not change the value */
> -	igt_assert_lt(backlight_write(-1, "brightness"), 0);
> -	backlight_read(&val, "brightness");
> +	igt_assert_lt(backlight_write(-1, "brightness", context), 0);
> +	backlight_read(&val, "brightness", context);
>  	igt_assert_eq(val, context->max / 2);
> -	igt_assert_lt(backlight_write(context->max + 1, "brightness"), 0);
> -	backlight_read(&val, "brightness");
> +	igt_assert_lt(backlight_write(context->max + 1, "brightness", context), 0);
> +	backlight_read(&val, "brightness", context);
>  	igt_assert_eq(val, context->max / 2);
> -	igt_assert_lt(backlight_write(INT_MAX, "brightness"), 0);
> -	backlight_read(&val, "brightness");
> +	igt_assert_lt(backlight_write(INT_MAX, "brightness", context), 0);
> +	backlight_read(&val, "brightness", context);
>  	igt_assert_eq(val, context->max / 2);
>  }
>  
> @@ -186,6 +189,8 @@ igt_main
>  	igt_display_t display;
>  	igt_output_t *output;
>  	struct igt_fb fb;
> +	const char *paths[2][50];
> +	char path1[PATH_MAX];
>  
>  	igt_fixture {
>  		enum pipe pipe;
> @@ -202,10 +207,6 @@ igt_main
>  		kmstest_set_vt_graphics_mode();
>  		igt_display_require(&display, drm_open_driver(DRIVER_INTEL));
>  
> -		/* Get the max value and skip the whole test if sysfs interface not available */
> -		igt_skip_on(backlight_read(&old, "brightness"));
> -		igt_assert(backlight_read(&context.max, "max_brightness") > -1);
> -
>  		/* should be ../../cardX-$output */
>  		igt_assert_lt(12, readlink(BACKLIGHT_PATH "/device", full_name, sizeof(full_name) - 1));
>  		name = basename(full_name);
> @@ -233,22 +234,71 @@ igt_main
>  
>  		igt_display_commit2(&display, display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
>  		igt_pm_enable_sata_link_power_management();
> +
> +		memcpy(paths[0], "intel_backlight", 8);
> +		for (int i = 0; (i = display.n_outputs); i++) {
> +			output = &display.outputs[i];
> +			igt_output_set_pipe(output, PIPE_ANY);
> +			snprintf(path1, 100 , "card%i-%s-backlight", igt_device_get_card_index(display.drm_fd), igt_output_name(output));
> +			int fd = open(path1, O_WRONLY);
> +			if (fd == -1)
> +				continue;
> +			memcpy(paths[1], name, 30);
> +			break;
> +		}
> +		/* Get the max value and skip the whole test if sysfs interface not available */
> +		for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) {
> +			memcpy(&context.path, paths[i], 8);
> +			igt_skip_on(backlight_read(&old, "brightness", &context));
> +			igt_assert(backlight_read(&context.max, "max_brightness", &context) > -1);
> +		}
> +	}
> +	

Please add here description to new test with igt_describe().

> +	igt_subtest_with_dynamic("basic-brightness") {
> +		for (size_t j = 0; j < sizeof(paths) / sizeof(paths[0]); j++) {
> +			igt_dynamic_f("connector-%zu", j) {
> +				memcpy(&context.path, paths[j], 8);
> +				test_brightness(&context);
> +			}
> +		}
> +	}

Same here plus add newline.

> +	igt_subtest_with_dynamic("bad-brightness") {
> +		for (size_t j = 0; j < sizeof(paths) / sizeof(paths[0]); j++) {
> +			igt_dynamic_f("connector-%zu", j) {
> +				memcpy(&context.path, paths[j], 8);
> +				test_bad_brightness(&context);
> +			}
> +		}
> +	}
> +

Same here.

> +	igt_subtest_with_dynamic("fade") {
> +		for (size_t j = 0; j < sizeof(paths) / sizeof(paths[0]); j++) {
> +			igt_dynamic_f("connector-%zu", j) {
> +				memcpy(&context.path, paths[j], 8);
> +				test_fade(&context);
> +			}
> +		}
>  	}
>  
> -	igt_subtest("basic-brightness")
> -		test_brightness(&context);
> -	igt_subtest("bad-brightness")
> -		test_bad_brightness(&context);
> -	igt_subtest("fade")
> -		test_fade(&context);
> -	igt_subtest("fade_with_dpms")
> -		test_fade_with_dpms(&context, output);
> -	igt_subtest("fade_with_suspend")
> -		test_fade_with_suspend(&context, output);

btw if you do not mind, please also prepare patch which add
descriptions here.

> +	igt_subtest_with_dynamic("fade_with_dpms") {
> +		for (size_t j = 0; j < sizeof(paths) / sizeof(paths[0]); j++) {
> +			igt_dynamic_f("connector-%zu", j) {
> +				memcpy(&context.path, paths[j], 8);
> +				test_fade_with_dpms(&context, output);
> +			}
> +		}
> +	}
> +

Same here.

Regards,
Kamil

> +	igt_subtest_with_dynamic("fade_with_suspend") {
> +		for (size_t j = 0; j < sizeof(paths) / sizeof(paths[0]); j++) {
> +			igt_dynamic_f("connector-%zu", j) {
> +				memcpy(&context.path, paths[j], 8);
> +				test_fade_with_suspend(&context, output);
> +			}
> +		}
> +	}
>  
>  	igt_fixture {
> -		/* Restore old brightness */
> -		backlight_write(old, "brightness");
>  
>  		igt_display_fini(&display);
>  		igt_remove_fb(display.drm_fd, &fb);
> -- 
> 2.17.1
> 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight
  2022-09-29  9:28 Nidhi Gupta
@ 2022-10-03 11:01 ` Hogander, Jouni
  2022-10-03 13:31 ` Kamil Konieczny
  1 sibling, 0 replies; 15+ messages in thread
From: Hogander, Jouni @ 2022-10-03 11:01 UTC (permalink / raw)
  To: igt-dev, Gupta, Nidhi1; +Cc: Murthy, Arun R, Latvala, Petri

On Thu, 2022-09-29 at 14:58 +0530, Nidhi Gupta wrote:
> Since driver can now support multiple eDPs and Debugfs structure for
> backlight changed per connector the test should then iterate through
> all eDP connectors.
> 
> Signed-off-by: Nidhi Gupta <nidhi1.gupta@intel.com>
> ---
>  tests/i915/i915_pm_backlight.c | 110 ++++++++++++++++++++++++-------
> --
>  1 file changed, 80 insertions(+), 30 deletions(-)
> 
> diff --git a/tests/i915/i915_pm_backlight.c
> b/tests/i915/i915_pm_backlight.c
> index cafae7f7..bf67b50c 100644
> --- a/tests/i915/i915_pm_backlight.c
> +++ b/tests/i915/i915_pm_backlight.c
> @@ -34,9 +34,12 @@
>  #include <errno.h>
>  #include <unistd.h>
>  #include <time.h>
> +#include "igt_device.h"
> +#include "igt_device_scan.h"
>  
>  struct context {
>         int max;
> +       const char *path;
>  };
>  
>  
> @@ -48,14 +51,14 @@ struct context {
>  
>  IGT_TEST_DESCRIPTION("Basic backlight sysfs test");
>  
> -static int backlight_read(int *result, const char *fname)
> +static int backlight_read(int *result, const char *fname, struct
> context *context)
>  {
>         int fd;
>         char full[PATH_MAX];
>         char dst[64];
>         int r, e;
>  
> -       igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH,
> fname) < PATH_MAX);
> +       igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s",
> BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
>  
>         fd = open(full, O_RDONLY);
>         if (fd == -1)
> @@ -73,14 +76,14 @@ static int backlight_read(int *result, const char
> *fname)
>         return errno;
>  }
>  
> -static int backlight_write(int value, const char *fname)
> +static int backlight_write(int value, const char *fname, struct
> context *context)
>  {
>         int fd;
>         char full[PATH_MAX];
>         char src[64];
>         int len;
>  
> -       igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH,
> fname) < PATH_MAX);
> +       igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s",
> BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
>         fd = open(full, O_WRONLY);
>         if (fd == -1)
>                 return -errno;
> @@ -100,12 +103,12 @@ static void test_and_verify(struct context
> *context, int val)
>         const int tolerance = val * TOLERANCE / 100;
>         int result;
>  
> -       igt_assert_eq(backlight_write(val, "brightness"), 0);
> -       igt_assert_eq(backlight_read(&result, "brightness"), 0);
> +       igt_assert_eq(backlight_write(val, "brightness", context),
> 0);
> +       igt_assert_eq(backlight_read(&result, "brightness", context),
> 0);
>         /* Check that the exact value sticks */
>         igt_assert_eq(result, val);
>  
> -       igt_assert_eq(backlight_read(&result, "actual_brightness"),
> 0);
> +       igt_assert_eq(backlight_read(&result, "actual_brightness",
> context), 0);
>         /* Some rounding may happen depending on hw */
>         igt_assert_f(result >= max(0, val - tolerance) &&
>                      result <= min(context->max, val + tolerance),
> @@ -124,16 +127,16 @@ static void test_bad_brightness(struct context
> *context)
>  {
>         int val;
>         /* First write some sane value */
> -       backlight_write(context->max / 2, "brightness");
> +       backlight_write(context->max / 2, "brightness", context);
>         /* Writing invalid values should fail and not change the
> value */
> -       igt_assert_lt(backlight_write(-1, "brightness"), 0);
> -       backlight_read(&val, "brightness");
> +       igt_assert_lt(backlight_write(-1, "brightness", context), 0);
> +       backlight_read(&val, "brightness", context);
>         igt_assert_eq(val, context->max / 2);
> -       igt_assert_lt(backlight_write(context->max + 1,
> "brightness"), 0);
> -       backlight_read(&val, "brightness");
> +       igt_assert_lt(backlight_write(context->max + 1, "brightness",
> context), 0);
> +       backlight_read(&val, "brightness", context);
>         igt_assert_eq(val, context->max / 2);
> -       igt_assert_lt(backlight_write(INT_MAX, "brightness"), 0);
> -       backlight_read(&val, "brightness");
> +       igt_assert_lt(backlight_write(INT_MAX, "brightness",
> context), 0);
> +       backlight_read(&val, "brightness", context);
>         igt_assert_eq(val, context->max / 2);
>  }
>  
> @@ -186,6 +189,8 @@ igt_main
>         igt_display_t display;
>         igt_output_t *output;
>         struct igt_fb fb;
> +       const char *paths[2][50];
> +       char path1[PATH_MAX];
>  
>         igt_fixture {
>                 enum pipe pipe;
> @@ -202,10 +207,6 @@ igt_main
>                 kmstest_set_vt_graphics_mode();
>                 igt_display_require(&display,
> drm_open_driver(DRIVER_INTEL));
>  
> -               /* Get the max value and skip the whole test if sysfs
> interface not available */
> -               igt_skip_on(backlight_read(&old, "brightness"));
> -               igt_assert(backlight_read(&context.max,
> "max_brightness") > -1);
> -
>                 /* should be ../../cardX-$output */
>                 igt_assert_lt(12, readlink(BACKLIGHT_PATH "/device",
> full_name, sizeof(full_name) - 1));
>                 name = basename(full_name);
> @@ -233,22 +234,71 @@ igt_main
>  
>                 igt_display_commit2(&display, display.is_atomic ?
> COMMIT_ATOMIC : COMMIT_LEGACY);
>                 igt_pm_enable_sata_link_power_management();
> +
> +               memcpy(paths[0], "intel_backlight", 8);
> +               for (int i = 0; (i = display.n_outputs); i++) {
> +                       output = &display.outputs[i];
> +                       igt_output_set_pipe(output, PIPE_ANY);

What igt_output_set_pipe(output, PIPE_ANY) is doing?

> +                       snprintf(path1, 100 , "card%i-%s-backlight",
> igt_device_get_card_index(display.drm_fd), igt_output_name(output));

I'm not sure if card* can be something else than card0? Definetely it
has nothing to do with n_outputs.


> +                       int fd = open(path1, O_WRONLY);

You can't expect cardx-xxx-backlight to succeed. There has to be some
path (e.g. /sys/dev/char/226\:0/cardx-xxx-backlight). Maybe
igt_sysfs_path could be used here?

> +                       if (fd == -1)
> +                               continue;

close(fd);

> +                       memcpy(paths[1], name, 30);

You have paths[0] = intel_backlight and paths[1] = card0-eDP1? You
wanted to copy path1?

> +                       break;
> +               }

This loop generally looks strange. You are checking path1 copying
variable "name" into paths[1] ?

> 
> +               /* Get the max value and skip the whole test if sysfs
> interface not available */
> +               for (size_t i = 0; i < sizeof(paths) /
> sizeof(paths[0]); i++) {
> +                       memcpy(&context.path, paths[i], 8);

is 8 enough? I think you should use pointer here instead of copying it


> +                       igt_skip_on(backlight_read(&old,
> "brightness", &context));
> +                       igt_assert(backlight_read(&context.max,
> "max_brightness", &context) > -1);
> +               }
> +       }
> +       
> +       igt_subtest_with_dynamic("basic-brightness") {
> +               for (size_t j = 0; j < sizeof(paths) /
> sizeof(paths[0]); j++) {
> +                       igt_dynamic_f("connector-%zu", j) {
> +                               memcpy(&context.path, paths[j], 8);
> +                               test_brightness(&context);
> +                       }
> +               }
> +       }
> +       igt_subtest_with_dynamic("bad-brightness") {
> +               for (size_t j = 0; j < sizeof(paths) /
> sizeof(paths[0]); j++) {
> +                       igt_dynamic_f("connector-%zu", j) {
> +                               memcpy(&context.path, paths[j], 8);
> +                               test_bad_brightness(&context);
> +                       }
> +               }
> +       }
> +
> +       igt_subtest_with_dynamic("fade") {
> +               for (size_t j = 0; j < sizeof(paths) /
> sizeof(paths[0]); j++) {
> +                       igt_dynamic_f("connector-%zu", j) {
> +                               memcpy(&context.path, paths[j], 8);
> +                               test_fade(&context);
> +                       }
> +               }
>         }
>  
> -       igt_subtest("basic-brightness")
> -               test_brightness(&context);
> -       igt_subtest("bad-brightness")
> -               test_bad_brightness(&context);
> -       igt_subtest("fade")
> -               test_fade(&context);
> -       igt_subtest("fade_with_dpms")
> -               test_fade_with_dpms(&context, output);
> -       igt_subtest("fade_with_suspend")
> -               test_fade_with_suspend(&context, output);
> +       igt_subtest_with_dynamic("fade_with_dpms") {
> +               for (size_t j = 0; j < sizeof(paths) /
> sizeof(paths[0]); j++) {
> +                       igt_dynamic_f("connector-%zu", j) {
> +                               memcpy(&context.path, paths[j], 8);
> +                               test_fade_with_dpms(&context,
> output);
> +                       }
> +               }
> +       }
> +
> +       igt_subtest_with_dynamic("fade_with_suspend") {
> +               for (size_t j = 0; j < sizeof(paths) /
> sizeof(paths[0]); j++) {
> +                       igt_dynamic_f("connector-%zu", j) {
> +                               memcpy(&context.path, paths[j], 8);
> +                               test_fade_with_suspend(&context,
> output);
> +                       }
> +               }
> +       }
>  
>         igt_fixture {
> -               /* Restore old brightness */
> -               backlight_write(old, "brightness");
>  
>                 igt_display_fini(&display);
>                 igt_remove_fb(display.drm_fd, &fb);


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight
@ 2022-09-29  9:28 Nidhi Gupta
  2022-10-03 11:01 ` Hogander, Jouni
  2022-10-03 13:31 ` Kamil Konieczny
  0 siblings, 2 replies; 15+ messages in thread
From: Nidhi Gupta @ 2022-09-29  9:28 UTC (permalink / raw)
  To: igt-dev; +Cc: Nidhi Gupta, arun.r.murthy, petri.latvala

Since driver can now support multiple eDPs and Debugfs structure for
backlight changed per connector the test should then iterate through
all eDP connectors.

Signed-off-by: Nidhi Gupta <nidhi1.gupta@intel.com>
---
 tests/i915/i915_pm_backlight.c | 110 ++++++++++++++++++++++++---------
 1 file changed, 80 insertions(+), 30 deletions(-)

diff --git a/tests/i915/i915_pm_backlight.c b/tests/i915/i915_pm_backlight.c
index cafae7f7..bf67b50c 100644
--- a/tests/i915/i915_pm_backlight.c
+++ b/tests/i915/i915_pm_backlight.c
@@ -34,9 +34,12 @@
 #include <errno.h>
 #include <unistd.h>
 #include <time.h>
+#include "igt_device.h"
+#include "igt_device_scan.h"
 
 struct context {
 	int max;
+	const char *path;
 };
 
 
@@ -48,14 +51,14 @@ struct context {
 
 IGT_TEST_DESCRIPTION("Basic backlight sysfs test");
 
-static int backlight_read(int *result, const char *fname)
+static int backlight_read(int *result, const char *fname, struct context *context)
 {
 	int fd;
 	char full[PATH_MAX];
 	char dst[64];
 	int r, e;
 
-	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
+	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
 
 	fd = open(full, O_RDONLY);
 	if (fd == -1)
@@ -73,14 +76,14 @@ static int backlight_read(int *result, const char *fname)
 	return errno;
 }
 
-static int backlight_write(int value, const char *fname)
+static int backlight_write(int value, const char *fname, struct context *context)
 {
 	int fd;
 	char full[PATH_MAX];
 	char src[64];
 	int len;
 
-	igt_assert(snprintf(full, PATH_MAX, "%s/%s", BACKLIGHT_PATH, fname) < PATH_MAX);
+	igt_assert(snprintf(full, PATH_MAX, "%s/%s/%s", BACKLIGHT_PATH, context->path, fname) < PATH_MAX);
 	fd = open(full, O_WRONLY);
 	if (fd == -1)
 		return -errno;
@@ -100,12 +103,12 @@ static void test_and_verify(struct context *context, int val)
 	const int tolerance = val * TOLERANCE / 100;
 	int result;
 
-	igt_assert_eq(backlight_write(val, "brightness"), 0);
-	igt_assert_eq(backlight_read(&result, "brightness"), 0);
+	igt_assert_eq(backlight_write(val, "brightness", context), 0);
+	igt_assert_eq(backlight_read(&result, "brightness", context), 0);
 	/* Check that the exact value sticks */
 	igt_assert_eq(result, val);
 
-	igt_assert_eq(backlight_read(&result, "actual_brightness"), 0);
+	igt_assert_eq(backlight_read(&result, "actual_brightness", context), 0);
 	/* Some rounding may happen depending on hw */
 	igt_assert_f(result >= max(0, val - tolerance) &&
 		     result <= min(context->max, val + tolerance),
@@ -124,16 +127,16 @@ static void test_bad_brightness(struct context *context)
 {
 	int val;
 	/* First write some sane value */
-	backlight_write(context->max / 2, "brightness");
+	backlight_write(context->max / 2, "brightness", context);
 	/* Writing invalid values should fail and not change the value */
-	igt_assert_lt(backlight_write(-1, "brightness"), 0);
-	backlight_read(&val, "brightness");
+	igt_assert_lt(backlight_write(-1, "brightness", context), 0);
+	backlight_read(&val, "brightness", context);
 	igt_assert_eq(val, context->max / 2);
-	igt_assert_lt(backlight_write(context->max + 1, "brightness"), 0);
-	backlight_read(&val, "brightness");
+	igt_assert_lt(backlight_write(context->max + 1, "brightness", context), 0);
+	backlight_read(&val, "brightness", context);
 	igt_assert_eq(val, context->max / 2);
-	igt_assert_lt(backlight_write(INT_MAX, "brightness"), 0);
-	backlight_read(&val, "brightness");
+	igt_assert_lt(backlight_write(INT_MAX, "brightness", context), 0);
+	backlight_read(&val, "brightness", context);
 	igt_assert_eq(val, context->max / 2);
 }
 
@@ -186,6 +189,8 @@ igt_main
 	igt_display_t display;
 	igt_output_t *output;
 	struct igt_fb fb;
+	const char *paths[2][50];
+	char path1[PATH_MAX];
 
 	igt_fixture {
 		enum pipe pipe;
@@ -202,10 +207,6 @@ igt_main
 		kmstest_set_vt_graphics_mode();
 		igt_display_require(&display, drm_open_driver(DRIVER_INTEL));
 
-		/* Get the max value and skip the whole test if sysfs interface not available */
-		igt_skip_on(backlight_read(&old, "brightness"));
-		igt_assert(backlight_read(&context.max, "max_brightness") > -1);
-
 		/* should be ../../cardX-$output */
 		igt_assert_lt(12, readlink(BACKLIGHT_PATH "/device", full_name, sizeof(full_name) - 1));
 		name = basename(full_name);
@@ -233,22 +234,71 @@ igt_main
 
 		igt_display_commit2(&display, display.is_atomic ? COMMIT_ATOMIC : COMMIT_LEGACY);
 		igt_pm_enable_sata_link_power_management();
+
+		memcpy(paths[0], "intel_backlight", 8);
+		for (int i = 0; (i = display.n_outputs); i++) {
+			output = &display.outputs[i];
+			igt_output_set_pipe(output, PIPE_ANY);
+			snprintf(path1, 100 , "card%i-%s-backlight", igt_device_get_card_index(display.drm_fd), igt_output_name(output));
+			int fd = open(path1, O_WRONLY);
+			if (fd == -1)
+				continue;
+			memcpy(paths[1], name, 30);
+			break;
+		}
+		/* Get the max value and skip the whole test if sysfs interface not available */
+		for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) {
+			memcpy(&context.path, paths[i], 8);
+			igt_skip_on(backlight_read(&old, "brightness", &context));
+			igt_assert(backlight_read(&context.max, "max_brightness", &context) > -1);
+		}
+	}
+	
+	igt_subtest_with_dynamic("basic-brightness") {
+		for (size_t j = 0; j < sizeof(paths) / sizeof(paths[0]); j++) {
+			igt_dynamic_f("connector-%zu", j) {
+				memcpy(&context.path, paths[j], 8);
+				test_brightness(&context);
+			}
+		}
+	}
+	igt_subtest_with_dynamic("bad-brightness") {
+		for (size_t j = 0; j < sizeof(paths) / sizeof(paths[0]); j++) {
+			igt_dynamic_f("connector-%zu", j) {
+				memcpy(&context.path, paths[j], 8);
+				test_bad_brightness(&context);
+			}
+		}
+	}
+
+	igt_subtest_with_dynamic("fade") {
+		for (size_t j = 0; j < sizeof(paths) / sizeof(paths[0]); j++) {
+			igt_dynamic_f("connector-%zu", j) {
+				memcpy(&context.path, paths[j], 8);
+				test_fade(&context);
+			}
+		}
 	}
 
-	igt_subtest("basic-brightness")
-		test_brightness(&context);
-	igt_subtest("bad-brightness")
-		test_bad_brightness(&context);
-	igt_subtest("fade")
-		test_fade(&context);
-	igt_subtest("fade_with_dpms")
-		test_fade_with_dpms(&context, output);
-	igt_subtest("fade_with_suspend")
-		test_fade_with_suspend(&context, output);
+	igt_subtest_with_dynamic("fade_with_dpms") {
+		for (size_t j = 0; j < sizeof(paths) / sizeof(paths[0]); j++) {
+			igt_dynamic_f("connector-%zu", j) {
+				memcpy(&context.path, paths[j], 8);
+				test_fade_with_dpms(&context, output);
+			}
+		}
+	}
+
+	igt_subtest_with_dynamic("fade_with_suspend") {
+		for (size_t j = 0; j < sizeof(paths) / sizeof(paths[0]); j++) {
+			igt_dynamic_f("connector-%zu", j) {
+				memcpy(&context.path, paths[j], 8);
+				test_fade_with_suspend(&context, output);
+			}
+		}
+	}
 
 	igt_fixture {
-		/* Restore old brightness */
-		backlight_write(old, "brightness");
 
 		igt_display_fini(&display);
 		igt_remove_fb(display.drm_fd, &fb);
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2022-12-28  3:39 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-26  3:13 [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight Nidhi Gupta
2022-09-26  3:50 ` [igt-dev] ✗ Fi.CI.BUILD: failure for tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight (rev3) Patchwork
2022-09-26 10:04 ` [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight Hogander, Jouni
2022-12-26 19:52   ` [igt-dev] [PATCH i-g-t, v5, 05/52] tests/kms_atomic_interruptible: Add support for Bigjoiner Gupta, Nidhi1
2022-12-26 20:12     ` [igt-dev] [i-g-t v5 " Gupta, Nidhi1
2022-12-28  3:39     ` [igt-dev] [i-g-t v5 06/52] tests/kms_atomic_transition: " Gupta, Nidhi1
2022-09-26 10:05 ` [igt-dev] [PATCH i-g-t] tests/i915/i915_pm_backlight: Add new subtest to validate dual panel backlight Petri Latvala
2022-09-26 10:16   ` Jani Nikula
2022-09-26 10:06 ` Petri Latvala
2022-09-29  9:28 Nidhi Gupta
2022-10-03 11:01 ` Hogander, Jouni
2022-10-03 13:31 ` Kamil Konieczny
2022-11-02 17:08 Nidhi Gupta
2022-11-04  2:34 ` Modem, Bhanuprakash
2022-11-04 11:04 ` Hogander, Jouni

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.