Skip to content

Commit

Permalink
drm: selftest: convert drm_plane_helper selftest to KUnit
Browse files Browse the repository at this point in the history
Considering the current adoption of the KUnit framework, convert the
DRM plane helper selftest to the KUnit API.

Co-developed-by: Djakson C. G. Filho <[email protected]>
Signed-off-by: Djakson C. G. Filho <[email protected]>
Co-developed-by: Anderson Fraga <[email protected]>
Signed-off-by: Anderson Fraga <[email protected]>
Tested-by: David Gow <[email protected]>
Acked-by: Daniel Latypov <[email protected]>
Reviewed-by: Javier Martinez Canillas <[email protected]>
Signed-off-by: Maíra Canal <[email protected]>
Signed-off-by: Javier Martinez Canillas <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
  • Loading branch information
mairacanal authored and martinezjavier committed Jul 11, 2022
1 parent 0421bb0 commit 913b1e7
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 59 deletions.
4 changes: 2 additions & 2 deletions drivers/gpu/drm/selftests/Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# SPDX-License-Identifier: GPL-2.0-only
test-drm_modeset-y := test-drm_modeset_common.o test-drm_plane_helper.o \
test-drm_framebuffer.o test-drm_dp_mst_helper.o
test-drm_modeset-y := test-drm_modeset_common.o test-drm_framebuffer.o \
test-drm_dp_mst_helper.o

obj-$(CONFIG_DRM_DEBUG_SELFTEST) += test-drm_mm.o test-drm_modeset.o \
test-drm_buddy.o
1 change: 0 additions & 1 deletion drivers/gpu/drm/selftests/drm_modeset_selftests.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
*
* Tests are executed in order by igt/drm_selftests_helper
*/
selftest(check_plane_state, igt_check_plane_state)
selftest(check_drm_framebuffer_create, igt_check_drm_framebuffer_create)
selftest(dp_mst_calc_pbn_mode, igt_dp_mst_calc_pbn_mode)
selftest(dp_mst_sideband_msg_req_decode, igt_dp_mst_sideband_msg_req_decode)
1 change: 0 additions & 1 deletion drivers/gpu/drm/selftests/test-drm_modeset_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@

#define FAIL_ON(x) FAIL((x), "%s", "FAIL_ON(" __stringify(x) ")\n")

int igt_check_plane_state(void *ignored);
int igt_check_drm_framebuffer_create(void *ignored);
int igt_dp_mst_calc_pbn_mode(void *ignored);
int igt_dp_mst_sideband_msg_req_decode(void *ignored);
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/tests/Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# SPDX-License-Identifier: GPL-2.0

obj-$(CONFIG_DRM_KUNIT_TEST) += drm_format_helper_test.o drm_damage_helper_test.o \
drm_cmdline_parser_test.o drm_rect_test.o drm_format_test.o
drm_cmdline_parser_test.o drm_rect_test.o drm_format_test.o drm_plane_helper_test.o
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Test cases for the drm_plane_helper functions
*
* Copyright (c) 2022 Maíra Canal <[email protected]>
*/

#define pr_fmt(fmt) "drm_plane_helper: " fmt
#include <kunit/test.h>

#include <drm/drm_atomic_helper.h>
#include <drm/drm_framebuffer.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)
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;
Expand All @@ -23,8 +23,8 @@ static void set_src(struct drm_plane_state *plane_state,
}

static bool check_src_eq(struct drm_plane_state *plane_state,
unsigned src_x, unsigned src_y,
unsigned src_w, unsigned src_h)
unsigned int src_x, unsigned int src_y,
unsigned int src_w, unsigned int src_h)
{
if (plane_state->src.x1 < 0) {
pr_err("src x coordinate %x should never be below 0.\n", plane_state->src.x1);
Expand All @@ -50,7 +50,7 @@ static bool check_src_eq(struct drm_plane_state *plane_state,

static void set_crtc(struct drm_plane_state *plane_state,
int crtc_x, int crtc_y,
unsigned crtc_w, unsigned crtc_h)
unsigned int crtc_w, unsigned int crtc_h)
{
plane_state->crtc_x = crtc_x;
plane_state->crtc_y = crtc_y;
Expand All @@ -60,7 +60,7 @@ static void set_crtc(struct drm_plane_state *plane_state,

static bool check_crtc_eq(struct drm_plane_state *plane_state,
int crtc_x, int crtc_y,
unsigned crtc_w, unsigned crtc_h)
unsigned int crtc_w, unsigned int crtc_h)
{
if (plane_state->dst.x1 != crtc_x ||
plane_state->dst.y1 != crtc_y ||
Expand All @@ -74,7 +74,7 @@ static bool check_crtc_eq(struct drm_plane_state *plane_state,
return true;
}

int igt_check_plane_state(void *ignored)
static void igt_check_plane_state(struct kunit *test)
{
int ret;

Expand All @@ -83,9 +83,8 @@ int igt_check_plane_state(void *ignored)
.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)
DRM_MODE("1024x768", 0, 65000, 1024, 1048, 1184, 1344, 0, 768, 771,
777, 806, 0, DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC)
},
};
static struct drm_plane plane = {
Expand All @@ -109,21 +108,21 @@ int igt_check_plane_state(void *ignored)
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));
KUNIT_EXPECT_FALSE_MSG(test, ret, 0, "Simple clipping check should pass\n");
KUNIT_EXPECT_TRUE(test, plane_state.visible);
KUNIT_EXPECT_TRUE(test, check_src_eq(&plane_state, 0, 0, 1024 << 16, 768 << 16));
KUNIT_EXPECT_TRUE(test, 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));
KUNIT_EXPECT_FALSE_MSG(test, ret, 0, "Rotated clipping check should pass\n");
KUNIT_EXPECT_TRUE(test, plane_state.visible);
KUNIT_EXPECT_TRUE(test, check_src_eq(&plane_state, 0, 0, 768 << 16, 1024 << 16));
KUNIT_EXPECT_TRUE(test, check_crtc_eq(&plane_state, 0, 0, 1024, 768));
plane_state.rotation = DRM_MODE_ROTATE_0;

/* Check whether positioning works correctly. */
Expand All @@ -133,16 +132,17 @@ int igt_check_plane_state(void *ignored)
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");
KUNIT_EXPECT_TRUE_MSG(test, 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));
KUNIT_EXPECT_FALSE_MSG(test, ret, 0, "Simple positioning should work\n");
KUNIT_EXPECT_TRUE(test, plane_state.visible);
KUNIT_EXPECT_TRUE(test, check_src_eq(&plane_state, 0, 0, 1023 << 16, 767 << 16));
KUNIT_EXPECT_TRUE(test, check_crtc_eq(&plane_state, 0, 0, 1023, 767));

