xref: /openbmc/linux/drivers/gpu/drm/tests/drm_plane_helper_test.c (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1913b1e7cSMaíra Canal // SPDX-License-Identifier: GPL-2.0
2913b1e7cSMaíra Canal /*
3913b1e7cSMaíra Canal  * Test cases for the drm_plane_helper functions
4913b1e7cSMaíra Canal  *
5913b1e7cSMaíra Canal  * Copyright (c) 2022 Maíra Canal <mairacanal@riseup.net>
6913b1e7cSMaíra Canal  */
7913b1e7cSMaíra Canal 
8913b1e7cSMaíra Canal #include <kunit/test.h>
9913b1e7cSMaíra Canal 
10913b1e7cSMaíra Canal #include <drm/drm_atomic_helper.h>
11913b1e7cSMaíra Canal #include <drm/drm_framebuffer.h>
12913b1e7cSMaíra Canal #include <drm/drm_modes.h>
13d74c1b46SMichał Winiarski #include <drm/drm_rect.h>
14913b1e7cSMaíra Canal 
15913b1e7cSMaíra Canal static const struct drm_crtc_state crtc_state = {
16913b1e7cSMaíra Canal 	.crtc = ZERO_SIZE_PTR,
17913b1e7cSMaíra Canal 	.enable = true,
18913b1e7cSMaíra Canal 	.active = true,
19913b1e7cSMaíra Canal 	.mode = {
20*e9f696f8SMichał Winiarski 		DRM_MODE("1024x768", 0, 65000, 1024, 1048,
21*e9f696f8SMichał Winiarski 			 1184, 1344, 0, 768, 771, 777, 806, 0,
22*e9f696f8SMichał Winiarski 			 DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC)
23913b1e7cSMaíra Canal 	},
24913b1e7cSMaíra Canal };
25*e9f696f8SMichał Winiarski 
26*e9f696f8SMichał Winiarski struct drm_check_plane_state_test {
27*e9f696f8SMichał Winiarski 	const char *name;
28*e9f696f8SMichał Winiarski 	const char *msg;
29*e9f696f8SMichał Winiarski 	struct {
30*e9f696f8SMichał Winiarski 		unsigned int x;
31*e9f696f8SMichał Winiarski 		unsigned int y;
32*e9f696f8SMichał Winiarski 		unsigned int w;
33*e9f696f8SMichał Winiarski 		unsigned int h;
34*e9f696f8SMichał Winiarski 	} src, src_expected;
35*e9f696f8SMichał Winiarski 	struct {
36*e9f696f8SMichał Winiarski 		int x;
37*e9f696f8SMichał Winiarski 		int y;
38*e9f696f8SMichał Winiarski 		unsigned int w;
39*e9f696f8SMichał Winiarski 		unsigned int h;
40*e9f696f8SMichał Winiarski 	} crtc, crtc_expected;
41*e9f696f8SMichał Winiarski 	unsigned int rotation;
42*e9f696f8SMichał Winiarski 	int min_scale;
43*e9f696f8SMichał Winiarski 	int max_scale;
44*e9f696f8SMichał Winiarski 	bool can_position;
45913b1e7cSMaíra Canal };
46913b1e7cSMaíra Canal 
drm_plane_helper_init(struct kunit * test)47*e9f696f8SMichał Winiarski static int drm_plane_helper_init(struct kunit *test)
48*e9f696f8SMichał Winiarski {
49*e9f696f8SMichał Winiarski 	const struct drm_check_plane_state_test *params = test->param_value;
50*e9f696f8SMichał Winiarski 	struct drm_plane *plane;
51*e9f696f8SMichał Winiarski 	struct drm_framebuffer *fb;
52*e9f696f8SMichał Winiarski 	struct drm_plane_state *mock;
53913b1e7cSMaíra Canal 
54*e9f696f8SMichał Winiarski 	plane = kunit_kzalloc(test, sizeof(*plane), GFP_KERNEL);
55*e9f696f8SMichał Winiarski 	KUNIT_ASSERT_NOT_NULL(test, plane);
56913b1e7cSMaíra Canal 
57*e9f696f8SMichał Winiarski 	fb = kunit_kzalloc(test, sizeof(*fb), GFP_KERNEL);
58*e9f696f8SMichał Winiarski 	KUNIT_ASSERT_NOT_NULL(test, fb);
59*e9f696f8SMichał Winiarski 	fb->width = 2048;
60*e9f696f8SMichał Winiarski 	fb->height = 2048;
61913b1e7cSMaíra Canal 
62*e9f696f8SMichał Winiarski 	mock = kunit_kzalloc(test, sizeof(*mock), GFP_KERNEL);
63*e9f696f8SMichał Winiarski 	KUNIT_ASSERT_NOT_NULL(test, mock);
64*e9f696f8SMichał Winiarski 	mock->plane = plane;
65*e9f696f8SMichał Winiarski 	mock->crtc = ZERO_SIZE_PTR;
66*e9f696f8SMichał Winiarski 	mock->fb = fb;
67*e9f696f8SMichał Winiarski 	mock->rotation = params->rotation;
68*e9f696f8SMichał Winiarski 	mock->src_x = params->src.x;
69*e9f696f8SMichał Winiarski 	mock->src_y = params->src.y;
70*e9f696f8SMichał Winiarski 	mock->src_w = params->src.w;
71*e9f696f8SMichał Winiarski 	mock->src_h = params->src.h;
72*e9f696f8SMichał Winiarski 	mock->crtc_x = params->crtc.x;
73*e9f696f8SMichał Winiarski 	mock->crtc_y = params->crtc.y;
74*e9f696f8SMichał Winiarski 	mock->crtc_w = params->crtc.w;
75*e9f696f8SMichał Winiarski 	mock->crtc_h = params->crtc.h;
76913b1e7cSMaíra Canal 
77*e9f696f8SMichał Winiarski 	test->priv = mock;
78913b1e7cSMaíra Canal 
79*e9f696f8SMichał Winiarski 	return 0;
80913b1e7cSMaíra Canal }
81913b1e7cSMaíra Canal 
check_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)82*e9f696f8SMichał Winiarski static void check_src_eq(struct kunit *test, struct drm_plane_state *plane_state,
83*e9f696f8SMichał Winiarski 			 unsigned int src_x, unsigned int src_y,
84*e9f696f8SMichał Winiarski 			 unsigned int src_w, unsigned int src_h)
85*e9f696f8SMichał Winiarski {
86*e9f696f8SMichał Winiarski 	struct drm_rect expected = DRM_RECT_INIT(src_x, src_y, src_w, src_h);
87*e9f696f8SMichał Winiarski 
88*e9f696f8SMichał Winiarski 	KUNIT_ASSERT_GE_MSG(test, plane_state->src.x1, 0,
89*e9f696f8SMichał Winiarski 			    "src x coordinate %x should never be below 0, src: " DRM_RECT_FP_FMT,
90*e9f696f8SMichał Winiarski 			    plane_state->src.x1, DRM_RECT_FP_ARG(&plane_state->src));
91*e9f696f8SMichał Winiarski 
92*e9f696f8SMichał Winiarski 	KUNIT_ASSERT_GE_MSG(test, plane_state->src.y1, 0,
93*e9f696f8SMichał Winiarski 			    "src y coordinate %x should never be below 0, src: " DRM_RECT_FP_FMT,
94*e9f696f8SMichał Winiarski 			    plane_state->src.y1, DRM_RECT_FP_ARG(&plane_state->src));
95*e9f696f8SMichał Winiarski 
96*e9f696f8SMichał Winiarski 	KUNIT_EXPECT_TRUE_MSG(test, drm_rect_equals(&plane_state->src, &expected),
97*e9f696f8SMichał Winiarski 			      "dst: " DRM_RECT_FP_FMT ", expected: " DRM_RECT_FP_FMT,
98*e9f696f8SMichał Winiarski 			      DRM_RECT_FP_ARG(&plane_state->src), DRM_RECT_FP_ARG(&expected));
99*e9f696f8SMichał Winiarski }
100*e9f696f8SMichał Winiarski 
check_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)101*e9f696f8SMichał Winiarski static void check_crtc_eq(struct kunit *test, struct drm_plane_state *plane_state,
102*e9f696f8SMichał Winiarski 			  int crtc_x, int crtc_y,
103*e9f696f8SMichał Winiarski 			  unsigned int crtc_w, unsigned int crtc_h)
104*e9f696f8SMichał Winiarski {
105*e9f696f8SMichał Winiarski 	struct drm_rect expected = DRM_RECT_INIT(crtc_x, crtc_y, crtc_w, crtc_h);
106*e9f696f8SMichał Winiarski 
107*e9f696f8SMichał Winiarski 	KUNIT_EXPECT_TRUE_MSG(test, drm_rect_equals(&plane_state->dst, &expected),
108*e9f696f8SMichał Winiarski 			      "dst: " DRM_RECT_FMT ", expected: " DRM_RECT_FMT,
109*e9f696f8SMichał Winiarski 			      DRM_RECT_ARG(&plane_state->dst), DRM_RECT_ARG(&expected));
110*e9f696f8SMichał Winiarski }
111*e9f696f8SMichał Winiarski 
drm_test_check_plane_state(struct kunit * test)112*e9f696f8SMichał Winiarski static void drm_test_check_plane_state(struct kunit *test)
113*e9f696f8SMichał Winiarski {
114*e9f696f8SMichał Winiarski 	const struct drm_check_plane_state_test *params = test->param_value;
115*e9f696f8SMichał Winiarski 	struct drm_plane_state *plane_state = test->priv;
116*e9f696f8SMichał Winiarski 
117*e9f696f8SMichał Winiarski 	KUNIT_ASSERT_EQ_MSG(test,
118*e9f696f8SMichał Winiarski 			    drm_atomic_helper_check_plane_state(plane_state, &crtc_state,
119*e9f696f8SMichał Winiarski 								params->min_scale,
120*e9f696f8SMichał Winiarski 								params->max_scale,
121*e9f696f8SMichał Winiarski 								params->can_position, false),
122*e9f696f8SMichał Winiarski 			    0, params->msg);
123*e9f696f8SMichał Winiarski 	KUNIT_EXPECT_TRUE(test, plane_state->visible);
124*e9f696f8SMichał Winiarski 	check_src_eq(test, plane_state, params->src_expected.x, params->src_expected.y,
125*e9f696f8SMichał Winiarski 		     params->src_expected.w, params->src_expected.h);
126*e9f696f8SMichał Winiarski 	check_crtc_eq(test, plane_state, params->crtc_expected.x, params->crtc_expected.y,
127*e9f696f8SMichał Winiarski 		      params->crtc_expected.w, params->crtc_expected.h);
128*e9f696f8SMichał Winiarski }
129*e9f696f8SMichał Winiarski 
drm_check_plane_state_desc(const struct drm_check_plane_state_test * t,char * desc)130*e9f696f8SMichał Winiarski static void drm_check_plane_state_desc(const struct drm_check_plane_state_test *t,
131*e9f696f8SMichał Winiarski 				       char *desc)
132*e9f696f8SMichał Winiarski {
133*e9f696f8SMichał Winiarski 	sprintf(desc, "%s", t->name);
134*e9f696f8SMichał Winiarski }
135*e9f696f8SMichał Winiarski 
136*e9f696f8SMichał Winiarski static const struct drm_check_plane_state_test drm_check_plane_state_tests[] = {
137*e9f696f8SMichał Winiarski 	{
138*e9f696f8SMichał Winiarski 		.name = "clipping_simple",
139*e9f696f8SMichał Winiarski 		.msg = "Simple clipping check should pass",
140*e9f696f8SMichał Winiarski 		.src = { 0, 0,
141*e9f696f8SMichał Winiarski 			 2048 << 16,
142*e9f696f8SMichał Winiarski 			 2048 << 16 },
143*e9f696f8SMichał Winiarski 		.crtc = { 0, 0, 2048, 2048 },
144*e9f696f8SMichał Winiarski 		.rotation = DRM_MODE_ROTATE_0,
145*e9f696f8SMichał Winiarski 		.min_scale = DRM_PLANE_NO_SCALING,
146*e9f696f8SMichał Winiarski 		.max_scale = DRM_PLANE_NO_SCALING,
147*e9f696f8SMichał Winiarski 		.can_position = false,
148*e9f696f8SMichał Winiarski 		.src_expected = { 0, 0, 1024 << 16, 768 << 16 },
149*e9f696f8SMichał Winiarski 		.crtc_expected = { 0, 0, 1024, 768 },
150*e9f696f8SMichał Winiarski 	},
151*e9f696f8SMichał Winiarski 	{
152*e9f696f8SMichał Winiarski 		.name = "clipping_rotate_reflect",
153*e9f696f8SMichał Winiarski 		.msg = "Rotated clipping check should pass",
154*e9f696f8SMichał Winiarski 		.src = { 0, 0,
155*e9f696f8SMichał Winiarski 			 2048 << 16,
156*e9f696f8SMichał Winiarski 			 2048 << 16 },
157*e9f696f8SMichał Winiarski 		.crtc = { 0, 0, 2048, 2048 },
158*e9f696f8SMichał Winiarski 		.rotation = DRM_MODE_ROTATE_90 | DRM_MODE_REFLECT_X,
159*e9f696f8SMichał Winiarski 		.min_scale = DRM_PLANE_NO_SCALING,
160*e9f696f8SMichał Winiarski 		.max_scale = DRM_PLANE_NO_SCALING,
161*e9f696f8SMichał Winiarski 		.can_position = false,
162*e9f696f8SMichał Winiarski 		.src_expected = { 0, 0, 768 << 16, 1024 << 16 },
163*e9f696f8SMichał Winiarski 		.crtc_expected = { 0, 0, 1024, 768 },
164*e9f696f8SMichał Winiarski 	},
165*e9f696f8SMichał Winiarski 	{
166*e9f696f8SMichał Winiarski 		.name = "positioning_simple",
167*e9f696f8SMichał Winiarski 		.msg = "Simple positioning should work",
168*e9f696f8SMichał Winiarski 		.src = { 0, 0, 1023 << 16, 767 << 16 },
169*e9f696f8SMichał Winiarski 		.crtc = { 0, 0, 1023, 767 },
170*e9f696f8SMichał Winiarski 		.rotation = DRM_MODE_ROTATE_0,
171*e9f696f8SMichał Winiarski 		.min_scale = DRM_PLANE_NO_SCALING,
172*e9f696f8SMichał Winiarski 		.max_scale = DRM_PLANE_NO_SCALING,
173*e9f696f8SMichał Winiarski 		.can_position = true,
174*e9f696f8SMichał Winiarski 		.src_expected = { 0, 0, 1023 << 16, 767 << 16 },
175*e9f696f8SMichał Winiarski 		.crtc_expected = { 0, 0, 1023, 767 },
176*e9f696f8SMichał Winiarski 	},
177*e9f696f8SMichał Winiarski 	{
178*e9f696f8SMichał Winiarski 		.name = "upscaling",
179*e9f696f8SMichał Winiarski 		.msg = "Upscaling exactly 2x should work",
180*e9f696f8SMichał Winiarski 		.src = { 0, 0, 512 << 16, 384 << 16 },
181*e9f696f8SMichał Winiarski 		.crtc = { 0, 0, 1024, 768 },
182*e9f696f8SMichał Winiarski 		.rotation = DRM_MODE_ROTATE_0,
183*e9f696f8SMichał Winiarski 		.min_scale = 0x8000,
184*e9f696f8SMichał Winiarski 		.max_scale = DRM_PLANE_NO_SCALING,
185*e9f696f8SMichał Winiarski 		.can_position = false,
186*e9f696f8SMichał Winiarski 		.src_expected = { 0, 0, 512 << 16, 384 << 16 },
187*e9f696f8SMichał Winiarski 		.crtc_expected = { 0, 0, 1024, 768 },
188*e9f696f8SMichał Winiarski 	},
189*e9f696f8SMichał Winiarski 	{
190*e9f696f8SMichał Winiarski 		.name = "downscaling",
191*e9f696f8SMichał Winiarski 		.msg = "Should succeed with exact scaling limit",
192*e9f696f8SMichał Winiarski 		.src = { 0, 0, 2048 << 16, 1536 << 16 },
193*e9f696f8SMichał Winiarski 		.crtc = { 0, 0, 1024, 768 },
194*e9f696f8SMichał Winiarski 		.rotation = DRM_MODE_ROTATE_0,
195*e9f696f8SMichał Winiarski 		.min_scale = DRM_PLANE_NO_SCALING,
196*e9f696f8SMichał Winiarski 		.max_scale = 0x20000,
197*e9f696f8SMichał Winiarski 		.can_position = false,
198*e9f696f8SMichał Winiarski 		.src_expected = { 0, 0, 2048 << 16, 1536 << 16 },
199*e9f696f8SMichał Winiarski 		.crtc_expected = { 0, 0, 1024, 768 },
200*e9f696f8SMichał Winiarski 	},
201*e9f696f8SMichał Winiarski 	{
202*e9f696f8SMichał Winiarski 		.name = "rounding1",
203*e9f696f8SMichał Winiarski 		.msg = "Should succeed by clipping to exact multiple",
204*e9f696f8SMichał Winiarski 		.src = { 0, 0, 0x40001, 0x40001 },
205*e9f696f8SMichał Winiarski 		.crtc = { 1022, 766, 4, 4 },
206*e9f696f8SMichał Winiarski 		.rotation = DRM_MODE_ROTATE_0,
207*e9f696f8SMichał Winiarski 		.min_scale = DRM_PLANE_NO_SCALING,
208*e9f696f8SMichał Winiarski 		.max_scale = 0x10001,
209*e9f696f8SMichał Winiarski 		.can_position = true,
210*e9f696f8SMichał Winiarski 		.src_expected = { 0, 0, 2 << 16, 2 << 16 },
211*e9f696f8SMichał Winiarski 		.crtc_expected = { 1022, 766, 2, 2 },
212*e9f696f8SMichał Winiarski 	},
213*e9f696f8SMichał Winiarski 	{
214*e9f696f8SMichał Winiarski 		.name = "rounding2",
215*e9f696f8SMichał Winiarski 		.msg = "Should succeed by clipping to exact multiple",
216*e9f696f8SMichał Winiarski 		.src = { 0x20001, 0x20001, 0x4040001, 0x3040001 },
217*e9f696f8SMichał Winiarski 		.crtc = { -2, -2, 1028, 772 },
218*e9f696f8SMichał Winiarski 		.rotation = DRM_MODE_ROTATE_0,
219*e9f696f8SMichał Winiarski 		.min_scale = DRM_PLANE_NO_SCALING,
220*e9f696f8SMichał Winiarski 		.max_scale = 0x10001,
221*e9f696f8SMichał Winiarski 		.can_position = false,
222*e9f696f8SMichał Winiarski 		.src_expected = { 0x40002, 0x40002, 1024 << 16, 768 << 16 },
223*e9f696f8SMichał Winiarski 		.crtc_expected = { 0, 0, 1024, 768 },
224*e9f696f8SMichał Winiarski 	},
225*e9f696f8SMichał Winiarski 	{
226*e9f696f8SMichał Winiarski 		.name = "rounding3",
227*e9f696f8SMichał Winiarski 		.msg = "Should succeed by clipping to exact multiple",
228*e9f696f8SMichał Winiarski 		.src = { 0, 0, 0x3ffff, 0x3ffff },
229*e9f696f8SMichał Winiarski 		.crtc = { 1022, 766, 4, 4 },
230*e9f696f8SMichał Winiarski 		.rotation = DRM_MODE_ROTATE_0,
231*e9f696f8SMichał Winiarski 		.min_scale = 0xffff,
232*e9f696f8SMichał Winiarski 		.max_scale = DRM_PLANE_NO_SCALING,
233*e9f696f8SMichał Winiarski 		.can_position = true,
234*e9f696f8SMichał Winiarski 		/* Should not be rounded to 0x20001, which would be upscaling. */
235*e9f696f8SMichał Winiarski 		.src_expected = { 0, 0, 2 << 16, 2 << 16 },
236*e9f696f8SMichał Winiarski 		.crtc_expected = { 1022, 766, 2, 2 },
237*e9f696f8SMichał Winiarski 	},
238*e9f696f8SMichał Winiarski 	{
239*e9f696f8SMichał Winiarski 		.name = "rounding4",
240*e9f696f8SMichał Winiarski 		.msg = "Should succeed by clipping to exact multiple",
241*e9f696f8SMichał Winiarski 		.src = { 0x1ffff, 0x1ffff, 0x403ffff, 0x303ffff },
242*e9f696f8SMichał Winiarski 		.crtc = { -2, -2, 1028, 772 },
243*e9f696f8SMichał Winiarski 		.rotation = DRM_MODE_ROTATE_0,
244*e9f696f8SMichał Winiarski 		.min_scale = 0xffff,
245*e9f696f8SMichał Winiarski 		.max_scale = DRM_PLANE_NO_SCALING,
246*e9f696f8SMichał Winiarski 		.can_position = false,
247*e9f696f8SMichał Winiarski 		.src_expected = { 0x3fffe, 0x3fffe, 1024 << 16, 768 << 16 },
248*e9f696f8SMichał Winiarski 		.crtc_expected = { 0, 0, 1024, 768 },
249*e9f696f8SMichał Winiarski 	},
250*e9f696f8SMichał Winiarski };
251*e9f696f8SMichał Winiarski 
252*e9f696f8SMichał Winiarski KUNIT_ARRAY_PARAM(drm_check_plane_state, drm_check_plane_state_tests, drm_check_plane_state_desc);
253*e9f696f8SMichał Winiarski 
drm_test_check_invalid_plane_state(struct kunit * test)254*e9f696f8SMichał Winiarski static void drm_test_check_invalid_plane_state(struct kunit *test)
255*e9f696f8SMichał Winiarski {
256*e9f696f8SMichał Winiarski 	const struct drm_check_plane_state_test *params = test->param_value;
257*e9f696f8SMichał Winiarski 	struct drm_plane_state *plane_state = test->priv;
258*e9f696f8SMichał Winiarski 
259*e9f696f8SMichał Winiarski 	KUNIT_ASSERT_LT_MSG(test,
260*e9f696f8SMichał Winiarski 			    drm_atomic_helper_check_plane_state(plane_state, &crtc_state,
261*e9f696f8SMichał Winiarski 								params->min_scale,
262*e9f696f8SMichał Winiarski 								params->max_scale,
263*e9f696f8SMichał Winiarski 								params->can_position, false),
264*e9f696f8SMichał Winiarski 			    0, params->msg);
265*e9f696f8SMichał Winiarski }
266*e9f696f8SMichał Winiarski 
267*e9f696f8SMichał Winiarski static const struct drm_check_plane_state_test drm_check_invalid_plane_state_tests[] = {
268*e9f696f8SMichał Winiarski 	{
269*e9f696f8SMichał Winiarski 		.name = "positioning_invalid",
270*e9f696f8SMichał Winiarski 		.msg = "Should not be able to position on the crtc with can_position=false",
271*e9f696f8SMichał Winiarski 		.src = { 0, 0, 1023 << 16, 767 << 16 },
272*e9f696f8SMichał Winiarski 		.crtc = { 0, 0, 1023, 767 },
273*e9f696f8SMichał Winiarski 		.rotation = DRM_MODE_ROTATE_0,
274*e9f696f8SMichał Winiarski 		.min_scale = DRM_PLANE_NO_SCALING,
275*e9f696f8SMichał Winiarski 		.max_scale = DRM_PLANE_NO_SCALING,
276*e9f696f8SMichał Winiarski 		.can_position = false,
277*e9f696f8SMichał Winiarski 	},
278*e9f696f8SMichał Winiarski 	{
279*e9f696f8SMichał Winiarski 		.name = "upscaling_invalid",
280*e9f696f8SMichał Winiarski 		.msg = "Upscaling out of range should fail",
281*e9f696f8SMichał Winiarski 		.src = { 0, 0, 512 << 16, 384 << 16 },
282*e9f696f8SMichał Winiarski 		.crtc = { 0, 0, 1024, 768 },
283*e9f696f8SMichał Winiarski 		.rotation = DRM_MODE_ROTATE_0,
284*e9f696f8SMichał Winiarski 		.min_scale = 0x8001,
285*e9f696f8SMichał Winiarski 		.max_scale = DRM_PLANE_NO_SCALING,
286*e9f696f8SMichał Winiarski 		.can_position = false,
287*e9f696f8SMichał Winiarski 	},
288*e9f696f8SMichał Winiarski 	{
289*e9f696f8SMichał Winiarski 		.name = "downscaling_invalid",
290*e9f696f8SMichał Winiarski 		.msg = "Downscaling out of range should fail",
291*e9f696f8SMichał Winiarski 		.src = { 0, 0, 2048 << 16, 1536 << 16 },
292*e9f696f8SMichał Winiarski 		.crtc = { 0, 0, 1024, 768 },
293*e9f696f8SMichał Winiarski 		.rotation = DRM_MODE_ROTATE_0,
294*e9f696f8SMichał Winiarski 		.min_scale = DRM_PLANE_NO_SCALING,
295*e9f696f8SMichał Winiarski 		.max_scale = 0x1ffff,
296*e9f696f8SMichał Winiarski 		.can_position = false,
297*e9f696f8SMichał Winiarski 	},
298*e9f696f8SMichał Winiarski };
299*e9f696f8SMichał Winiarski 
300*e9f696f8SMichał Winiarski KUNIT_ARRAY_PARAM(drm_check_invalid_plane_state, drm_check_invalid_plane_state_tests,
301*e9f696f8SMichał Winiarski 		  drm_check_plane_state_desc);
302*e9f696f8SMichał Winiarski 
303913b1e7cSMaíra Canal static struct kunit_case drm_plane_helper_test[] = {
304*e9f696f8SMichał Winiarski 	KUNIT_CASE_PARAM(drm_test_check_plane_state, drm_check_plane_state_gen_params),
305*e9f696f8SMichał Winiarski 	KUNIT_CASE_PARAM(drm_test_check_invalid_plane_state,
306*e9f696f8SMichał Winiarski 			 drm_check_invalid_plane_state_gen_params),
307913b1e7cSMaíra Canal 	{}
308913b1e7cSMaíra Canal };
309913b1e7cSMaíra Canal 
310913b1e7cSMaíra Canal static struct kunit_suite drm_plane_helper_test_suite = {
311913b1e7cSMaíra Canal 	.name = "drm_plane_helper",
312*e9f696f8SMichał Winiarski 	.init = drm_plane_helper_init,
313913b1e7cSMaíra Canal 	.test_cases = drm_plane_helper_test,
314913b1e7cSMaíra Canal };
315913b1e7cSMaíra Canal 
316913b1e7cSMaíra Canal kunit_test_suite(drm_plane_helper_test_suite);
317913b1e7cSMaíra Canal 
318913b1e7cSMaíra Canal MODULE_LICENSE("GPL");
319