Tests were converted into parameterized test cases.
Negative tests were separated. Mocking was moved to test->init().
No functional changes.

Signed-off-by: Michał Winiarski <michal.winiar...@intel.com>
---
 drivers/gpu/drm/Kconfig                       |   1 +
 drivers/gpu/drm/selftests/Makefile            |   4 +-
 .../gpu/drm/selftests/drm_modeset_selftests.h |   1 -
 .../drm/selftests/test-drm_modeset_common.h   |   1 -
 .../gpu/drm/selftests/test-drm_plane_helper.c | 483 +++++++++++-------
 5 files changed, 289 insertions(+), 201 deletions(-)

diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig
index 21e329f32997..89be0df7b0e9 100644
--- a/drivers/gpu/drm/Kconfig
+++ b/drivers/gpu/drm/Kconfig
@@ -83,6 +83,7 @@ config DRM_DEBUG_SELFTEST
 config DRM_KUNIT_TEST
        bool "DRM tests" if !KUNIT_ALL_TESTS
        depends on DRM=y && KUNIT=y
+       select DRM_KMS_HELPER
        default KUNIT_ALL_TESTS
        help
          Enables unit tests for DRM. Only useful for kernel devs running KUnit.
diff --git a/drivers/gpu/drm/selftests/Makefile 
b/drivers/gpu/drm/selftests/Makefile
index 6411c9a957b3..82e568665ace 100644
--- a/drivers/gpu/drm/selftests/Makefile
+++ b/drivers/gpu/drm/selftests/Makefile
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0-only
 test-drm_modeset-$(CONFIG_DRM_DEBUG_SELFTEST) := \
-                     test-drm_modeset_common.o test-drm_plane_helper.o \
+                     test-drm_modeset_common.o \
                       test-drm_format.o test-drm_framebuffer.o \
                      test-drm_damage_helper.o test-drm_dp_mst_helper.o \
                      test-drm_rect.o
@@ -8,4 +8,4 @@ test-drm_modeset-$(CONFIG_DRM_DEBUG_SELFTEST) := \
 obj-$(CONFIG_DRM_DEBUG_SELFTEST) += test-drm_mm.o test-drm_modeset.o
 
 obj-$(CONFIG_DRM_KUNIT_TEST) := \
-       test-drm_cmdline_parser.o
+       test-drm_cmdline_parser.o test-drm_plane_helper.o
diff --git a/drivers/gpu/drm/selftests/drm_modeset_selftests.h 
b/drivers/gpu/drm/selftests/drm_modeset_selftests.h
index 782e285ca383..19d1142725c6 100644
--- a/drivers/gpu/drm/selftests/drm_modeset_selftests.h
+++ b/drivers/gpu/drm/selftests/drm_modeset_selftests.h
@@ -10,7 +10,6 @@ selftest(drm_rect_clip_scaled_div_by_zero, 
igt_drm_rect_clip_scaled_div_by_zero)
 selftest(drm_rect_clip_scaled_not_clipped, 
igt_drm_rect_clip_scaled_not_clipped)
 selftest(drm_rect_clip_scaled_clipped, igt_drm_rect_clip_scaled_clipped)
 selftest(drm_rect_clip_scaled_signed_vs_unsigned, 
igt_drm_rect_clip_scaled_signed_vs_unsigned)
-selftest(check_plane_state, igt_check_plane_state)
 selftest(check_drm_format_block_width, igt_check_drm_format_block_width)
 selftest(check_drm_format_block_height, igt_check_drm_format_block_height)
 selftest(check_drm_format_min_pitch, igt_check_drm_format_min_pitch)
diff --git a/drivers/gpu/drm/selftests/test-drm_modeset_common.h 
b/drivers/gpu/drm/selftests/test-drm_modeset_common.h
index cfb51d8da2bc..8744fd840406 100644
--- a/drivers/gpu/drm/selftests/test-drm_modeset_common.h
+++ b/drivers/gpu/drm/selftests/test-drm_modeset_common.h
@@ -20,7 +20,6 @@ int igt_drm_rect_clip_scaled_div_by_zero(void *ignored);
 int igt_drm_rect_clip_scaled_not_clipped(void *ignored);
 int igt_drm_rect_clip_scaled_clipped(void *ignored);
 int igt_drm_rect_clip_scaled_signed_vs_unsigned(void *ignored);