/* Simple scaling tests. */
set_src(&plane_state, 0, 0, 512 << 16, 384 << 16);
Expand All @@ -151,28 +151,28 @@ int igt_check_plane_state(void *ignored)
0x8001,
DRM_PLANE_HELPER_NO_SCALING,
false, false);
FAIL(!ret, "Upscaling out of range should fail.\n");
KUNIT_EXPECT_TRUE_MSG(test, 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));
KUNIT_EXPECT_FALSE_MSG(test, ret, 0, "Upscaling exactly 2x should work\n");
KUNIT_EXPECT_TRUE(test, plane_state.visible);
KUNIT_EXPECT_TRUE(test, check_src_eq(&plane_state, 0, 0, 512 << 16, 384 << 16));
KUNIT_EXPECT_TRUE(test, 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");
KUNIT_EXPECT_TRUE_MSG(test, 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));
KUNIT_EXPECT_FALSE_MSG(test, ret, 0, "Should succeed with exact scaling limit\n");
KUNIT_EXPECT_TRUE(test, plane_state.visible);
KUNIT_EXPECT_TRUE(test, check_src_eq(&plane_state, 0, 0, 2048 << 16, 1536 << 16));
KUNIT_EXPECT_TRUE(test, check_crtc_eq(&plane_state, 0, 0, 1024, 768));

/* Testing rounding errors. */
set_src(&plane_state, 0, 0, 0x40001, 0x40001);
Expand All @@ -181,44 +181,58 @@ int igt_check_plane_state(void *ignored)
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));
KUNIT_EXPECT_FALSE_MSG(test, ret, 0, "Should succeed by clipping to exact multiple");
KUNIT_EXPECT_TRUE(test, plane_state.visible);
KUNIT_EXPECT_TRUE(test, check_src_eq(&plane_state, 0, 0, 2 << 16, 2 << 16));
KUNIT_EXPECT_TRUE(test, 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));
KUNIT_EXPECT_FALSE_MSG(test, ret, 0, "Should succeed by clipping to exact multiple");
KUNIT_EXPECT_TRUE(test, plane_state.visible);
KUNIT_EXPECT_TRUE(test, check_src_eq(&plane_state, 0x40002, 0x40002,
1024 << 16, 768 << 16));
KUNIT_EXPECT_TRUE(test, 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);
KUNIT_EXPECT_FALSE_MSG(test, ret, 0, "Should succeed by clipping to exact multiple");
KUNIT_EXPECT_TRUE(test, 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));
KUNIT_EXPECT_TRUE(test, check_src_eq(&plane_state, 0, 0, 2 << 16, 2 << 16));
KUNIT_EXPECT_TRUE(test, 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));

return 0;
KUNIT_EXPECT_FALSE_MSG(test, ret, 0, "Should succeed by clipping to exact multiple");
KUNIT_EXPECT_TRUE(test, plane_state.visible);
KUNIT_EXPECT_TRUE(test, check_src_eq(&plane_state, 0x3fffe, 0x3fffe,
1024 << 16, 768 << 16));
KUNIT_EXPECT_TRUE(test, check_crtc_eq(&plane_state, 0, 0, 1024, 768));
}

static struct kunit_case drm_plane_helper_test[] = {
KUNIT_CASE(igt_check_plane_state),
{}
};

static struct kunit_suite drm_plane_helper_test_suite = {
.name = "drm_plane_helper",
.test_cases = drm_plane_helper_test,
};

kunit_test_suite(drm_plane_helper_test_suite);

MODULE_LICENSE("GPL");

0 comments on commit 913b1e7

Please sign in to comment.