xref: /linux/drivers/gpu/drm/vkms/tests/vkms_config_test.c (revision ab93e0dd72c37d378dd936f031ffb83ff2bd87ce)
15b5a56d9SJosé Expósito // SPDX-License-Identifier: GPL-2.0+
25b5a56d9SJosé Expósito 
35b5a56d9SJosé Expósito #include <kunit/test.h>
45b5a56d9SJosé Expósito 
5d3ae1e39SJosé Expósito #include "../vkms_config.h"
6d3ae1e39SJosé Expósito 
75b5a56d9SJosé Expósito MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");
85b5a56d9SJosé Expósito 
9bc5b0d5dSJosé Expósito static size_t vkms_config_get_num_planes(struct vkms_config *config)
10bc5b0d5dSJosé Expósito {
11bc5b0d5dSJosé Expósito 	struct vkms_config_plane *plane_cfg;
12bc5b0d5dSJosé Expósito 	size_t count = 0;
13bc5b0d5dSJosé Expósito 
14bc5b0d5dSJosé Expósito 	vkms_config_for_each_plane(config, plane_cfg)
15bc5b0d5dSJosé Expósito 		count++;
16bc5b0d5dSJosé Expósito 
17bc5b0d5dSJosé Expósito 	return count;
18bc5b0d5dSJosé Expósito }
19bc5b0d5dSJosé Expósito 
20f60a183dSJosé Expósito static size_t vkms_config_get_num_encoders(struct vkms_config *config)
21f60a183dSJosé Expósito {
22f60a183dSJosé Expósito 	struct vkms_config_encoder *encoder_cfg;
23f60a183dSJosé Expósito 	size_t count = 0;
24f60a183dSJosé Expósito 
25f60a183dSJosé Expósito 	vkms_config_for_each_encoder(config, encoder_cfg)
26f60a183dSJosé Expósito 		count++;
27f60a183dSJosé Expósito 
28f60a183dSJosé Expósito 	return count;
29f60a183dSJosé Expósito }
30f60a183dSJosé Expósito 
31da38c720SJosé Expósito static size_t vkms_config_get_num_connectors(struct vkms_config *config)
32da38c720SJosé Expósito {
33da38c720SJosé Expósito 	struct vkms_config_connector *connector_cfg;
34da38c720SJosé Expósito 	size_t count = 0;
35da38c720SJosé Expósito 
36da38c720SJosé Expósito 	vkms_config_for_each_connector(config, connector_cfg)
37da38c720SJosé Expósito 		count++;
38da38c720SJosé Expósito 
39da38c720SJosé Expósito 	return count;
40da38c720SJosé Expósito }
41da38c720SJosé Expósito 
42bc5b0d5dSJosé Expósito static struct vkms_config_plane *get_first_plane(struct vkms_config *config)
43bc5b0d5dSJosé Expósito {
44bc5b0d5dSJosé Expósito 	struct vkms_config_plane *plane_cfg;
45bc5b0d5dSJosé Expósito 
46bc5b0d5dSJosé Expósito 	vkms_config_for_each_plane(config, plane_cfg)
47bc5b0d5dSJosé Expósito 		return plane_cfg;
48bc5b0d5dSJosé Expósito 
49bc5b0d5dSJosé Expósito 	return NULL;
50bc5b0d5dSJosé Expósito }
51bc5b0d5dSJosé Expósito 
52600df32dSJosé Expósito static struct vkms_config_crtc *get_first_crtc(struct vkms_config *config)
53600df32dSJosé Expósito {
54600df32dSJosé Expósito 	struct vkms_config_crtc *crtc_cfg;
55600df32dSJosé Expósito 
56600df32dSJosé Expósito 	vkms_config_for_each_crtc(config, crtc_cfg)
57600df32dSJosé Expósito 		return crtc_cfg;
58600df32dSJosé Expósito 
59600df32dSJosé Expósito 	return NULL;
60600df32dSJosé Expósito }
61600df32dSJosé Expósito 
62f60a183dSJosé Expósito static struct vkms_config_encoder *get_first_encoder(struct vkms_config *config)
63f60a183dSJosé Expósito {
64f60a183dSJosé Expósito 	struct vkms_config_encoder *encoder_cfg;
65f60a183dSJosé Expósito 
66f60a183dSJosé Expósito 	vkms_config_for_each_encoder(config, encoder_cfg)
67f60a183dSJosé Expósito 		return encoder_cfg;
68f60a183dSJosé Expósito 
69f60a183dSJosé Expósito 	return NULL;
70f60a183dSJosé Expósito }
71f60a183dSJosé Expósito 
72da38c720SJosé Expósito static struct vkms_config_connector *get_first_connector(struct vkms_config *config)
73da38c720SJosé Expósito {
74da38c720SJosé Expósito 	struct vkms_config_connector *connector_cfg;
75da38c720SJosé Expósito 
76da38c720SJosé Expósito 	vkms_config_for_each_connector(config, connector_cfg)
77da38c720SJosé Expósito 		return connector_cfg;
78da38c720SJosé Expósito 
79da38c720SJosé Expósito 	return NULL;
80da38c720SJosé Expósito }
81da38c720SJosé Expósito 
828b059b0cSJosé Expósito struct default_config_case {
838b059b0cSJosé Expósito 	bool enable_cursor;
848b059b0cSJosé Expósito 	bool enable_writeback;
858b059b0cSJosé Expósito 	bool enable_overlay;
868b059b0cSJosé Expósito };
878b059b0cSJosé Expósito 
88d3ae1e39SJosé Expósito static void vkms_config_test_empty_config(struct kunit *test)
89d3ae1e39SJosé Expósito {
90d3ae1e39SJosé Expósito 	struct vkms_config *config;
91969a3a4eSJosé Expósito 	const char *dev_name = "test";
92d3ae1e39SJosé Expósito 
93969a3a4eSJosé Expósito 	config = vkms_config_create(dev_name);
94d3ae1e39SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
95d3ae1e39SJosé Expósito 
96969a3a4eSJosé Expósito 	/* The dev_name string and the config have different lifetimes */
97969a3a4eSJosé Expósito 	dev_name = NULL;
98969a3a4eSJosé Expósito 	KUNIT_EXPECT_STREQ(test, vkms_config_get_device_name(config), "test");
99969a3a4eSJosé Expósito 
100bc5b0d5dSJosé Expósito 	KUNIT_EXPECT_EQ(test, vkms_config_get_num_planes(config), 0);
101600df32dSJosé Expósito 	KUNIT_EXPECT_EQ(test, vkms_config_get_num_crtcs(config), 0);
102f60a183dSJosé Expósito 	KUNIT_EXPECT_EQ(test, vkms_config_get_num_encoders(config), 0);
103da38c720SJosé Expósito 	KUNIT_EXPECT_EQ(test, vkms_config_get_num_connectors(config), 0);
104bc5b0d5dSJosé Expósito 
105bc5b0d5dSJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
106bc5b0d5dSJosé Expósito 
107d3ae1e39SJosé Expósito 	vkms_config_destroy(config);
108d3ae1e39SJosé Expósito }
109d3ae1e39SJosé Expósito 
1108b059b0cSJosé Expósito static struct default_config_case default_config_cases[] = {
1118b059b0cSJosé Expósito 	{ false, false, false },
1128b059b0cSJosé Expósito 	{ true, false, false },
1138b059b0cSJosé Expósito 	{ true, true, false },
1148b059b0cSJosé Expósito 	{ true, false, true },
1158b059b0cSJosé Expósito 	{ false, true, false },
1168b059b0cSJosé Expósito 	{ false, true, true },
1178b059b0cSJosé Expósito 	{ false, false, true },
1188b059b0cSJosé Expósito 	{ true, true, true },
1198b059b0cSJosé Expósito };
1208b059b0cSJosé Expósito 
1218b059b0cSJosé Expósito KUNIT_ARRAY_PARAM(default_config, default_config_cases, NULL);
1228b059b0cSJosé Expósito 
1238b059b0cSJosé Expósito static void vkms_config_test_default_config(struct kunit *test)
1248b059b0cSJosé Expósito {
1258b059b0cSJosé Expósito 	const struct default_config_case *params = test->param_value;
1268b059b0cSJosé Expósito 	struct vkms_config *config;
127bc5b0d5dSJosé Expósito 	struct vkms_config_plane *plane_cfg;
128600df32dSJosé Expósito 	struct vkms_config_crtc *crtc_cfg;
129bc5b0d5dSJosé Expósito 	int n_primaries = 0;
130bc5b0d5dSJosé Expósito 	int n_cursors = 0;
131bc5b0d5dSJosé Expósito 	int n_overlays = 0;
1328b059b0cSJosé Expósito 
1338b059b0cSJosé Expósito 	config = vkms_config_default_create(params->enable_cursor,
1348b059b0cSJosé Expósito 					    params->enable_writeback,
1358b059b0cSJosé Expósito 					    params->enable_overlay);
1368b059b0cSJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
1378b059b0cSJosé Expósito 
138bc5b0d5dSJosé Expósito 	/* Planes */
139bc5b0d5dSJosé Expósito 	vkms_config_for_each_plane(config, plane_cfg) {
140bc5b0d5dSJosé Expósito 		switch (vkms_config_plane_get_type(plane_cfg)) {
141bc5b0d5dSJosé Expósito 		case DRM_PLANE_TYPE_PRIMARY:
142bc5b0d5dSJosé Expósito 			n_primaries++;
143bc5b0d5dSJosé Expósito 			break;
144bc5b0d5dSJosé Expósito 		case DRM_PLANE_TYPE_CURSOR:
145bc5b0d5dSJosé Expósito 			n_cursors++;
146bc5b0d5dSJosé Expósito 			break;
147bc5b0d5dSJosé Expósito 		case DRM_PLANE_TYPE_OVERLAY:
148bc5b0d5dSJosé Expósito 			n_overlays++;
149bc5b0d5dSJosé Expósito 			break;
150bc5b0d5dSJosé Expósito 		default:
151bc5b0d5dSJosé Expósito 			KUNIT_FAIL_AND_ABORT(test, "Unknown plane type");
152bc5b0d5dSJosé Expósito 		}
153bc5b0d5dSJosé Expósito 	}
154bc5b0d5dSJosé Expósito 	KUNIT_EXPECT_EQ(test, n_primaries, 1);
155bc5b0d5dSJosé Expósito 	KUNIT_EXPECT_EQ(test, n_cursors, params->enable_cursor ? 1 : 0);
156bc5b0d5dSJosé Expósito 	KUNIT_EXPECT_EQ(test, n_overlays, params->enable_overlay ? 8 : 0);
157bc5b0d5dSJosé Expósito 
158600df32dSJosé Expósito 	/* CRTCs */
159600df32dSJosé Expósito 	KUNIT_EXPECT_EQ(test, vkms_config_get_num_crtcs(config), 1);
160600df32dSJosé Expósito 
161600df32dSJosé Expósito 	crtc_cfg = get_first_crtc(config);
162600df32dSJosé Expósito 	KUNIT_EXPECT_EQ(test, vkms_config_crtc_get_writeback(crtc_cfg),
163600df32dSJosé Expósito 			params->enable_writeback);
164600df32dSJosé Expósito 
165c204bf65SJosé Expósito 	vkms_config_for_each_plane(config, plane_cfg) {
166c204bf65SJosé Expósito 		struct vkms_config_crtc *possible_crtc;
167c204bf65SJosé Expósito 		int n_possible_crtcs = 0;
168c204bf65SJosé Expósito 		unsigned long idx = 0;
169c204bf65SJosé Expósito 
170c204bf65SJosé Expósito 		vkms_config_plane_for_each_possible_crtc(plane_cfg, idx, possible_crtc) {
171c204bf65SJosé Expósito 			KUNIT_EXPECT_PTR_EQ(test, crtc_cfg, possible_crtc);
172c204bf65SJosé Expósito 			n_possible_crtcs++;
173c204bf65SJosé Expósito 		}
174c204bf65SJosé Expósito 		KUNIT_EXPECT_EQ(test, n_possible_crtcs, 1);
175c204bf65SJosé Expósito 	}
176c204bf65SJosé Expósito 
177f60a183dSJosé Expósito 	/* Encoders */
178f60a183dSJosé Expósito 	KUNIT_EXPECT_EQ(test, vkms_config_get_num_encoders(config), 1);
179f60a183dSJosé Expósito 
180da38c720SJosé Expósito 	/* Connectors */
181da38c720SJosé Expósito 	KUNIT_EXPECT_EQ(test, vkms_config_get_num_connectors(config), 1);
182da38c720SJosé Expósito 
183bc5b0d5dSJosé Expósito 	KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config));
184bc5b0d5dSJosé Expósito 
185bc5b0d5dSJosé Expósito 	vkms_config_destroy(config);
186bc5b0d5dSJosé Expósito }
187bc5b0d5dSJosé Expósito 
188bc5b0d5dSJosé Expósito static void vkms_config_test_get_planes(struct kunit *test)
189bc5b0d5dSJosé Expósito {
190bc5b0d5dSJosé Expósito 	struct vkms_config *config;
191bc5b0d5dSJosé Expósito 	struct vkms_config_plane *plane_cfg;
192bc5b0d5dSJosé Expósito 	struct vkms_config_plane *plane_cfg1, *plane_cfg2;
193bc5b0d5dSJosé Expósito 	int n_planes = 0;
194bc5b0d5dSJosé Expósito 
195bc5b0d5dSJosé Expósito 	config = vkms_config_create("test");
196bc5b0d5dSJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
197bc5b0d5dSJosé Expósito 
198bc5b0d5dSJosé Expósito 	vkms_config_for_each_plane(config, plane_cfg)
199bc5b0d5dSJosé Expósito 		n_planes++;
200bc5b0d5dSJosé Expósito 	KUNIT_ASSERT_EQ(test, n_planes, 0);
201bc5b0d5dSJosé Expósito 
202bc5b0d5dSJosé Expósito 	plane_cfg1 = vkms_config_create_plane(config);
203bc5b0d5dSJosé Expósito 	vkms_config_for_each_plane(config, plane_cfg) {
204bc5b0d5dSJosé Expósito 		n_planes++;
205bc5b0d5dSJosé Expósito 		if (plane_cfg != plane_cfg1)
206bc5b0d5dSJosé Expósito 			KUNIT_FAIL(test, "Unexpected plane");
207bc5b0d5dSJosé Expósito 	}
208bc5b0d5dSJosé Expósito 	KUNIT_ASSERT_EQ(test, n_planes, 1);
209bc5b0d5dSJosé Expósito 	n_planes = 0;
210bc5b0d5dSJosé Expósito 
211bc5b0d5dSJosé Expósito 	plane_cfg2 = vkms_config_create_plane(config);
212bc5b0d5dSJosé Expósito 	vkms_config_for_each_plane(config, plane_cfg) {
213bc5b0d5dSJosé Expósito 		n_planes++;
214bc5b0d5dSJosé Expósito 		if (plane_cfg != plane_cfg1 && plane_cfg != plane_cfg2)
215bc5b0d5dSJosé Expósito 			KUNIT_FAIL(test, "Unexpected plane");
216bc5b0d5dSJosé Expósito 	}
217bc5b0d5dSJosé Expósito 	KUNIT_ASSERT_EQ(test, n_planes, 2);
218bc5b0d5dSJosé Expósito 	n_planes = 0;
219bc5b0d5dSJosé Expósito 
220bc5b0d5dSJosé Expósito 	vkms_config_destroy_plane(plane_cfg1);
221bc5b0d5dSJosé Expósito 	vkms_config_for_each_plane(config, plane_cfg) {
222bc5b0d5dSJosé Expósito 		n_planes++;
223bc5b0d5dSJosé Expósito 		if (plane_cfg != plane_cfg2)
224bc5b0d5dSJosé Expósito 			KUNIT_FAIL(test, "Unexpected plane");
225bc5b0d5dSJosé Expósito 	}
226bc5b0d5dSJosé Expósito 	KUNIT_ASSERT_EQ(test, n_planes, 1);
227bc5b0d5dSJosé Expósito 
228bc5b0d5dSJosé Expósito 	vkms_config_destroy(config);
229bc5b0d5dSJosé Expósito }
230bc5b0d5dSJosé Expósito 
231600df32dSJosé Expósito static void vkms_config_test_get_crtcs(struct kunit *test)
232600df32dSJosé Expósito {
233600df32dSJosé Expósito 	struct vkms_config *config;
234600df32dSJosé Expósito 	struct vkms_config_crtc *crtc_cfg;
235600df32dSJosé Expósito 	struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2;
236600df32dSJosé Expósito 
237600df32dSJosé Expósito 	config = vkms_config_create("test");
238600df32dSJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
239600df32dSJosé Expósito 
240600df32dSJosé Expósito 	KUNIT_ASSERT_EQ(test, vkms_config_get_num_crtcs(config), 0);
241600df32dSJosé Expósito 	vkms_config_for_each_crtc(config, crtc_cfg)
242600df32dSJosé Expósito 		KUNIT_FAIL(test, "Unexpected CRTC");
243600df32dSJosé Expósito 
244600df32dSJosé Expósito 	crtc_cfg1 = vkms_config_create_crtc(config);
245600df32dSJosé Expósito 	KUNIT_ASSERT_EQ(test, vkms_config_get_num_crtcs(config), 1);
246600df32dSJosé Expósito 	vkms_config_for_each_crtc(config, crtc_cfg) {
247600df32dSJosé Expósito 		if (crtc_cfg != crtc_cfg1)
248600df32dSJosé Expósito 			KUNIT_FAIL(test, "Unexpected CRTC");
249600df32dSJosé Expósito 	}
250600df32dSJosé Expósito 
251600df32dSJosé Expósito 	crtc_cfg2 = vkms_config_create_crtc(config);
252600df32dSJosé Expósito 	KUNIT_ASSERT_EQ(test, vkms_config_get_num_crtcs(config), 2);
253600df32dSJosé Expósito 	vkms_config_for_each_crtc(config, crtc_cfg) {
254600df32dSJosé Expósito 		if (crtc_cfg != crtc_cfg1 && crtc_cfg != crtc_cfg2)
255600df32dSJosé Expósito 			KUNIT_FAIL(test, "Unexpected CRTC");
256600df32dSJosé Expósito 	}
257600df32dSJosé Expósito 
258600df32dSJosé Expósito 	vkms_config_destroy_crtc(config, crtc_cfg2);
259600df32dSJosé Expósito 	KUNIT_ASSERT_EQ(test, vkms_config_get_num_crtcs(config), 1);
260600df32dSJosé Expósito 	vkms_config_for_each_crtc(config, crtc_cfg) {
261600df32dSJosé Expósito 		if (crtc_cfg != crtc_cfg1)
262600df32dSJosé Expósito 			KUNIT_FAIL(test, "Unexpected CRTC");
263600df32dSJosé Expósito 	}
264600df32dSJosé Expósito 
265600df32dSJosé Expósito 	vkms_config_destroy(config);
266600df32dSJosé Expósito }
267600df32dSJosé Expósito 
268f60a183dSJosé Expósito static void vkms_config_test_get_encoders(struct kunit *test)
269f60a183dSJosé Expósito {
270f60a183dSJosé Expósito 	struct vkms_config *config;
271f60a183dSJosé Expósito 	struct vkms_config_encoder *encoder_cfg;
272f60a183dSJosé Expósito 	struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2;
273f60a183dSJosé Expósito 	int n_encoders = 0;
274f60a183dSJosé Expósito 
275f60a183dSJosé Expósito 	config = vkms_config_create("test");
276f60a183dSJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
277f60a183dSJosé Expósito 
278f60a183dSJosé Expósito 	vkms_config_for_each_encoder(config, encoder_cfg)
279f60a183dSJosé Expósito 		n_encoders++;
280f60a183dSJosé Expósito 	KUNIT_ASSERT_EQ(test, n_encoders, 0);
281f60a183dSJosé Expósito 
282f60a183dSJosé Expósito 	encoder_cfg1 = vkms_config_create_encoder(config);
283f60a183dSJosé Expósito 	vkms_config_for_each_encoder(config, encoder_cfg) {
284f60a183dSJosé Expósito 		n_encoders++;
285f60a183dSJosé Expósito 		if (encoder_cfg != encoder_cfg1)
286f60a183dSJosé Expósito 			KUNIT_FAIL(test, "Unexpected encoder");
287f60a183dSJosé Expósito 	}
288f60a183dSJosé Expósito 	KUNIT_ASSERT_EQ(test, n_encoders, 1);
289f60a183dSJosé Expósito 	n_encoders = 0;
290f60a183dSJosé Expósito 
291f60a183dSJosé Expósito 	encoder_cfg2 = vkms_config_create_encoder(config);
292f60a183dSJosé Expósito 	vkms_config_for_each_encoder(config, encoder_cfg) {
293f60a183dSJosé Expósito 		n_encoders++;
294f60a183dSJosé Expósito 		if (encoder_cfg != encoder_cfg1 && encoder_cfg != encoder_cfg2)
295f60a183dSJosé Expósito 			KUNIT_FAIL(test, "Unexpected encoder");
296f60a183dSJosé Expósito 	}
297f60a183dSJosé Expósito 	KUNIT_ASSERT_EQ(test, n_encoders, 2);
298f60a183dSJosé Expósito 	n_encoders = 0;
299f60a183dSJosé Expósito 
300f60a183dSJosé Expósito 	vkms_config_destroy_encoder(config, encoder_cfg2);
301f60a183dSJosé Expósito 	vkms_config_for_each_encoder(config, encoder_cfg) {
302f60a183dSJosé Expósito 		n_encoders++;
303f60a183dSJosé Expósito 		if (encoder_cfg != encoder_cfg1)
304f60a183dSJosé Expósito 			KUNIT_FAIL(test, "Unexpected encoder");
305f60a183dSJosé Expósito 	}
306f60a183dSJosé Expósito 	KUNIT_ASSERT_EQ(test, n_encoders, 1);
307f60a183dSJosé Expósito 	n_encoders = 0;
308f60a183dSJosé Expósito 
309f60a183dSJosé Expósito 	vkms_config_destroy(config);
310f60a183dSJosé Expósito }
311f60a183dSJosé Expósito 
312da38c720SJosé Expósito static void vkms_config_test_get_connectors(struct kunit *test)
313da38c720SJosé Expósito {
314da38c720SJosé Expósito 	struct vkms_config *config;
315da38c720SJosé Expósito 	struct vkms_config_connector *connector_cfg;
316da38c720SJosé Expósito 	struct vkms_config_connector *connector_cfg1, *connector_cfg2;
317da38c720SJosé Expósito 	int n_connectors = 0;
318da38c720SJosé Expósito 
319da38c720SJosé Expósito 	config = vkms_config_create("test");
320da38c720SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
321da38c720SJosé Expósito 
322da38c720SJosé Expósito 	vkms_config_for_each_connector(config, connector_cfg)
323da38c720SJosé Expósito 		n_connectors++;
324da38c720SJosé Expósito 	KUNIT_ASSERT_EQ(test, n_connectors, 0);
325da38c720SJosé Expósito 
326da38c720SJosé Expósito 	connector_cfg1 = vkms_config_create_connector(config);
327da38c720SJosé Expósito 	vkms_config_for_each_connector(config, connector_cfg) {
328da38c720SJosé Expósito 		n_connectors++;
329da38c720SJosé Expósito 		if (connector_cfg != connector_cfg1)
330da38c720SJosé Expósito 			KUNIT_FAIL(test, "Unexpected connector");
331da38c720SJosé Expósito 	}
332da38c720SJosé Expósito 	KUNIT_ASSERT_EQ(test, n_connectors, 1);
333da38c720SJosé Expósito 	n_connectors = 0;
334da38c720SJosé Expósito 
335da38c720SJosé Expósito 	connector_cfg2 = vkms_config_create_connector(config);
336da38c720SJosé Expósito 	vkms_config_for_each_connector(config, connector_cfg) {
337da38c720SJosé Expósito 		n_connectors++;
338da38c720SJosé Expósito 		if (connector_cfg != connector_cfg1 &&
339da38c720SJosé Expósito 		    connector_cfg != connector_cfg2)
340da38c720SJosé Expósito 			KUNIT_FAIL(test, "Unexpected connector");
341da38c720SJosé Expósito 	}
342da38c720SJosé Expósito 	KUNIT_ASSERT_EQ(test, n_connectors, 2);
343da38c720SJosé Expósito 	n_connectors = 0;
344da38c720SJosé Expósito 
345da38c720SJosé Expósito 	vkms_config_destroy_connector(connector_cfg2);
346da38c720SJosé Expósito 	vkms_config_for_each_connector(config, connector_cfg) {
347da38c720SJosé Expósito 		n_connectors++;
348da38c720SJosé Expósito 		if (connector_cfg != connector_cfg1)
349da38c720SJosé Expósito 			KUNIT_FAIL(test, "Unexpected connector");
350da38c720SJosé Expósito 	}
351da38c720SJosé Expósito 	KUNIT_ASSERT_EQ(test, n_connectors, 1);
352da38c720SJosé Expósito 	n_connectors = 0;
353da38c720SJosé Expósito 
354da38c720SJosé Expósito 	vkms_config_destroy(config);
355da38c720SJosé Expósito }
356da38c720SJosé Expósito 
357bc5b0d5dSJosé Expósito static void vkms_config_test_invalid_plane_number(struct kunit *test)
358bc5b0d5dSJosé Expósito {
359bc5b0d5dSJosé Expósito 	struct vkms_config *config;
360bc5b0d5dSJosé Expósito 	struct vkms_config_plane *plane_cfg;
361bc5b0d5dSJosé Expósito 	int n;
362bc5b0d5dSJosé Expósito 
363bc5b0d5dSJosé Expósito 	config = vkms_config_default_create(false, false, false);
364bc5b0d5dSJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
365bc5b0d5dSJosé Expósito 
366bc5b0d5dSJosé Expósito 	/* Invalid: No planes */
367bc5b0d5dSJosé Expósito 	plane_cfg = get_first_plane(config);
368bc5b0d5dSJosé Expósito 	vkms_config_destroy_plane(plane_cfg);
369bc5b0d5dSJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
370bc5b0d5dSJosé Expósito 
371bc5b0d5dSJosé Expósito 	/* Invalid: Too many planes */
372bc5b0d5dSJosé Expósito 	for (n = 0; n <= 32; n++)
373bc5b0d5dSJosé Expósito 		vkms_config_create_plane(config);
374bc5b0d5dSJosé Expósito 
375bc5b0d5dSJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
376bc5b0d5dSJosé Expósito 
377bc5b0d5dSJosé Expósito 	vkms_config_destroy(config);
378bc5b0d5dSJosé Expósito }
379bc5b0d5dSJosé Expósito 
380bc5b0d5dSJosé Expósito static void vkms_config_test_valid_plane_type(struct kunit *test)
381bc5b0d5dSJosé Expósito {
382bc5b0d5dSJosé Expósito 	struct vkms_config *config;
383bc5b0d5dSJosé Expósito 	struct vkms_config_plane *plane_cfg;
384c204bf65SJosé Expósito 	struct vkms_config_crtc *crtc_cfg;
385b8776fc9SJosé Expósito 	struct vkms_config_encoder *encoder_cfg;
386c204bf65SJosé Expósito 	int err;
387bc5b0d5dSJosé Expósito 
388bc5b0d5dSJosé Expósito 	config = vkms_config_default_create(false, false, false);
389bc5b0d5dSJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
390bc5b0d5dSJosé Expósito 
391bc5b0d5dSJosé Expósito 	plane_cfg = get_first_plane(config);
392bc5b0d5dSJosé Expósito 	vkms_config_destroy_plane(plane_cfg);
393bc5b0d5dSJosé Expósito 
394c204bf65SJosé Expósito 	crtc_cfg = get_first_crtc(config);
395c204bf65SJosé Expósito 
396bc5b0d5dSJosé Expósito 	/* Invalid: No primary plane */
397bc5b0d5dSJosé Expósito 	plane_cfg = vkms_config_create_plane(config);
398bc5b0d5dSJosé Expósito 	vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY);
399c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg);
400c204bf65SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
401bc5b0d5dSJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
402bc5b0d5dSJosé Expósito 
403bc5b0d5dSJosé Expósito 	/* Invalid: Multiple primary planes */
404bc5b0d5dSJosé Expósito 	plane_cfg = vkms_config_create_plane(config);
405bc5b0d5dSJosé Expósito 	vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY);
406c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg);
407c204bf65SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
408c204bf65SJosé Expósito 
409bc5b0d5dSJosé Expósito 	plane_cfg = vkms_config_create_plane(config);
410bc5b0d5dSJosé Expósito 	vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY);
411c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg);
412c204bf65SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
413c204bf65SJosé Expósito 
414bc5b0d5dSJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
415bc5b0d5dSJosé Expósito 
416bc5b0d5dSJosé Expósito 	/* Valid: One primary plane */
417bc5b0d5dSJosé Expósito 	vkms_config_destroy_plane(plane_cfg);
418bc5b0d5dSJosé Expósito 	KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config));
419bc5b0d5dSJosé Expósito 
420bc5b0d5dSJosé Expósito 	/* Invalid: Multiple cursor planes */
421bc5b0d5dSJosé Expósito 	plane_cfg = vkms_config_create_plane(config);
422bc5b0d5dSJosé Expósito 	vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_CURSOR);
423c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg);
424c204bf65SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
425c204bf65SJosé Expósito 
426bc5b0d5dSJosé Expósito 	plane_cfg = vkms_config_create_plane(config);
427bc5b0d5dSJosé Expósito 	vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_CURSOR);
428c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg);
429c204bf65SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
430c204bf65SJosé Expósito 
431bc5b0d5dSJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
432bc5b0d5dSJosé Expósito 
433bc5b0d5dSJosé Expósito 	/* Valid: One primary and one cursor plane */
434bc5b0d5dSJosé Expósito 	vkms_config_destroy_plane(plane_cfg);
435d1386d72SLouis Chauvet 	KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config));
436d1386d72SLouis Chauvet 
437c204bf65SJosé Expósito 	/* Invalid: Second CRTC without primary plane */
438c204bf65SJosé Expósito 	crtc_cfg = vkms_config_create_crtc(config);
439b8776fc9SJosé Expósito 	encoder_cfg = vkms_config_create_encoder(config);
440b8776fc9SJosé Expósito 	err = vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg);
441b8776fc9SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
442c204bf65SJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
443c204bf65SJosé Expósito 
444c204bf65SJosé Expósito 	/* Valid: Second CRTC with a primary plane */
445c204bf65SJosé Expósito 	plane_cfg = vkms_config_create_plane(config);
446c204bf65SJosé Expósito 	vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY);
447c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg);
448c204bf65SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
449c204bf65SJosé Expósito 	KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config));
450c204bf65SJosé Expósito 
451c204bf65SJosé Expósito 	vkms_config_destroy(config);
452c204bf65SJosé Expósito }
453c204bf65SJosé Expósito 
454c204bf65SJosé Expósito static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test)
455c204bf65SJosé Expósito {
456c204bf65SJosé Expósito 	struct vkms_config *config;
457c204bf65SJosé Expósito 	struct vkms_config_plane *plane_cfg;
458c204bf65SJosé Expósito 	struct vkms_config_crtc *crtc_cfg;
459c204bf65SJosé Expósito 
460c204bf65SJosé Expósito 	config = vkms_config_default_create(false, false, false);
461c204bf65SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
462c204bf65SJosé Expósito 
463c204bf65SJosé Expósito 	plane_cfg = get_first_plane(config);
464c204bf65SJosé Expósito 	crtc_cfg = get_first_crtc(config);
465c204bf65SJosé Expósito 
466c204bf65SJosé Expósito 	/* Invalid: Primary plane without a possible CRTC */
467c204bf65SJosé Expósito 	vkms_config_plane_detach_crtc(plane_cfg, crtc_cfg);
468c204bf65SJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
469c204bf65SJosé Expósito 
4708b059b0cSJosé Expósito 	vkms_config_destroy(config);
4718b059b0cSJosé Expósito }
4728b059b0cSJosé Expósito 
473600df32dSJosé Expósito static void vkms_config_test_invalid_crtc_number(struct kunit *test)
474600df32dSJosé Expósito {
475600df32dSJosé Expósito 	struct vkms_config *config;
476600df32dSJosé Expósito 	struct vkms_config_crtc *crtc_cfg;
477600df32dSJosé Expósito 	int n;
478600df32dSJosé Expósito 
479600df32dSJosé Expósito 	config = vkms_config_default_create(false, false, false);
480600df32dSJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
481600df32dSJosé Expósito 
482600df32dSJosé Expósito 	/* Invalid: No CRTCs */
483600df32dSJosé Expósito 	crtc_cfg = get_first_crtc(config);
484600df32dSJosé Expósito 	vkms_config_destroy_crtc(config, crtc_cfg);
485600df32dSJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
486600df32dSJosé Expósito 
487600df32dSJosé Expósito 	/* Invalid: Too many CRTCs */
488600df32dSJosé Expósito 	for (n = 0; n <= 32; n++)
489600df32dSJosé Expósito 		vkms_config_create_crtc(config);
490600df32dSJosé Expósito 
491600df32dSJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
492600df32dSJosé Expósito 
493600df32dSJosé Expósito 	vkms_config_destroy(config);
494600df32dSJosé Expósito }
495600df32dSJosé Expósito 
496f60a183dSJosé Expósito static void vkms_config_test_invalid_encoder_number(struct kunit *test)
497f60a183dSJosé Expósito {
498f60a183dSJosé Expósito 	struct vkms_config *config;
499f60a183dSJosé Expósito 	struct vkms_config_encoder *encoder_cfg;
500f60a183dSJosé Expósito 	int n;
501f60a183dSJosé Expósito 
502f60a183dSJosé Expósito 	config = vkms_config_default_create(false, false, false);
503f60a183dSJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
504f60a183dSJosé Expósito 
505f60a183dSJosé Expósito 	/* Invalid: No encoders */
506f60a183dSJosé Expósito 	encoder_cfg = get_first_encoder(config);
507f60a183dSJosé Expósito 	vkms_config_destroy_encoder(config, encoder_cfg);
508f60a183dSJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
509f60a183dSJosé Expósito 
510f60a183dSJosé Expósito 	/* Invalid: Too many encoders */
511f60a183dSJosé Expósito 	for (n = 0; n <= 32; n++)
512f60a183dSJosé Expósito 		vkms_config_create_encoder(config);
513f60a183dSJosé Expósito 
514f60a183dSJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
515f60a183dSJosé Expósito 
516f60a183dSJosé Expósito 	vkms_config_destroy(config);
517f60a183dSJosé Expósito }
518f60a183dSJosé Expósito 
519b8776fc9SJosé Expósito static void vkms_config_test_valid_encoder_possible_crtcs(struct kunit *test)
520b8776fc9SJosé Expósito {
521b8776fc9SJosé Expósito 	struct vkms_config *config;
522b8776fc9SJosé Expósito 	struct vkms_config_plane *plane_cfg;
523b8776fc9SJosé Expósito 	struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2;
524b8776fc9SJosé Expósito 	struct vkms_config_encoder *encoder_cfg;
525b8776fc9SJosé Expósito 	int err;
526b8776fc9SJosé Expósito 
527b8776fc9SJosé Expósito 	config = vkms_config_default_create(false, false, false);
528b8776fc9SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
529b8776fc9SJosé Expósito 
530b8776fc9SJosé Expósito 	crtc_cfg1 = get_first_crtc(config);
531b8776fc9SJosé Expósito 
532b8776fc9SJosé Expósito 	/* Invalid: Encoder without a possible CRTC */
533b8776fc9SJosé Expósito 	encoder_cfg = vkms_config_create_encoder(config);
534b8776fc9SJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
535b8776fc9SJosé Expósito 
536b8776fc9SJosé Expósito 	/* Valid: Second CRTC with shared encoder */
537b8776fc9SJosé Expósito 	crtc_cfg2 = vkms_config_create_crtc(config);
538b8776fc9SJosé Expósito 
539b8776fc9SJosé Expósito 	plane_cfg = vkms_config_create_plane(config);
540b8776fc9SJosé Expósito 	vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY);
541b8776fc9SJosé Expósito 	err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg2);
542b8776fc9SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
543b8776fc9SJosé Expósito 
544b8776fc9SJosé Expósito 	err = vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg1);
545b8776fc9SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
546b8776fc9SJosé Expósito 
547b8776fc9SJosé Expósito 	err = vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg2);
548b8776fc9SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
549b8776fc9SJosé Expósito 
550b8776fc9SJosé Expósito 	KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config));
551b8776fc9SJosé Expósito 
552b8776fc9SJosé Expósito 	/* Invalid: Second CRTC without encoders */
553b8776fc9SJosé Expósito 	vkms_config_encoder_detach_crtc(encoder_cfg, crtc_cfg2);
554b8776fc9SJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
555b8776fc9SJosé Expósito 
556b8776fc9SJosé Expósito 	/* Valid: First CRTC with 2 possible encoder */
557b8776fc9SJosé Expósito 	vkms_config_destroy_plane(plane_cfg);
558b8776fc9SJosé Expósito 	vkms_config_destroy_crtc(config, crtc_cfg2);
559b8776fc9SJosé Expósito 	KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config));
560b8776fc9SJosé Expósito 
561b8776fc9SJosé Expósito 	vkms_config_destroy(config);
562b8776fc9SJosé Expósito }
563b8776fc9SJosé Expósito 
564da38c720SJosé Expósito static void vkms_config_test_invalid_connector_number(struct kunit *test)
565da38c720SJosé Expósito {
566da38c720SJosé Expósito 	struct vkms_config *config;
567da38c720SJosé Expósito 	struct vkms_config_connector *connector_cfg;
568da38c720SJosé Expósito 	int n;
569da38c720SJosé Expósito 
570da38c720SJosé Expósito 	config = vkms_config_default_create(false, false, false);
571da38c720SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
572da38c720SJosé Expósito 
573da38c720SJosé Expósito 	/* Invalid: No connectors */
574da38c720SJosé Expósito 	connector_cfg = get_first_connector(config);
575da38c720SJosé Expósito 	vkms_config_destroy_connector(connector_cfg);
576da38c720SJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
577da38c720SJosé Expósito 
578da38c720SJosé Expósito 	/* Invalid: Too many connectors */
579da38c720SJosé Expósito 	for (n = 0; n <= 32; n++)
580da38c720SJosé Expósito 		connector_cfg = vkms_config_create_connector(config);
581da38c720SJosé Expósito 
582da38c720SJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
583da38c720SJosé Expósito 
584da38c720SJosé Expósito 	vkms_config_destroy(config);
585da38c720SJosé Expósito }
586da38c720SJosé Expósito 
587*2c7aafc0SJosé Expósito static void vkms_config_test_valid_connector_possible_encoders(struct kunit *test)
588*2c7aafc0SJosé Expósito {
589*2c7aafc0SJosé Expósito 	struct vkms_config *config;
590*2c7aafc0SJosé Expósito 	struct vkms_config_encoder *encoder_cfg;
591*2c7aafc0SJosé Expósito 	struct vkms_config_connector *connector_cfg;
592*2c7aafc0SJosé Expósito 
593*2c7aafc0SJosé Expósito 	config = vkms_config_default_create(false, false, false);
594*2c7aafc0SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
595*2c7aafc0SJosé Expósito 
596*2c7aafc0SJosé Expósito 	encoder_cfg = get_first_encoder(config);
597*2c7aafc0SJosé Expósito 	connector_cfg = get_first_connector(config);
598*2c7aafc0SJosé Expósito 
599*2c7aafc0SJosé Expósito 	/* Invalid: Connector without a possible encoder */
600*2c7aafc0SJosé Expósito 	vkms_config_connector_detach_encoder(connector_cfg, encoder_cfg);
601*2c7aafc0SJosé Expósito 	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
602*2c7aafc0SJosé Expósito 
603*2c7aafc0SJosé Expósito 	vkms_config_destroy(config);
604*2c7aafc0SJosé Expósito }
605*2c7aafc0SJosé Expósito 
606c204bf65SJosé Expósito static void vkms_config_test_attach_different_configs(struct kunit *test)
607c204bf65SJosé Expósito {
608c204bf65SJosé Expósito 	struct vkms_config *config1, *config2;
609c204bf65SJosé Expósito 	struct vkms_config_plane *plane_cfg1, *plane_cfg2;
610c204bf65SJosé Expósito 	struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2;
611b8776fc9SJosé Expósito 	struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2;
612*2c7aafc0SJosé Expósito 	struct vkms_config_connector *connector_cfg1, *connector_cfg2;
613c204bf65SJosé Expósito 	int err;
614c204bf65SJosé Expósito 
615c204bf65SJosé Expósito 	config1 = vkms_config_create("test1");
616c204bf65SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config1);
617c204bf65SJosé Expósito 
618c204bf65SJosé Expósito 	config2 = vkms_config_create("test2");
619c204bf65SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config2);
620c204bf65SJosé Expósito 
621c204bf65SJosé Expósito 	plane_cfg1 = vkms_config_create_plane(config1);
622c204bf65SJosé Expósito 	crtc_cfg1 = vkms_config_create_crtc(config1);
623b8776fc9SJosé Expósito 	encoder_cfg1 = vkms_config_create_encoder(config1);
624*2c7aafc0SJosé Expósito 	connector_cfg1 = vkms_config_create_connector(config1);
625c204bf65SJosé Expósito 
626c204bf65SJosé Expósito 	plane_cfg2 = vkms_config_create_plane(config2);
627c204bf65SJosé Expósito 	crtc_cfg2 = vkms_config_create_crtc(config2);
628b8776fc9SJosé Expósito 	encoder_cfg2 = vkms_config_create_encoder(config2);
629*2c7aafc0SJosé Expósito 	connector_cfg2 = vkms_config_create_connector(config2);
630c204bf65SJosé Expósito 
631c204bf65SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg1);
632c204bf65SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg2);
633c204bf65SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg1);
634c204bf65SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg2);
635b8776fc9SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg1);
636b8776fc9SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg2);
637*2c7aafc0SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg1);
638*2c7aafc0SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg2);
639c204bf65SJosé Expósito 
640c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(plane_cfg1, crtc_cfg2);
641c204bf65SJosé Expósito 	KUNIT_EXPECT_NE(test, err, 0);
642c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(plane_cfg2, crtc_cfg1);
643c204bf65SJosé Expósito 	KUNIT_EXPECT_NE(test, err, 0);
644c204bf65SJosé Expósito 
645b8776fc9SJosé Expósito 	err = vkms_config_encoder_attach_crtc(encoder_cfg1, crtc_cfg2);
646b8776fc9SJosé Expósito 	KUNIT_EXPECT_NE(test, err, 0);
647b8776fc9SJosé Expósito 	err = vkms_config_encoder_attach_crtc(encoder_cfg2, crtc_cfg1);
648b8776fc9SJosé Expósito 	KUNIT_EXPECT_NE(test, err, 0);
649b8776fc9SJosé Expósito 
650*2c7aafc0SJosé Expósito 	err = vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg2);
651*2c7aafc0SJosé Expósito 	KUNIT_EXPECT_NE(test, err, 0);
652*2c7aafc0SJosé Expósito 	err = vkms_config_connector_attach_encoder(connector_cfg2, encoder_cfg1);
653*2c7aafc0SJosé Expósito 	KUNIT_EXPECT_NE(test, err, 0);
654*2c7aafc0SJosé Expósito 
655c204bf65SJosé Expósito 	vkms_config_destroy(config1);
656c204bf65SJosé Expósito 	vkms_config_destroy(config2);
657c204bf65SJosé Expósito }
658c204bf65SJosé Expósito 
659c204bf65SJosé Expósito static void vkms_config_test_plane_attach_crtc(struct kunit *test)
660c204bf65SJosé Expósito {
661c204bf65SJosé Expósito 	struct vkms_config *config;
662c204bf65SJosé Expósito 	struct vkms_config_plane *overlay_cfg;
663c204bf65SJosé Expósito 	struct vkms_config_plane *primary_cfg;
664c204bf65SJosé Expósito 	struct vkms_config_plane *cursor_cfg;
665c204bf65SJosé Expósito 	struct vkms_config_crtc *crtc_cfg;
666c204bf65SJosé Expósito 	int err;
667c204bf65SJosé Expósito 
668c204bf65SJosé Expósito 	config = vkms_config_create("test");
669c204bf65SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
670c204bf65SJosé Expósito 
671c204bf65SJosé Expósito 	overlay_cfg = vkms_config_create_plane(config);
672c204bf65SJosé Expósito 	vkms_config_plane_set_type(overlay_cfg, DRM_PLANE_TYPE_OVERLAY);
673c204bf65SJosé Expósito 	primary_cfg = vkms_config_create_plane(config);
674c204bf65SJosé Expósito 	vkms_config_plane_set_type(primary_cfg, DRM_PLANE_TYPE_PRIMARY);
675c204bf65SJosé Expósito 	cursor_cfg = vkms_config_create_plane(config);
676c204bf65SJosé Expósito 	vkms_config_plane_set_type(cursor_cfg, DRM_PLANE_TYPE_CURSOR);
677c204bf65SJosé Expósito 
678c204bf65SJosé Expósito 	crtc_cfg = vkms_config_create_crtc(config);
679c204bf65SJosé Expósito 
680c204bf65SJosé Expósito 	/* No primary or cursor planes */
681c204bf65SJosé Expósito 	KUNIT_EXPECT_NULL(test, vkms_config_crtc_primary_plane(config, crtc_cfg));
682c204bf65SJosé Expósito 	KUNIT_EXPECT_NULL(test, vkms_config_crtc_cursor_plane(config, crtc_cfg));
683c204bf65SJosé Expósito 
684c204bf65SJosé Expósito 	/* Overlay plane, but no primary or cursor planes */
685c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(overlay_cfg, crtc_cfg);
686c204bf65SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
687c204bf65SJosé Expósito 	KUNIT_EXPECT_NULL(test, vkms_config_crtc_primary_plane(config, crtc_cfg));
688c204bf65SJosé Expósito 	KUNIT_EXPECT_NULL(test, vkms_config_crtc_cursor_plane(config, crtc_cfg));
689c204bf65SJosé Expósito 
690c204bf65SJosé Expósito 	/* Primary plane, attaching it twice must fail */
691c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(primary_cfg, crtc_cfg);
692c204bf65SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
693c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(primary_cfg, crtc_cfg);
694c204bf65SJosé Expósito 	KUNIT_EXPECT_NE(test, err, 0);
695c204bf65SJosé Expósito 	KUNIT_EXPECT_PTR_EQ(test,
696c204bf65SJosé Expósito 			    vkms_config_crtc_primary_plane(config, crtc_cfg),
697c204bf65SJosé Expósito 			    primary_cfg);
698c204bf65SJosé Expósito 	KUNIT_EXPECT_NULL(test, vkms_config_crtc_cursor_plane(config, crtc_cfg));
699c204bf65SJosé Expósito 
700c204bf65SJosé Expósito 	/* Primary and cursor planes */
701c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(cursor_cfg, crtc_cfg);
702c204bf65SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
703c204bf65SJosé Expósito 	KUNIT_EXPECT_PTR_EQ(test,
704c204bf65SJosé Expósito 			    vkms_config_crtc_primary_plane(config, crtc_cfg),
705c204bf65SJosé Expósito 			    primary_cfg);
706c204bf65SJosé Expósito 	KUNIT_EXPECT_PTR_EQ(test,
707c204bf65SJosé Expósito 			    vkms_config_crtc_cursor_plane(config, crtc_cfg),
708c204bf65SJosé Expósito 			    cursor_cfg);
709c204bf65SJosé Expósito 
710c204bf65SJosé Expósito 	/* Detach primary and destroy cursor plane */
711c204bf65SJosé Expósito 	vkms_config_plane_detach_crtc(overlay_cfg, crtc_cfg);
712c204bf65SJosé Expósito 	vkms_config_plane_detach_crtc(primary_cfg, crtc_cfg);
713c204bf65SJosé Expósito 	vkms_config_destroy_plane(cursor_cfg);
714c204bf65SJosé Expósito 	KUNIT_EXPECT_NULL(test, vkms_config_crtc_primary_plane(config, crtc_cfg));
715c204bf65SJosé Expósito 	KUNIT_EXPECT_NULL(test, vkms_config_crtc_cursor_plane(config, crtc_cfg));
716c204bf65SJosé Expósito 
717c204bf65SJosé Expósito 	vkms_config_destroy(config);
718c204bf65SJosé Expósito }
719c204bf65SJosé Expósito 
720c204bf65SJosé Expósito static void vkms_config_test_plane_get_possible_crtcs(struct kunit *test)
721c204bf65SJosé Expósito {
722c204bf65SJosé Expósito 	struct vkms_config *config;
723c204bf65SJosé Expósito 	struct vkms_config_plane *plane_cfg1, *plane_cfg2;
724c204bf65SJosé Expósito 	struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2;
725c204bf65SJosé Expósito 	struct vkms_config_crtc *possible_crtc;
726c204bf65SJosé Expósito 	unsigned long idx = 0;
727c204bf65SJosé Expósito 	int n_crtcs = 0;
728c204bf65SJosé Expósito 	int err;
729c204bf65SJosé Expósito 
730c204bf65SJosé Expósito 	config = vkms_config_create("test");
731c204bf65SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
732c204bf65SJosé Expósito 
733c204bf65SJosé Expósito 	plane_cfg1 = vkms_config_create_plane(config);
734c204bf65SJosé Expósito 	plane_cfg2 = vkms_config_create_plane(config);
735c204bf65SJosé Expósito 	crtc_cfg1 = vkms_config_create_crtc(config);
736c204bf65SJosé Expósito 	crtc_cfg2 = vkms_config_create_crtc(config);
737c204bf65SJosé Expósito 
738c204bf65SJosé Expósito 	/* No possible CRTCs */
739c204bf65SJosé Expósito 	vkms_config_plane_for_each_possible_crtc(plane_cfg1, idx, possible_crtc)
740c204bf65SJosé Expósito 		KUNIT_FAIL(test, "Unexpected possible CRTC");
741c204bf65SJosé Expósito 
742c204bf65SJosé Expósito 	vkms_config_plane_for_each_possible_crtc(plane_cfg2, idx, possible_crtc)
743c204bf65SJosé Expósito 		KUNIT_FAIL(test, "Unexpected possible CRTC");
744c204bf65SJosé Expósito 
745c204bf65SJosé Expósito 	/* Plane 1 attached to CRTC 1 and 2 */
746c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(plane_cfg1, crtc_cfg1);
747c204bf65SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
748c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(plane_cfg1, crtc_cfg2);
749c204bf65SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
750c204bf65SJosé Expósito 
751c204bf65SJosé Expósito 	vkms_config_plane_for_each_possible_crtc(plane_cfg1, idx, possible_crtc) {
752c204bf65SJosé Expósito 		n_crtcs++;
753c204bf65SJosé Expósito 		if (possible_crtc != crtc_cfg1 && possible_crtc != crtc_cfg2)
754c204bf65SJosé Expósito 			KUNIT_FAIL(test, "Unexpected possible CRTC");
755c204bf65SJosé Expósito 	}
756c204bf65SJosé Expósito 	KUNIT_ASSERT_EQ(test, n_crtcs, 2);
757c204bf65SJosé Expósito 	n_crtcs = 0;
758c204bf65SJosé Expósito 
759c204bf65SJosé Expósito 	vkms_config_plane_for_each_possible_crtc(plane_cfg2, idx, possible_crtc)
760c204bf65SJosé Expósito 		KUNIT_FAIL(test, "Unexpected possible CRTC");
761c204bf65SJosé Expósito 
762c204bf65SJosé Expósito 	/* Plane 1 attached to CRTC 1 and plane 2 to CRTC 2 */
763c204bf65SJosé Expósito 	vkms_config_plane_detach_crtc(plane_cfg1, crtc_cfg2);
764c204bf65SJosé Expósito 	vkms_config_plane_for_each_possible_crtc(plane_cfg1, idx, possible_crtc) {
765c204bf65SJosé Expósito 		n_crtcs++;
766c204bf65SJosé Expósito 		if (possible_crtc != crtc_cfg1)
767c204bf65SJosé Expósito 			KUNIT_FAIL(test, "Unexpected possible CRTC");
768c204bf65SJosé Expósito 	}
769c204bf65SJosé Expósito 	KUNIT_ASSERT_EQ(test, n_crtcs, 1);
770c204bf65SJosé Expósito 	n_crtcs = 0;
771c204bf65SJosé Expósito 
772c204bf65SJosé Expósito 	err = vkms_config_plane_attach_crtc(plane_cfg2, crtc_cfg2);
773c204bf65SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
774c204bf65SJosé Expósito 	vkms_config_plane_for_each_possible_crtc(plane_cfg2, idx, possible_crtc) {
775c204bf65SJosé Expósito 		n_crtcs++;
776c204bf65SJosé Expósito 		if (possible_crtc != crtc_cfg2)
777c204bf65SJosé Expósito 			KUNIT_FAIL(test, "Unexpected possible CRTC");
778c204bf65SJosé Expósito 	}
779c204bf65SJosé Expósito 	KUNIT_ASSERT_EQ(test, n_crtcs, 1);
780c204bf65SJosé Expósito 
781c204bf65SJosé Expósito 	vkms_config_destroy(config);
782c204bf65SJosé Expósito }
783c204bf65SJosé Expósito 
784b8776fc9SJosé Expósito static void vkms_config_test_encoder_get_possible_crtcs(struct kunit *test)
785b8776fc9SJosé Expósito {
786b8776fc9SJosé Expósito 	struct vkms_config *config;
787b8776fc9SJosé Expósito 	struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2;
788b8776fc9SJosé Expósito 	struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2;
789b8776fc9SJosé Expósito 	struct vkms_config_crtc *possible_crtc;
790b8776fc9SJosé Expósito 	unsigned long idx = 0;
791b8776fc9SJosé Expósito 	int n_crtcs = 0;
792b8776fc9SJosé Expósito 	int err;
793b8776fc9SJosé Expósito 
794b8776fc9SJosé Expósito 	config = vkms_config_create("test");
795b8776fc9SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
796b8776fc9SJosé Expósito 
797b8776fc9SJosé Expósito 	encoder_cfg1 = vkms_config_create_encoder(config);
798b8776fc9SJosé Expósito 	encoder_cfg2 = vkms_config_create_encoder(config);
799b8776fc9SJosé Expósito 	crtc_cfg1 = vkms_config_create_crtc(config);
800b8776fc9SJosé Expósito 	crtc_cfg2 = vkms_config_create_crtc(config);
801b8776fc9SJosé Expósito 
802b8776fc9SJosé Expósito 	/* No possible CRTCs */
803b8776fc9SJosé Expósito 	vkms_config_encoder_for_each_possible_crtc(encoder_cfg1, idx, possible_crtc)
804b8776fc9SJosé Expósito 		KUNIT_FAIL(test, "Unexpected possible CRTC");
805b8776fc9SJosé Expósito 
806b8776fc9SJosé Expósito 	vkms_config_encoder_for_each_possible_crtc(encoder_cfg2, idx, possible_crtc)
807b8776fc9SJosé Expósito 		KUNIT_FAIL(test, "Unexpected possible CRTC");
808b8776fc9SJosé Expósito 
809b8776fc9SJosé Expósito 	/* Encoder 1 attached to CRTC 1 and 2 */
810b8776fc9SJosé Expósito 	err = vkms_config_encoder_attach_crtc(encoder_cfg1, crtc_cfg1);
811b8776fc9SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
812b8776fc9SJosé Expósito 	err = vkms_config_encoder_attach_crtc(encoder_cfg1, crtc_cfg2);
813b8776fc9SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
814b8776fc9SJosé Expósito 
815b8776fc9SJosé Expósito 	vkms_config_encoder_for_each_possible_crtc(encoder_cfg1, idx, possible_crtc) {
816b8776fc9SJosé Expósito 		n_crtcs++;
817b8776fc9SJosé Expósito 		if (possible_crtc != crtc_cfg1 && possible_crtc != crtc_cfg2)
818b8776fc9SJosé Expósito 			KUNIT_FAIL(test, "Unexpected possible CRTC");
819b8776fc9SJosé Expósito 	}
820b8776fc9SJosé Expósito 	KUNIT_ASSERT_EQ(test, n_crtcs, 2);
821b8776fc9SJosé Expósito 	n_crtcs = 0;
822b8776fc9SJosé Expósito 
823b8776fc9SJosé Expósito 	vkms_config_encoder_for_each_possible_crtc(encoder_cfg2, idx, possible_crtc)
824b8776fc9SJosé Expósito 		KUNIT_FAIL(test, "Unexpected possible CRTC");
825b8776fc9SJosé Expósito 
826b8776fc9SJosé Expósito 	/* Encoder 1 attached to CRTC 1 and encoder 2 to CRTC 2 */
827b8776fc9SJosé Expósito 	vkms_config_encoder_detach_crtc(encoder_cfg1, crtc_cfg2);
828b8776fc9SJosé Expósito 	vkms_config_encoder_for_each_possible_crtc(encoder_cfg1, idx, possible_crtc) {
829b8776fc9SJosé Expósito 		n_crtcs++;
830b8776fc9SJosé Expósito 		if (possible_crtc != crtc_cfg1)
831b8776fc9SJosé Expósito 			KUNIT_FAIL(test, "Unexpected possible CRTC");
832b8776fc9SJosé Expósito 	}
833b8776fc9SJosé Expósito 	KUNIT_ASSERT_EQ(test, n_crtcs, 1);
834b8776fc9SJosé Expósito 	n_crtcs = 0;
835b8776fc9SJosé Expósito 
836b8776fc9SJosé Expósito 	err = vkms_config_encoder_attach_crtc(encoder_cfg2, crtc_cfg2);
837b8776fc9SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
838b8776fc9SJosé Expósito 	vkms_config_encoder_for_each_possible_crtc(encoder_cfg2, idx, possible_crtc) {
839b8776fc9SJosé Expósito 		n_crtcs++;
840b8776fc9SJosé Expósito 		if (possible_crtc != crtc_cfg2)
841b8776fc9SJosé Expósito 			KUNIT_FAIL(test, "Unexpected possible CRTC");
842b8776fc9SJosé Expósito 	}
843b8776fc9SJosé Expósito 	KUNIT_ASSERT_EQ(test, n_crtcs, 1);
844b8776fc9SJosé Expósito 
845b8776fc9SJosé Expósito 	vkms_config_destroy(config);
846b8776fc9SJosé Expósito }
847b8776fc9SJosé Expósito 
848*2c7aafc0SJosé Expósito static void vkms_config_test_connector_get_possible_encoders(struct kunit *test)
849*2c7aafc0SJosé Expósito {
850*2c7aafc0SJosé Expósito 	struct vkms_config *config;
851*2c7aafc0SJosé Expósito 	struct vkms_config_connector *connector_cfg1, *connector_cfg2;
852*2c7aafc0SJosé Expósito 	struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2;
853*2c7aafc0SJosé Expósito 	struct vkms_config_encoder *possible_encoder;
854*2c7aafc0SJosé Expósito 	unsigned long idx = 0;
855*2c7aafc0SJosé Expósito 	int n_encoders = 0;
856*2c7aafc0SJosé Expósito 	int err;
857*2c7aafc0SJosé Expósito 
858*2c7aafc0SJosé Expósito 	config = vkms_config_create("test");
859*2c7aafc0SJosé Expósito 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
860*2c7aafc0SJosé Expósito 
861*2c7aafc0SJosé Expósito 	connector_cfg1 = vkms_config_create_connector(config);
862*2c7aafc0SJosé Expósito 	connector_cfg2 = vkms_config_create_connector(config);
863*2c7aafc0SJosé Expósito 	encoder_cfg1 = vkms_config_create_encoder(config);
864*2c7aafc0SJosé Expósito 	encoder_cfg2 = vkms_config_create_encoder(config);
865*2c7aafc0SJosé Expósito 
866*2c7aafc0SJosé Expósito 	/* No possible encoders */
867*2c7aafc0SJosé Expósito 	vkms_config_connector_for_each_possible_encoder(connector_cfg1, idx,
868*2c7aafc0SJosé Expósito 							possible_encoder)
869*2c7aafc0SJosé Expósito 		KUNIT_FAIL(test, "Unexpected possible encoder");
870*2c7aafc0SJosé Expósito 
871*2c7aafc0SJosé Expósito 	vkms_config_connector_for_each_possible_encoder(connector_cfg2, idx,
872*2c7aafc0SJosé Expósito 							possible_encoder)
873*2c7aafc0SJosé Expósito 		KUNIT_FAIL(test, "Unexpected possible encoder");
874*2c7aafc0SJosé Expósito 
875*2c7aafc0SJosé Expósito 	/* Connector 1 attached to encoders 1 and 2 */
876*2c7aafc0SJosé Expósito 	err = vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg1);
877*2c7aafc0SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
878*2c7aafc0SJosé Expósito 	err = vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg2);
879*2c7aafc0SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
880*2c7aafc0SJosé Expósito 
881*2c7aafc0SJosé Expósito 	vkms_config_connector_for_each_possible_encoder(connector_cfg1, idx,
882*2c7aafc0SJosé Expósito 							possible_encoder) {
883*2c7aafc0SJosé Expósito 		n_encoders++;
884*2c7aafc0SJosé Expósito 		if (possible_encoder != encoder_cfg1 &&
885*2c7aafc0SJosé Expósito 		    possible_encoder != encoder_cfg2)
886*2c7aafc0SJosé Expósito 			KUNIT_FAIL(test, "Unexpected possible encoder");
887*2c7aafc0SJosé Expósito 	}
888*2c7aafc0SJosé Expósito 	KUNIT_ASSERT_EQ(test, n_encoders, 2);
889*2c7aafc0SJosé Expósito 	n_encoders = 0;
890*2c7aafc0SJosé Expósito 
891*2c7aafc0SJosé Expósito 	vkms_config_connector_for_each_possible_encoder(connector_cfg2, idx,
892*2c7aafc0SJosé Expósito 							possible_encoder)
893*2c7aafc0SJosé Expósito 		KUNIT_FAIL(test, "Unexpected possible encoder");
894*2c7aafc0SJosé Expósito 
895*2c7aafc0SJosé Expósito 	/* Connector 1 attached to encoder 1 and connector 2 to encoder 2 */
896*2c7aafc0SJosé Expósito 	vkms_config_connector_detach_encoder(connector_cfg1, encoder_cfg2);
897*2c7aafc0SJosé Expósito 	vkms_config_connector_for_each_possible_encoder(connector_cfg1, idx,
898*2c7aafc0SJosé Expósito 							possible_encoder) {
899*2c7aafc0SJosé Expósito 		n_encoders++;
900*2c7aafc0SJosé Expósito 		if (possible_encoder != encoder_cfg1)
901*2c7aafc0SJosé Expósito 			KUNIT_FAIL(test, "Unexpected possible encoder");
902*2c7aafc0SJosé Expósito 	}
903*2c7aafc0SJosé Expósito 	KUNIT_ASSERT_EQ(test, n_encoders, 1);
904*2c7aafc0SJosé Expósito 	n_encoders = 0;
905*2c7aafc0SJosé Expósito 
906*2c7aafc0SJosé Expósito 	err = vkms_config_connector_attach_encoder(connector_cfg2, encoder_cfg2);
907*2c7aafc0SJosé Expósito 	KUNIT_EXPECT_EQ(test, err, 0);
908*2c7aafc0SJosé Expósito 	vkms_config_connector_for_each_possible_encoder(connector_cfg2, idx,
909*2c7aafc0SJosé Expósito 							possible_encoder) {
910*2c7aafc0SJosé Expósito 		n_encoders++;
911*2c7aafc0SJosé Expósito 		if (possible_encoder != encoder_cfg2)
912*2c7aafc0SJosé Expósito 			KUNIT_FAIL(test, "Unexpected possible encoder");
913*2c7aafc0SJosé Expósito 	}
914*2c7aafc0SJosé Expósito 	KUNIT_ASSERT_EQ(test, n_encoders, 1);
915*2c7aafc0SJosé Expósito 
916*2c7aafc0SJosé Expósito 	vkms_config_destroy(config);
917*2c7aafc0SJosé Expósito }
918*2c7aafc0SJosé Expósito 
9195b5a56d9SJosé Expósito static struct kunit_case vkms_config_test_cases[] = {
920d3ae1e39SJosé Expósito 	KUNIT_CASE(vkms_config_test_empty_config),
9218b059b0cSJosé Expósito 	KUNIT_CASE_PARAM(vkms_config_test_default_config,
9228b059b0cSJosé Expósito 			 default_config_gen_params),
923bc5b0d5dSJosé Expósito 	KUNIT_CASE(vkms_config_test_get_planes),
924600df32dSJosé Expósito 	KUNIT_CASE(vkms_config_test_get_crtcs),
925f60a183dSJosé Expósito 	KUNIT_CASE(vkms_config_test_get_encoders),
926da38c720SJosé Expósito 	KUNIT_CASE(vkms_config_test_get_connectors),
927bc5b0d5dSJosé Expósito 	KUNIT_CASE(vkms_config_test_invalid_plane_number),
928bc5b0d5dSJosé Expósito 	KUNIT_CASE(vkms_config_test_valid_plane_type),
929c204bf65SJosé Expósito 	KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs),
930600df32dSJosé Expósito 	KUNIT_CASE(vkms_config_test_invalid_crtc_number),
931f60a183dSJosé Expósito 	KUNIT_CASE(vkms_config_test_invalid_encoder_number),
932b8776fc9SJosé Expósito 	KUNIT_CASE(vkms_config_test_valid_encoder_possible_crtcs),
933da38c720SJosé Expósito 	KUNIT_CASE(vkms_config_test_invalid_connector_number),
934*2c7aafc0SJosé Expósito 	KUNIT_CASE(vkms_config_test_valid_connector_possible_encoders),
935c204bf65SJosé Expósito 	KUNIT_CASE(vkms_config_test_attach_different_configs),
936c204bf65SJosé Expósito 	KUNIT_CASE(vkms_config_test_plane_attach_crtc),
937c204bf65SJosé Expósito 	KUNIT_CASE(vkms_config_test_plane_get_possible_crtcs),
938b8776fc9SJosé Expósito 	KUNIT_CASE(vkms_config_test_encoder_get_possible_crtcs),
939*2c7aafc0SJosé Expósito 	KUNIT_CASE(vkms_config_test_connector_get_possible_encoders),
9405b5a56d9SJosé Expósito 	{}
9415b5a56d9SJosé Expósito };
9425b5a56d9SJosé Expósito 
9435b5a56d9SJosé Expósito static struct kunit_suite vkms_config_test_suite = {
9445b5a56d9SJosé Expósito 	.name = "vkms-config",
9455b5a56d9SJosé Expósito 	.test_cases = vkms_config_test_cases,
9465b5a56d9SJosé Expósito };
9475b5a56d9SJosé Expósito 
9485b5a56d9SJosé Expósito kunit_test_suite(vkms_config_test_suite);
9495b5a56d9SJosé Expósito 
9505b5a56d9SJosé Expósito MODULE_LICENSE("GPL");
9515b5a56d9SJosé Expósito MODULE_DESCRIPTION("Kunit test for vkms config utility");
952