-int igt_check_plane_state(void *ignored);
 int igt_check_drm_format_block_width(void *ignored);
 int igt_check_drm_format_block_height(void *ignored);
 int igt_check_drm_format_min_pitch(void *ignored);
diff --git a/drivers/gpu/drm/selftests/test-drm_plane_helper.c 
b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
index ceebeede55ea..f2c0cd37a949 100644
--- a/drivers/gpu/drm/selftests/test-drm_plane_helper.c
+++ b/drivers/gpu/drm/selftests/test-drm_plane_helper.c
@@ -3,221 +3,310 @@
  * Test cases for the drm_plane_helper functions
  */
 
-#define pr_fmt(fmt) "drm_plane_helper: " fmt
+#include <kunit/test.h>
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_modes.h>
 
-#include "test-drm_modeset_common.h"
-
-static void set_src(struct drm_plane_state *plane_state,
-                   unsigned src_x, unsigned src_y,
-                   unsigned src_w, unsigned src_h)
+static void expect_src_eq(struct kunit *test, struct drm_plane_state 
*plane_state,
+                         unsigned int src_x, unsigned int src_y,
+                         unsigned int src_w, unsigned int src_h)
 {
-       plane_state->src_x = src_x;
-       plane_state->src_y = src_y;
-       plane_state->src_w = src_w;
-       plane_state->src_h = src_h;
+       KUNIT_EXPECT_GE_MSG(test, plane_state->src.x1, 0,
+                           "src x coordinate %x should never be below 0, src: 
" DRM_RECT_FP_FMT,
+                           plane_state->src.x1, 
DRM_RECT_FP_ARG(&plane_state->src));
+       KUNIT_EXPECT_GE_MSG(test, plane_state->src.y1, 0,
+                           "src y coordinate %x should never be below 0, src: 
" DRM_RECT_FP_FMT,
+                           plane_state->src.y1, 
DRM_RECT_FP_ARG(&plane_state->src));
+
+       KUNIT_EXPECT_TRUE_MSG(test,
+                             plane_state->src.x1 == src_x &&
+                             plane_state->src.y1 == src_y &&
+                             drm_rect_width(&plane_state->src) == src_w &&
+                             drm_rect_height(&plane_state->src) == src_h,
+                             "src: " DRM_RECT_FP_FMT, 
DRM_RECT_FP_ARG(&plane_state->src));
 }
 
-static bool check_src_eq(struct drm_plane_state *plane_state,
-                        unsigned src_x, unsigned src_y,
-                        unsigned src_w, unsigned src_h)
+static void expect_crtc_eq(struct kunit *test, struct drm_plane_state 
*plane_state,
+                          int crtc_x, int crtc_y,
+                          unsigned int crtc_w, unsigned int crtc_h)
 {
-       if (plane_state->src.x1 < 0) {
-               pr_err("src x coordinate %x should never be below 0.\n", 
plane_state->src.x1);
-               drm_rect_debug_print("src: ", &plane_state->src, true);
-               return false;
-       }
-       if (plane_state->src.y1 < 0) {
-               pr_err("src y coordinate %x should never be below 0.\n", 
plane_state->src.y1);
-               drm_rect_debug_print("src: ", &plane_state->src, true);
-               return false;
-       }
-
-       if (plane_state->src.x1 != src_x ||
-           plane_state->src.y1 != src_y ||
-           drm_rect_width(&plane_state->src) != src_w ||
-           drm_rect_height(&plane_state->src) != src_h) {
-               drm_rect_debug_print("src: ", &plane_state->src, true);
-               return false;
-       }
-
-       return true;
+       KUNIT_EXPECT_TRUE_MSG(test,
+                             plane_state->dst.x1 == crtc_x &&
+                             plane_state->dst.y1 == crtc_y &&
+                             drm_rect_width(&plane_state->dst) == crtc_w &&
+                             drm_rect_height(&plane_state->dst) == crtc_h,
+                             "dst: " DRM_RECT_FMT, 
DRM_RECT_ARG(&plane_state->dst));
 }
 
