forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
drm: selftest: convert drm_plane_helper selftest to KUnit
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
1 parent
0421bb0
commit 913b1e7
Showing
5 changed files
with
71 additions
and
59 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
|
@@ -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); | ||
|
@@ -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; | ||
|
@@ -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 || | ||
|
@@ -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; | ||
|
||
|
@@ -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 = { | ||
|
@@ -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. */ | ||
|
@@ -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); | ||
|
@@ -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); | ||
|
@@ -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"); |