-static void set_crtc(struct drm_plane_state *plane_state,
-                    int crtc_x, int crtc_y,
-                    unsigned crtc_w, unsigned crtc_h)
+const struct drm_crtc_state crtc_state = {
+       .crtc = ZERO_SIZE_PTR,
+       .enable = true,
+       .active = true,
+       .mode = {
+               DRM_MODE("1024x768", 0, 65000, 1024, 1048,
+                        1184, 1344, 0, 768, 771, 777, 806, 0,
+                        DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC)
+       },
+};
+
+struct drm_check_plane_state_test {
+       const char *name;
+       const char *msg;
+       struct {
+               unsigned int x;
+               unsigned int y;
+               unsigned int w;
+               unsigned int h;
+       } src, src_expected;
+       struct {
+               int x;
+               int y;
+               unsigned int w;
+               unsigned int h;
+       } crtc, crtc_expected;
+       unsigned int rotation;
+       int min_scale;
+       int max_scale;
+       bool can_position;
+};
+
+static int drm_plane_helper_init(struct kunit *test)
 {
-       plane_state->crtc_x = crtc_x;
-       plane_state->crtc_y = crtc_y;
-       plane_state->crtc_w = crtc_w;
-       plane_state->crtc_h = crtc_h;
+       const struct drm_check_plane_state_test *params = test->param_value;
+       struct drm_plane *plane;
+       struct drm_framebuffer *fb;
+       struct drm_plane_state *mock;
+
+       plane = kunit_kzalloc(test, sizeof(*plane), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane);
+
+       fb = kunit_kzalloc(test, sizeof(*fb), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, fb);
+       fb->width = 2048;
+       fb->height = 2048;
+
+       mock = kunit_kzalloc(test, sizeof(*mock), GFP_KERNEL);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, mock);
+       mock->plane = plane;
+       mock->crtc = ZERO_SIZE_PTR;
+       mock->fb = fb;
+       mock->rotation = params->rotation;
+       mock->src_x = params->src.x;
+       mock->src_y = params->src.y;
+       mock->src_w = params->src.w;
+       mock->src_h = params->src.h;
+       mock->crtc_x = params->crtc.x;
+       mock->crtc_y = params->crtc.y;
+       mock->crtc_w = params->crtc.w;
+       mock->crtc_h = params->crtc.h;
+
+       test->priv = mock;
+
+       return 0;
 }
 
-static bool check_crtc_eq(struct drm_plane_state *plane_state,
-                         int crtc_x, int crtc_y,
-                         unsigned crtc_w, unsigned crtc_h)
+void drm_check_plane_state(struct kunit *test)
 {
-       if (plane_state->dst.x1 != crtc_x ||
-           plane_state->dst.y1 != crtc_y ||
-           drm_rect_width(&plane_state->dst) != crtc_w ||
-           drm_rect_height(&plane_state->dst) != crtc_h) {
-               drm_rect_debug_print("dst: ", &plane_state->dst, false);
-
-               return false;
-       }
+       const struct drm_check_plane_state_test *params = test->param_value;
+       struct drm_plane_state *plane_state = test->priv;
 
-       return true;
+       KUNIT_ASSERT_EQ_MSG(test,
+                           drm_atomic_helper_check_plane_state(plane_state, 
&crtc_state,
+                                                               
params->min_scale,
+                                                               
params->max_scale,
+                                                               
params->can_position, false),
+                           0, params->msg);
+       KUNIT_EXPECT_TRUE(test, plane_state->visible);
+       expect_src_eq(test, plane_state, params->src_expected.x, 
params->src_expected.y,
+                     params->src_expected.w, params->src_expected.h);
+       expect_crtc_eq(test, plane_state, params->crtc_expected.x, 
params->crtc_expected.y,
+                      params->crtc_expected.w, params->crtc_expected.h);
 }
 
-int igt_check_plane_state(void *ignored)
+void drm_check_invalid_plane_state(struct kunit *test)
 {
-       int ret;
-
-       const struct drm_crtc_state crtc_state = {
-               .crtc = ZERO_SIZE_PTR,
-               .enable = true,
-               .active = true,
-               .mode = {
-                       DRM_MODE("1024x768", 0, 65000, 1024, 1048,
-                               1184, 1344, 0, 768, 771, 777, 806, 0,
-                               DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC)
-               },
-       };
-       struct drm_plane plane = {
-               .dev = NULL
-       };
-       struct drm_framebuffer fb = {
-               .width = 2048,
-               .height = 2048
-       };
-       struct drm_plane_state plane_state = {
-               .plane = &plane,
-               .crtc = ZERO_SIZE_PTR,
-               .fb = &fb,
-               .rotation = DRM_MODE_ROTATE_0
-       };
-
-       /* Simple clipping, no scaling. */
-       set_src(&plane_state, 0, 0, fb.width << 16, fb.height << 16);
-       set_crtc(&plane_state, 0, 0, fb.width, fb.height);
-       ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 false, false);
-       FAIL(ret < 0, "Simple clipping check should pass\n");
-       FAIL_ON(!plane_state.visible);
-       FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1024 << 16, 768 << 16));
-       FAIL_ON(!check_crtc_eq(&plane_state, 0, 0, 1024, 768));
-
-       /* Rotated clipping + reflection, no scaling. */
-       plane_state.rotation = DRM_MODE_ROTATE_90 | DRM_MODE_REFLECT_X;
-       ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 false, false);
-       FAIL(ret < 0, "Rotated clipping check should pass\n");
-       FAIL_ON(!plane_state.visible);
-       FAIL_ON(!check_src_eq(&plane_state, 0, 0, 768 << 16, 1024 << 16));
-       FAIL_ON(!check_crtc_eq(&plane_state, 0, 0, 1024, 768));
-       plane_state.rotation = DRM_MODE_ROTATE_0;
-
-       /* Check whether positioning works correctly. */
-       set_src(&plane_state, 0, 0, 1023 << 16, 767 << 16);
-       set_crtc(&plane_state, 0, 0, 1023, 767);
-       ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 false, false);
-       FAIL(!ret, "Should not be able to position on the crtc with 
can_position=false\n");
-
-       ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 true, false);
-       FAIL(ret < 0, "Simple positioning should work\n");
-       FAIL_ON(!plane_state.visible);
-       FAIL_ON(!check_src_eq(&plane_state, 0, 0, 1023 << 16, 767 << 16));
-       FAIL_ON(!check_crtc_eq(&plane_state, 0, 0, 1023, 767));
-
-       /* Simple scaling tests. */
-       set_src(&plane_state, 0, 0, 512 << 16, 384 << 16);
-       set_crtc(&plane_state, 0, 0, 1024, 768);
-       ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
-                                                 0x8001,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 false, false);
-       FAIL(!ret, "Upscaling out of range should fail.\n");
-       ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
-                                                 0x8000,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 false, false);
-       FAIL(ret < 0, "Upscaling exactly 2x should work\n");
-       FAIL_ON(!plane_state.visible);
-       FAIL_ON(!check_src_eq(&plane_state, 0, 0, 512 << 16, 384 << 16));
-       FAIL_ON(!check_crtc_eq(&plane_state, 0, 0, 1024, 768));
-
-       set_src(&plane_state, 0, 0, 2048 << 16, 1536 << 16);
-       ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 0x1ffff, false, false);
-       FAIL(!ret, "Downscaling out of range should fail.\n");
-       ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 0x20000, false, false);
-       FAIL(ret < 0, "Should succeed with exact scaling limit\n");
-       FAIL_ON(!plane_state.visible);
-       FAIL_ON(!check_src_eq(&plane_state, 0, 0, 2048 << 16, 1536 << 16));
-       FAIL_ON(!check_crtc_eq(&plane_state, 0, 0, 1024, 768));
-
-       /* Testing rounding errors. */
-       set_src(&plane_state, 0, 0, 0x40001, 0x40001);
-       set_crtc(&plane_state, 1022, 766, 4, 4);
-       ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 0x10001,
-                                                 true, false);
-       FAIL(ret < 0, "Should succeed by clipping to exact multiple");
-       FAIL_ON(!plane_state.visible);
-       FAIL_ON(!check_src_eq(&plane_state, 0, 0, 2 << 16, 2 << 16));
-       FAIL_ON(!check_crtc_eq(&plane_state, 1022, 766, 2, 2));
-
-       set_src(&plane_state, 0x20001, 0x20001, 0x4040001, 0x3040001);
-       set_crtc(&plane_state, -2, -2, 1028, 772);
-       ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 0x10001,
-                                                 false, false);
-       FAIL(ret < 0, "Should succeed by clipping to exact multiple");
-       FAIL_ON(!plane_state.visible);
-       FAIL_ON(!check_src_eq(&plane_state, 0x40002, 0x40002, 1024 << 16, 768 
<< 16));
-       FAIL_ON(!check_crtc_eq(&plane_state, 0, 0, 1024, 768));
-
-       set_src(&plane_state, 0, 0, 0x3ffff, 0x3ffff);
-       set_crtc(&plane_state, 1022, 766, 4, 4);
-       ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
-                                                 0xffff,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 true, false);
-       FAIL(ret < 0, "Should succeed by clipping to exact multiple");
-       FAIL_ON(!plane_state.visible);
-       /* Should not be rounded to 0x20001, which would be upscaling. */
-       FAIL_ON(!check_src_eq(&plane_state, 0, 0, 2 << 16, 2 << 16));
-       FAIL_ON(!check_crtc_eq(&plane_state, 1022, 766, 2, 2));
-
-       set_src(&plane_state, 0x1ffff, 0x1ffff, 0x403ffff, 0x303ffff);
-       set_crtc(&plane_state, -2, -2, 1028, 772);
-       ret = drm_atomic_helper_check_plane_state(&plane_state, &crtc_state,
-                                                 0xffff,
-                                                 DRM_PLANE_HELPER_NO_SCALING,
-                                                 false, false);
-       FAIL(ret < 0, "Should succeed by clipping to exact multiple");
-       FAIL_ON(!plane_state.visible);
-       FAIL_ON(!check_src_eq(&plane_state, 0x3fffe, 0x3fffe, 1024 << 16, 768 
<< 16));
-       FAIL_ON(!check_crtc_eq(&plane_state, 0, 0, 1024, 768));
+       const struct drm_check_plane_state_test *params = test->param_value;
+       struct drm_plane_state *plane_state = test->priv;
 
-       return 0;
+       KUNIT_ASSERT_LT_MSG(test,
+                           drm_atomic_helper_check_plane_state(plane_state, 
&crtc_state,
+                                                               
params->min_scale,
+                                                               
params->max_scale,
+                                                               
params->can_position, false),
+                           0, params->msg);
+}
+
+static const struct drm_check_plane_state_test drm_check_plane_state_tests[] = 
{
+       {
+               .name = "clipping_simple",
+               .msg = "Simple clipping check should pass",
+               .src = { 0, 0,
+                        2048 << 16,
+                        2048 << 16 },
+               .crtc = { 0, 0, 2048, 2048 },
+               .rotation = DRM_MODE_ROTATE_0,
+               .min_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .max_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .can_position = false,
+               .src_expected = { 0, 0, 1024 << 16, 768 << 16 },
+               .crtc_expected = { 0, 0, 1024, 768 },
+       },
+       {
+               .name = "clipping_rotate_reflect",
+               .msg = "Rotated clipping check should pass",
+               .src = { 0, 0,
+                        2048 << 16,
+                        2048 << 16 },
+               .crtc = { 0, 0, 2048, 2048 },
+               .rotation = DRM_MODE_ROTATE_90 | DRM_MODE_REFLECT_X,
+               .min_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .max_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .can_position = false,
+               .src_expected = { 0, 0, 768 << 16, 1024 << 16 },
+               .crtc_expected = { 0, 0, 1024, 768 },
+       },
+       {
+               .name = "positioning_simple",
+               .msg = "Simple positioning should work",
+               .src = { 0, 0, 1023 << 16, 767 << 16 },
+               .crtc = { 0, 0, 1023, 767 },
+               .rotation = DRM_MODE_ROTATE_0,
+               .min_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .max_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .can_position = true,
+               .src_expected = { 0, 0, 1023 << 16, 767 << 16 },
+               .crtc_expected = { 0, 0, 1023, 767 },
+       },
+       {
+               .name = "upscaling",
+               .msg = "Upscaling exactly 2x should work",
+               .src = { 0, 0, 512 << 16, 384 << 16 },
+               .crtc = { 0, 0, 1024, 768 },
+               .rotation = DRM_MODE_ROTATE_0,
+               .min_scale = 0x8000,
+               .max_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .can_position = false,
+               .src_expected = { 0, 0, 512 << 16, 384 << 16 },
+               .crtc_expected = { 0, 0, 1024, 768 },
+       },
+       {
+               .name = "downscaling",
+               .msg = "Should succeed with exact scaling limit",
+               .src = { 0, 0, 2048 << 16, 1536 << 16 },
+               .crtc = { 0, 0, 1024, 768 },
+               .rotation = DRM_MODE_ROTATE_0,
+               .min_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .max_scale = 0x20000,
+               .can_position = false,
+               .src_expected = { 0, 0, 2048 << 16, 1536 << 16 },
+               .crtc_expected = { 0, 0, 1024, 768 },
+       },
+       {
+               .name = "rounding1",
+               .msg = "Should succeed by clipping to exact multiple",
+               .src = { 0, 0, 0x40001, 0x40001 },
+               .crtc = { 1022, 766, 4, 4 },
+               .rotation = DRM_MODE_ROTATE_0,
+               .min_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .max_scale = 0x10001,
+               .can_position = true,
+               .src_expected = { 0, 0, 2 << 16, 2 << 16 },
+               .crtc_expected = { 1022, 766, 2, 2 },
+       },
+       {
+               .name = "rounding2",
+               .msg = "Should succeed by clipping to exact multiple",
+               .src = { 0x20001, 0x20001, 0x4040001, 0x3040001 },
+               .crtc = { -2, -2, 1028, 772 },
+               .rotation = DRM_MODE_ROTATE_0,
+               .min_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .max_scale = 0x10001,
+               .can_position = false,
+               .src_expected = { 0x40002, 0x40002, 1024 << 16, 768 << 16 },
+               .crtc_expected = { 0, 0, 1024, 768 },
+       },
+       {
+               .name = "rounding3",
+               .msg = "Should succeed by clipping to exact multiple",
+               .src = { 0, 0, 0x3ffff, 0x3ffff },
+               .crtc = { 1022, 766, 4, 4 },
+               .rotation = DRM_MODE_ROTATE_0,
+               .min_scale = 0xffff,
+               .max_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .can_position = true,
+               /* Should not be rounded to 0x20001, which would be upscaling. 
*/
+               .src_expected = { 0, 0, 2 << 16, 2 << 16 },
+               .crtc_expected = { 1022, 766, 2, 2 },
+       },
+       {
+               .name = "rounding4",
+               .msg = "Should succeed by clipping to exact multiple",
+               .src = { 0x1ffff, 0x1ffff, 0x403ffff, 0x303ffff },
+               .crtc = { -2, -2, 1028, 772 },
+               .rotation = DRM_MODE_ROTATE_0,
+               .min_scale = 0xffff,
+               .max_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .can_position = false,
+               .src_expected = { 0x3fffe, 0x3fffe, 1024 << 16, 768 << 16 },
+               .crtc_expected = { 0, 0, 1024, 768 },
+       },
+};
+
+static const struct drm_check_plane_state_test 
drm_check_invalid_plane_state_tests[] = {
+       {
+               .name = "positioning_invalid",
+               .msg = "Should not be able to position on the crtc with 
can_position=false",
+               .src = { 0, 0, 1023 << 16, 767 << 16 },
+               .crtc = { 0, 0, 1023, 767 },
+               .rotation = DRM_MODE_ROTATE_0,
+               .min_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .max_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .can_position = false,
+       },
+       {
+               .name = "upscaling_invalid",
+               .msg = "Upscaling out of range should fail",
+               .src = { 0, 0, 512 << 16, 384 << 16 },
+               .crtc = { 0, 0, 1024, 768 },
+               .rotation = DRM_MODE_ROTATE_0,
+               .min_scale = 0x8001,
+               .max_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .can_position = false,
+       },
+       {
+               .name = "downscaling_invalid",
+               .msg = "Downscaling out of range should fail",
+               .src = { 0, 0, 2048 << 16, 1536 << 16 },
+               .crtc = { 0, 0, 1024, 768 },
+               .rotation = DRM_MODE_ROTATE_0,
+               .min_scale = DRM_PLANE_HELPER_NO_SCALING,
+               .max_scale = 0x1ffff,
+               .can_position = false,
+       },
+};
+
+static void drm_check_plane_state_desc(const struct drm_check_plane_state_test 
*t,
+                                      char *desc)
+{
+       sprintf(desc, "%s", t->name);
 }
+
+KUNIT_ARRAY_PARAM(drm_check_plane_state, drm_check_plane_state_tests, 
drm_check_plane_state_desc);
+KUNIT_ARRAY_PARAM(drm_check_invalid_plane_state, 
drm_check_invalid_plane_state_tests,
+                 drm_check_plane_state_desc);
+
+static struct kunit_case drm_plane_helper_tests[] = {
+       KUNIT_CASE_PARAM(drm_check_plane_state, 
drm_check_plane_state_gen_params),
+       KUNIT_CASE_PARAM(drm_check_invalid_plane_state, 
drm_check_invalid_plane_state_gen_params),
+       {}
+};
+
+static struct kunit_suite drm_plane_helper_test_suite = {
+       .name = "drm_plane_helper_tests",
+       .init = drm_plane_helper_init,
+       .test_cases = drm_plane_helper_tests,
+};
+
+kunit_test_suite(drm_plane_helper_test_suite);
-- 
2.34.1

Reply via email to