1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (c) 2019 Bootlin
4 * Copyright (c) 2022 Ma��ra Canal <mairacanal@riseup.net>
5 */
6
7#include <kunit/test.h>
8
9#include <drm/drm_connector.h>
10#include <drm/drm_modes.h>
11
12static const struct drm_connector no_connector = {};
13
14static void drm_test_cmdline_force_e_only(struct kunit *test)
15{
16	struct drm_cmdline_mode mode = { };
17	const char *cmdline = "e";
18
19	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
20									  &no_connector, &mode));
21	KUNIT_EXPECT_FALSE(test, mode.specified);
22	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
23	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
24
25	KUNIT_EXPECT_FALSE(test, mode.rb);
26	KUNIT_EXPECT_FALSE(test, mode.cvt);
27	KUNIT_EXPECT_FALSE(test, mode.interlace);
28	KUNIT_EXPECT_FALSE(test, mode.margins);
29	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
30}
31
32static void drm_test_cmdline_force_D_only_not_digital(struct kunit *test)
33{
34	struct drm_cmdline_mode mode = { };
35	const char *cmdline = "D";
36
37	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
38									  &no_connector, &mode));
39	KUNIT_EXPECT_FALSE(test, mode.specified);
40	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
41	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
42
43	KUNIT_EXPECT_FALSE(test, mode.rb);
44	KUNIT_EXPECT_FALSE(test, mode.cvt);
45	KUNIT_EXPECT_FALSE(test, mode.interlace);
46	KUNIT_EXPECT_FALSE(test, mode.margins);
47	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
48}
49
50static const struct drm_connector connector_hdmi = {
51	.connector_type	= DRM_MODE_CONNECTOR_HDMIB,
52};
53
54static void drm_test_cmdline_force_D_only_hdmi(struct kunit *test)
55{
56	struct drm_cmdline_mode mode = { };
57	const char *cmdline = "D";
58
59	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
60									  &connector_hdmi, &mode));
61	KUNIT_EXPECT_FALSE(test, mode.specified);
62	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
63	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
64
65	KUNIT_EXPECT_FALSE(test, mode.rb);
66	KUNIT_EXPECT_FALSE(test, mode.cvt);
67	KUNIT_EXPECT_FALSE(test, mode.interlace);
68	KUNIT_EXPECT_FALSE(test, mode.margins);
69	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON_DIGITAL);
70}
71
72static const struct drm_connector connector_dvi = {
73	.connector_type	= DRM_MODE_CONNECTOR_DVII,
74};
75
76static void drm_test_cmdline_force_D_only_dvi(struct kunit *test)
77{
78	struct drm_cmdline_mode mode = { };
79	const char *cmdline = "D";
80
81	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
82									  &connector_dvi, &mode));
83	KUNIT_EXPECT_FALSE(test, mode.specified);
84	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
85	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
86
87	KUNIT_EXPECT_FALSE(test, mode.rb);
88	KUNIT_EXPECT_FALSE(test, mode.cvt);
89	KUNIT_EXPECT_FALSE(test, mode.interlace);
90	KUNIT_EXPECT_FALSE(test, mode.margins);
91	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON_DIGITAL);
92}
93
94static void drm_test_cmdline_force_d_only(struct kunit *test)
95{
96	struct drm_cmdline_mode mode = { };
97	const char *cmdline = "d";
98
99	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
100									  &no_connector, &mode));
101	KUNIT_EXPECT_FALSE(test, mode.specified);
102	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
103	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
104
105	KUNIT_EXPECT_FALSE(test, mode.rb);
106	KUNIT_EXPECT_FALSE(test, mode.cvt);
107	KUNIT_EXPECT_FALSE(test, mode.interlace);
108	KUNIT_EXPECT_FALSE(test, mode.margins);
109	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_OFF);
110}
111
112static void drm_test_cmdline_res(struct kunit *test)
113{
114	struct drm_cmdline_mode mode = { };
115	const char *cmdline = "720x480";
116
117	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
118									  &no_connector, &mode));
119	KUNIT_EXPECT_TRUE(test, mode.specified);
120	KUNIT_EXPECT_EQ(test, mode.xres, 720);
121	KUNIT_EXPECT_EQ(test, mode.yres, 480);
122
123	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
124
125	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
126
127	KUNIT_EXPECT_FALSE(test, mode.rb);
128	KUNIT_EXPECT_FALSE(test, mode.cvt);
129	KUNIT_EXPECT_FALSE(test, mode.interlace);
130	KUNIT_EXPECT_FALSE(test, mode.margins);
131	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
132}
133
134static void drm_test_cmdline_res_vesa(struct kunit *test)
135{
136	struct drm_cmdline_mode mode = { };
137	const char *cmdline = "720x480M";
138
139	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
140									  &no_connector, &mode));
141	KUNIT_EXPECT_TRUE(test, mode.specified);
142	KUNIT_EXPECT_EQ(test, mode.xres, 720);
143	KUNIT_EXPECT_EQ(test, mode.yres, 480);
144
145	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
146
147	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
148
149	KUNIT_EXPECT_FALSE(test, mode.rb);
150	KUNIT_EXPECT_TRUE(test, mode.cvt);
151	KUNIT_EXPECT_FALSE(test, mode.interlace);
152	KUNIT_EXPECT_FALSE(test, mode.margins);
153	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
154}
155
156static void drm_test_cmdline_res_vesa_rblank(struct kunit *test)
157{
158	struct drm_cmdline_mode mode = { };
159	const char *cmdline = "720x480MR";
160
161	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
162									  &no_connector, &mode));
163	KUNIT_EXPECT_TRUE(test, mode.specified);
164	KUNIT_EXPECT_EQ(test, mode.xres, 720);
165	KUNIT_EXPECT_EQ(test, mode.yres, 480);
166
167	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
168
169	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
170
171	KUNIT_EXPECT_TRUE(test, mode.rb);
172	KUNIT_EXPECT_TRUE(test, mode.cvt);
173	KUNIT_EXPECT_FALSE(test, mode.interlace);
174	KUNIT_EXPECT_FALSE(test, mode.margins);
175	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
176}
177
178static void drm_test_cmdline_res_rblank(struct kunit *test)
179{
180	struct drm_cmdline_mode mode = { };
181	const char *cmdline = "720x480R";
182
183	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
184									  &no_connector, &mode));
185	KUNIT_EXPECT_TRUE(test, mode.specified);
186	KUNIT_EXPECT_EQ(test, mode.xres, 720);
187	KUNIT_EXPECT_EQ(test, mode.yres, 480);
188
189	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
190
191	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
192
193	KUNIT_EXPECT_TRUE(test, mode.rb);
194	KUNIT_EXPECT_FALSE(test, mode.cvt);
195	KUNIT_EXPECT_FALSE(test, mode.interlace);
196	KUNIT_EXPECT_FALSE(test, mode.margins);
197	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
198}
199
200static void drm_test_cmdline_res_bpp(struct kunit *test)
201{
202	struct drm_cmdline_mode mode = { };
203	const char *cmdline = "720x480-24";
204
205	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
206									  &no_connector, &mode));
207	KUNIT_EXPECT_TRUE(test, mode.specified);
208	KUNIT_EXPECT_EQ(test, mode.xres, 720);
209	KUNIT_EXPECT_EQ(test, mode.yres, 480);
210
211	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
212
213	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
214	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
215
216	KUNIT_EXPECT_FALSE(test, mode.rb);
217	KUNIT_EXPECT_FALSE(test, mode.cvt);
218	KUNIT_EXPECT_FALSE(test, mode.interlace);
219	KUNIT_EXPECT_FALSE(test, mode.margins);
220	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
221}
222
223static void drm_test_cmdline_res_refresh(struct kunit *test)
224{
225	struct drm_cmdline_mode mode = { };
226	const char *cmdline = "720x480@60";
227
228	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
229									  &no_connector, &mode));
230	KUNIT_EXPECT_TRUE(test, mode.specified);
231	KUNIT_EXPECT_EQ(test, mode.xres, 720);
232	KUNIT_EXPECT_EQ(test, mode.yres, 480);
233
234	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
235	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
236
237	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
238
239	KUNIT_EXPECT_FALSE(test, mode.rb);
240	KUNIT_EXPECT_FALSE(test, mode.cvt);
241	KUNIT_EXPECT_FALSE(test, mode.interlace);
242	KUNIT_EXPECT_FALSE(test, mode.margins);
243	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
244}
245
246static void drm_test_cmdline_res_bpp_refresh(struct kunit *test)
247{
248	struct drm_cmdline_mode mode = { };
249	const char *cmdline = "720x480-24@60";
250
251	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
252									  &no_connector, &mode));
253	KUNIT_EXPECT_TRUE(test, mode.specified);
254	KUNIT_EXPECT_EQ(test, mode.xres, 720);
255	KUNIT_EXPECT_EQ(test, mode.yres, 480);
256
257	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
258	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
259
260	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
261	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
262
263	KUNIT_EXPECT_FALSE(test, mode.rb);
264	KUNIT_EXPECT_FALSE(test, mode.cvt);
265	KUNIT_EXPECT_FALSE(test, mode.interlace);
266	KUNIT_EXPECT_FALSE(test, mode.margins);
267	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
268}
269
270static void drm_test_cmdline_res_bpp_refresh_interlaced(struct kunit *test)
271{
272	struct drm_cmdline_mode mode = { };
273	const char *cmdline = "720x480-24@60i";
274
275	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
276									  &no_connector, &mode));
277	KUNIT_EXPECT_TRUE(test, mode.specified);
278	KUNIT_EXPECT_EQ(test, mode.xres, 720);
279	KUNIT_EXPECT_EQ(test, mode.yres, 480);
280
281	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
282	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
283
284	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
285	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
286
287	KUNIT_EXPECT_FALSE(test, mode.rb);
288	KUNIT_EXPECT_FALSE(test, mode.cvt);
289	KUNIT_EXPECT_TRUE(test, mode.interlace);
290	KUNIT_EXPECT_FALSE(test, mode.margins);
291	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
292}
293
294static void drm_test_cmdline_res_bpp_refresh_margins(struct kunit *test)
295{
296	struct drm_cmdline_mode mode = { };
297	const char *cmdline = "720x480-24@60m";
298
299	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
300									  &no_connector, &mode));
301	KUNIT_EXPECT_TRUE(test, mode.specified);
302	KUNIT_EXPECT_EQ(test, mode.xres, 720);
303	KUNIT_EXPECT_EQ(test, mode.yres, 480);
304
305	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
306	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
307
308	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
309	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
310
311	KUNIT_EXPECT_FALSE(test, mode.rb);
312	KUNIT_EXPECT_FALSE(test, mode.cvt);
313	KUNIT_EXPECT_FALSE(test, mode.interlace);
314	KUNIT_EXPECT_TRUE(test, mode.margins);
315	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
316}
317
318static void drm_test_cmdline_res_bpp_refresh_force_off(struct kunit *test)
319{
320	struct drm_cmdline_mode mode = { };
321	const char *cmdline = "720x480-24@60d";
322
323	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
324									  &no_connector, &mode));
325	KUNIT_EXPECT_TRUE(test, mode.specified);
326	KUNIT_EXPECT_EQ(test, mode.xres, 720);
327	KUNIT_EXPECT_EQ(test, mode.yres, 480);
328
329	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
330	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
331
332	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
333	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
334
335	KUNIT_EXPECT_FALSE(test, mode.rb);
336	KUNIT_EXPECT_FALSE(test, mode.cvt);
337	KUNIT_EXPECT_FALSE(test, mode.interlace);
338	KUNIT_EXPECT_FALSE(test, mode.margins);
339	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_OFF);
340}
341
342static void drm_test_cmdline_res_bpp_refresh_force_on(struct kunit *test)
343{
344	struct drm_cmdline_mode mode = { };
345	const char *cmdline = "720x480-24@60e";
346
347	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
348									  &no_connector, &mode));
349	KUNIT_EXPECT_TRUE(test, mode.specified);
350	KUNIT_EXPECT_EQ(test, mode.xres, 720);
351	KUNIT_EXPECT_EQ(test, mode.yres, 480);
352
353	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
354	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
355
356	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
357	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
358
359	KUNIT_EXPECT_FALSE(test, mode.rb);
360	KUNIT_EXPECT_FALSE(test, mode.cvt);
361	KUNIT_EXPECT_FALSE(test, mode.interlace);
362	KUNIT_EXPECT_FALSE(test, mode.margins);
363	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
364}
365
366static void drm_test_cmdline_res_bpp_refresh_force_on_analog(struct kunit *test)
367{
368	struct drm_cmdline_mode mode = { };
369	const char *cmdline = "720x480-24@60D";
370
371	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
372									  &no_connector, &mode));
373	KUNIT_EXPECT_TRUE(test, mode.specified);
374	KUNIT_EXPECT_EQ(test, mode.xres, 720);
375	KUNIT_EXPECT_EQ(test, mode.yres, 480);
376
377	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
378	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
379
380	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
381	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
382
383	KUNIT_EXPECT_FALSE(test, mode.rb);
384	KUNIT_EXPECT_FALSE(test, mode.cvt);
385	KUNIT_EXPECT_FALSE(test, mode.interlace);
386	KUNIT_EXPECT_FALSE(test, mode.margins);
387	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
388}
389
390static void drm_test_cmdline_res_bpp_refresh_force_on_digital(struct kunit *test)
391{
392	struct drm_cmdline_mode mode = { };
393	static const struct drm_connector connector = {
394		.connector_type = DRM_MODE_CONNECTOR_DVII,
395	};
396	const char *cmdline = "720x480-24@60D";
397
398	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
399									  &connector, &mode));
400	KUNIT_EXPECT_TRUE(test, mode.specified);
401	KUNIT_EXPECT_EQ(test, mode.xres, 720);
402	KUNIT_EXPECT_EQ(test, mode.yres, 480);
403
404	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
405	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
406
407	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
408	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
409
410	KUNIT_EXPECT_FALSE(test, mode.rb);
411	KUNIT_EXPECT_FALSE(test, mode.cvt);
412	KUNIT_EXPECT_FALSE(test, mode.interlace);
413	KUNIT_EXPECT_FALSE(test, mode.margins);
414	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON_DIGITAL);
415}
416
417static void drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on(struct kunit *test)
418{
419	struct drm_cmdline_mode mode = { };
420	const char *cmdline = "720x480-24@60ime";
421
422	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
423									  &no_connector, &mode));
424	KUNIT_EXPECT_TRUE(test, mode.specified);
425	KUNIT_EXPECT_EQ(test, mode.xres, 720);
426	KUNIT_EXPECT_EQ(test, mode.yres, 480);
427
428	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
429	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
430
431	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
432	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
433
434	KUNIT_EXPECT_FALSE(test, mode.rb);
435	KUNIT_EXPECT_FALSE(test, mode.cvt);
436	KUNIT_EXPECT_TRUE(test, mode.interlace);
437	KUNIT_EXPECT_TRUE(test, mode.margins);
438	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
439}
440
441static void drm_test_cmdline_res_margins_force_on(struct kunit *test)
442{
443	struct drm_cmdline_mode mode = { };
444	const char *cmdline = "720x480me";
445
446	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
447									  &no_connector, &mode));
448	KUNIT_EXPECT_TRUE(test, mode.specified);
449	KUNIT_EXPECT_EQ(test, mode.xres, 720);
450	KUNIT_EXPECT_EQ(test, mode.yres, 480);
451
452	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
453
454	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
455
456	KUNIT_EXPECT_FALSE(test, mode.rb);
457	KUNIT_EXPECT_FALSE(test, mode.cvt);
458	KUNIT_EXPECT_FALSE(test, mode.interlace);
459	KUNIT_EXPECT_TRUE(test, mode.margins);
460	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
461}
462
463static void drm_test_cmdline_res_vesa_margins(struct kunit *test)
464{
465	struct drm_cmdline_mode mode = { };
466	const char *cmdline = "720x480Mm";
467
468	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
469									  &no_connector, &mode));
470	KUNIT_EXPECT_TRUE(test, mode.specified);
471	KUNIT_EXPECT_EQ(test, mode.xres, 720);
472	KUNIT_EXPECT_EQ(test, mode.yres, 480);
473
474	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
475
476	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
477
478	KUNIT_EXPECT_FALSE(test, mode.rb);
479	KUNIT_EXPECT_TRUE(test, mode.cvt);
480	KUNIT_EXPECT_FALSE(test, mode.interlace);
481	KUNIT_EXPECT_TRUE(test, mode.margins);
482	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
483}
484
485static void drm_test_cmdline_name(struct kunit *test)
486{
487	struct drm_cmdline_mode mode = { };
488	const char *cmdline = "NTSC";
489
490	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
491									  &no_connector, &mode));
492	KUNIT_EXPECT_STREQ(test, mode.name, "NTSC");
493	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
494	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
495}
496
497static void drm_test_cmdline_name_bpp(struct kunit *test)
498{
499	struct drm_cmdline_mode mode = { };
500	const char *cmdline = "NTSC-24";
501
502	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
503									  &no_connector, &mode));
504	KUNIT_EXPECT_STREQ(test, mode.name, "NTSC");
505
506	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
507
508	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
509	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
510}
511
512static void drm_test_cmdline_name_option(struct kunit *test)
513{
514	struct drm_cmdline_mode mode = { };
515	const char *cmdline = "NTSC,rotate=180";
516
517	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
518									  &no_connector, &mode));
519	KUNIT_EXPECT_TRUE(test, mode.specified);
520	KUNIT_EXPECT_STREQ(test, mode.name, "NTSC");
521	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
522}
523
524static void drm_test_cmdline_name_bpp_option(struct kunit *test)
525{
526	struct drm_cmdline_mode mode = { };
527	const char *cmdline = "NTSC-24,rotate=180";
528
529	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
530									  &no_connector, &mode));
531	KUNIT_EXPECT_TRUE(test, mode.specified);
532	KUNIT_EXPECT_STREQ(test, mode.name, "NTSC");
533	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
534	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
535	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
536}
537
538static void drm_test_cmdline_rotate_0(struct kunit *test)
539{
540	struct drm_cmdline_mode mode = { };
541	const char *cmdline = "720x480,rotate=0";
542
543	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
544									  &no_connector, &mode));
545	KUNIT_EXPECT_TRUE(test, mode.specified);
546	KUNIT_EXPECT_EQ(test, mode.xres, 720);
547	KUNIT_EXPECT_EQ(test, mode.yres, 480);
548	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_0);
549
550	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
551
552	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
553
554	KUNIT_EXPECT_FALSE(test, mode.rb);
555	KUNIT_EXPECT_FALSE(test, mode.cvt);
556	KUNIT_EXPECT_FALSE(test, mode.interlace);
557	KUNIT_EXPECT_FALSE(test, mode.margins);
558	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
559}
560
561static void drm_test_cmdline_rotate_90(struct kunit *test)
562{
563	struct drm_cmdline_mode mode = { };
564	const char *cmdline = "720x480,rotate=90";
565
566	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
567									  &no_connector, &mode));
568	KUNIT_EXPECT_TRUE(test, mode.specified);
569	KUNIT_EXPECT_EQ(test, mode.xres, 720);
570	KUNIT_EXPECT_EQ(test, mode.yres, 480);
571	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_90);
572
573	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
574
575	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
576
577	KUNIT_EXPECT_FALSE(test, mode.rb);
578	KUNIT_EXPECT_FALSE(test, mode.cvt);
579	KUNIT_EXPECT_FALSE(test, mode.interlace);
580	KUNIT_EXPECT_FALSE(test, mode.margins);
581	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
582}
583
584static void drm_test_cmdline_rotate_180(struct kunit *test)
585{
586	struct drm_cmdline_mode mode = { };
587	const char *cmdline = "720x480,rotate=180";
588
589	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
590									  &no_connector, &mode));
591	KUNIT_EXPECT_TRUE(test, mode.specified);
592	KUNIT_EXPECT_EQ(test, mode.xres, 720);
593	KUNIT_EXPECT_EQ(test, mode.yres, 480);
594	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
595
596	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
597
598	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
599
600	KUNIT_EXPECT_FALSE(test, mode.rb);
601	KUNIT_EXPECT_FALSE(test, mode.cvt);
602	KUNIT_EXPECT_FALSE(test, mode.interlace);
603	KUNIT_EXPECT_FALSE(test, mode.margins);
604	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
605}
606
607static void drm_test_cmdline_rotate_270(struct kunit *test)
608{
609	struct drm_cmdline_mode mode = { };
610	const char *cmdline = "720x480,rotate=270";
611
612	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
613									  &no_connector, &mode));
614	KUNIT_EXPECT_TRUE(test, mode.specified);
615	KUNIT_EXPECT_EQ(test, mode.xres, 720);
616	KUNIT_EXPECT_EQ(test, mode.yres, 480);
617	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_270);
618
619	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
620
621	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
622
623	KUNIT_EXPECT_FALSE(test, mode.rb);
624	KUNIT_EXPECT_FALSE(test, mode.cvt);
625	KUNIT_EXPECT_FALSE(test, mode.interlace);
626	KUNIT_EXPECT_FALSE(test, mode.margins);
627	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
628}
629
630static void drm_test_cmdline_hmirror(struct kunit *test)
631{
632	struct drm_cmdline_mode mode = { };
633	const char *cmdline = "720x480,reflect_x";
634
635	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
636									  &no_connector, &mode));
637	KUNIT_EXPECT_TRUE(test, mode.specified);
638	KUNIT_EXPECT_EQ(test, mode.xres, 720);
639	KUNIT_EXPECT_EQ(test, mode.yres, 480);
640	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_X));
641
642	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
643
644	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
645
646	KUNIT_EXPECT_FALSE(test, mode.rb);
647	KUNIT_EXPECT_FALSE(test, mode.cvt);
648	KUNIT_EXPECT_FALSE(test, mode.interlace);
649	KUNIT_EXPECT_FALSE(test, mode.margins);
650	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
651}
652
653static void drm_test_cmdline_vmirror(struct kunit *test)
654{
655	struct drm_cmdline_mode mode = { };
656	const char *cmdline = "720x480,reflect_y";
657
658	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
659									  &no_connector, &mode));
660	KUNIT_EXPECT_TRUE(test, mode.specified);
661	KUNIT_EXPECT_EQ(test, mode.xres, 720);
662	KUNIT_EXPECT_EQ(test, mode.yres, 480);
663	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_Y));
664
665	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
666
667	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
668
669	KUNIT_EXPECT_FALSE(test, mode.rb);
670	KUNIT_EXPECT_FALSE(test, mode.cvt);
671	KUNIT_EXPECT_FALSE(test, mode.interlace);
672	KUNIT_EXPECT_FALSE(test, mode.margins);
673	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
674}
675
676static void drm_test_cmdline_margin_options(struct kunit *test)
677{
678	struct drm_cmdline_mode mode = { };
679	const char *cmdline =
680		"720x480,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42";
681
682	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
683									  &no_connector, &mode));
684	KUNIT_EXPECT_TRUE(test, mode.specified);
685	KUNIT_EXPECT_EQ(test, mode.xres, 720);
686	KUNIT_EXPECT_EQ(test, mode.yres, 480);
687	KUNIT_EXPECT_EQ(test, mode.tv_margins.right, 14);
688	KUNIT_EXPECT_EQ(test, mode.tv_margins.left, 24);
689	KUNIT_EXPECT_EQ(test, mode.tv_margins.bottom, 36);
690	KUNIT_EXPECT_EQ(test, mode.tv_margins.top, 42);
691
692	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
693
694	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
695
696	KUNIT_EXPECT_FALSE(test, mode.rb);
697	KUNIT_EXPECT_FALSE(test, mode.cvt);
698	KUNIT_EXPECT_FALSE(test, mode.interlace);
699	KUNIT_EXPECT_FALSE(test, mode.margins);
700	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
701}
702
703static void drm_test_cmdline_multiple_options(struct kunit *test)
704{
705	struct drm_cmdline_mode mode = { };
706	const char *cmdline = "720x480,rotate=270,reflect_x";
707
708	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
709									  &no_connector, &mode));
710	KUNIT_EXPECT_TRUE(test, mode.specified);
711	KUNIT_EXPECT_EQ(test, mode.xres, 720);
712	KUNIT_EXPECT_EQ(test, mode.yres, 480);
713	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, (DRM_MODE_ROTATE_270 | DRM_MODE_REFLECT_X));
714
715	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
716
717	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
718
719	KUNIT_EXPECT_FALSE(test, mode.rb);
720	KUNIT_EXPECT_FALSE(test, mode.cvt);
721	KUNIT_EXPECT_FALSE(test, mode.interlace);
722	KUNIT_EXPECT_FALSE(test, mode.margins);
723	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
724}
725
726static void drm_test_cmdline_bpp_extra_and_option(struct kunit *test)
727{
728	struct drm_cmdline_mode mode = { };
729	const char *cmdline = "720x480-24e,rotate=180";
730
731	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
732									  &no_connector, &mode));
733	KUNIT_EXPECT_TRUE(test, mode.specified);
734	KUNIT_EXPECT_EQ(test, mode.xres, 720);
735	KUNIT_EXPECT_EQ(test, mode.yres, 480);
736	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
737
738	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
739
740	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
741	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
742
743	KUNIT_EXPECT_FALSE(test, mode.rb);
744	KUNIT_EXPECT_FALSE(test, mode.cvt);
745	KUNIT_EXPECT_FALSE(test, mode.interlace);
746	KUNIT_EXPECT_FALSE(test, mode.margins);
747	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
748}
749
750static void drm_test_cmdline_extra_and_option(struct kunit *test)
751{
752	struct drm_cmdline_mode mode = { };
753	const char *cmdline = "720x480e,rotate=180";
754
755	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
756									  &no_connector, &mode));
757	KUNIT_EXPECT_TRUE(test, mode.specified);
758	KUNIT_EXPECT_EQ(test, mode.xres, 720);
759	KUNIT_EXPECT_EQ(test, mode.yres, 480);
760	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
761
762	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
763	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
764
765	KUNIT_EXPECT_FALSE(test, mode.rb);
766	KUNIT_EXPECT_FALSE(test, mode.cvt);
767	KUNIT_EXPECT_FALSE(test, mode.interlace);
768	KUNIT_EXPECT_FALSE(test, mode.margins);
769	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
770}
771
772static void drm_test_cmdline_freestanding_options(struct kunit *test)
773{
774	struct drm_cmdline_mode mode = { };
775	const char *cmdline = "margin_right=14,margin_left=24,margin_bottom=36,margin_top=42";
776
777	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
778									  &no_connector, &mode));
779	KUNIT_EXPECT_FALSE(test, mode.specified);
780	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
781	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
782
783	KUNIT_EXPECT_EQ(test, mode.tv_margins.right, 14);
784	KUNIT_EXPECT_EQ(test, mode.tv_margins.left, 24);
785	KUNIT_EXPECT_EQ(test, mode.tv_margins.bottom, 36);
786	KUNIT_EXPECT_EQ(test, mode.tv_margins.top, 42);
787
788	KUNIT_EXPECT_FALSE(test, mode.rb);
789	KUNIT_EXPECT_FALSE(test, mode.cvt);
790	KUNIT_EXPECT_FALSE(test, mode.interlace);
791	KUNIT_EXPECT_FALSE(test, mode.margins);
792	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
793}
794
795static void drm_test_cmdline_freestanding_force_e_and_options(struct kunit *test)
796{
797	struct drm_cmdline_mode mode = { };
798	const char *cmdline = "e,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42";
799
800	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
801									  &no_connector, &mode));
802	KUNIT_EXPECT_FALSE(test, mode.specified);
803	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
804	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
805
806	KUNIT_EXPECT_EQ(test, mode.tv_margins.right, 14);
807	KUNIT_EXPECT_EQ(test, mode.tv_margins.left, 24);
808	KUNIT_EXPECT_EQ(test, mode.tv_margins.bottom, 36);
809	KUNIT_EXPECT_EQ(test, mode.tv_margins.top, 42);
810
811	KUNIT_EXPECT_FALSE(test, mode.rb);
812	KUNIT_EXPECT_FALSE(test, mode.cvt);
813	KUNIT_EXPECT_FALSE(test, mode.interlace);
814	KUNIT_EXPECT_FALSE(test, mode.margins);
815	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
816}
817
818static void drm_test_cmdline_panel_orientation(struct kunit *test)
819{
820	struct drm_cmdline_mode mode = { };
821	const char *cmdline = "panel_orientation=upside_down";
822
823	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
824									  &no_connector, &mode));
825	KUNIT_EXPECT_FALSE(test, mode.specified);
826	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
827	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
828
829	KUNIT_EXPECT_EQ(test, mode.panel_orientation, DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP);
830
831	KUNIT_EXPECT_FALSE(test, mode.rb);
832	KUNIT_EXPECT_FALSE(test, mode.cvt);
833	KUNIT_EXPECT_FALSE(test, mode.interlace);
834	KUNIT_EXPECT_FALSE(test, mode.margins);
835	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
836}
837
838struct drm_cmdline_invalid_test {
839	const char *name;
840	const char *cmdline;
841};
842
843static void drm_test_cmdline_invalid(struct kunit *test)
844{
845	const struct drm_cmdline_invalid_test *params = test->param_value;
846	struct drm_cmdline_mode mode = { };
847
848	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(params->cmdline,
849									   &no_connector,
850									   &mode));
851}
852
853static const struct drm_cmdline_invalid_test drm_cmdline_invalid_tests[] = {
854	{
855		.name = "margin_only",
856		.cmdline = "m",
857	},
858	{
859		.name = "interlace_only",
860		.cmdline = "i",
861	},
862	{
863		.name = "res_missing_x",
864		.cmdline = "x480",
865	},
866	{
867		.name = "res_missing_y",
868		.cmdline = "1024x",
869	},
870	{
871		.name = "res_bad_y",
872		.cmdline = "1024xtest",
873	},
874	{
875		.name = "res_missing_y_bpp",
876		.cmdline = "1024x-24",
877	},
878	{
879		.name = "res_bad_bpp",
880		.cmdline = "720x480-test",
881	},
882	{
883		.name = "res_bad_refresh",
884		.cmdline = "720x480@refresh",
885	},
886	{
887		.name = "res_bpp_refresh_force_on_off",
888		.cmdline = "720x480-24@60de",
889	},
890	{
891		.name = "res_invalid_mode",
892		.cmdline = "720x480f",
893	},
894	{
895		.name = "res_bpp_wrong_place_mode",
896		.cmdline = "720x480e-24",
897	},
898	{
899		.name = "name_bpp_refresh",
900		.cmdline = "NTSC-24@60",
901	},
902	{
903		.name = "name_refresh",
904		.cmdline = "NTSC@60",
905	},
906	{
907		.name = "name_refresh_wrong_mode",
908		.cmdline = "NTSC@60m",
909	},
910	{
911		.name = "name_refresh_invalid_mode",
912		.cmdline = "NTSC@60f",
913	},
914	{
915		.name = "rotate_multiple",
916		.cmdline = "720x480,rotate=0,rotate=90",
917	},
918	{
919		.name = "rotate_invalid_val",
920		.cmdline = "720x480,rotate=42",
921	},
922	{
923		.name = "rotate_truncated",
924		.cmdline = "720x480,rotate=",
925	},
926	{
927		.name = "invalid_option",
928		.cmdline = "720x480,test=42",
929	},
930	{
931		.name = "invalid_tv_option",
932		.cmdline = "720x480i,tv_mode=invalid",
933	},
934	{
935		.name = "truncated_tv_option",
936		.cmdline = "720x480i,tv_mode=NTS",
937	},
938};
939
940static void drm_cmdline_invalid_desc(const struct drm_cmdline_invalid_test *t,
941				     char *desc)
942{
943	sprintf(desc, "%s", t->name);
944}
945
946KUNIT_ARRAY_PARAM(drm_cmdline_invalid, drm_cmdline_invalid_tests, drm_cmdline_invalid_desc);
947
948struct drm_cmdline_tv_option_test {
949	const char *name;
950	const char *cmdline;
951	struct drm_display_mode *(*mode_fn)(struct drm_device *dev);
952	enum drm_connector_tv_mode tv_mode;
953};
954
955static void drm_test_cmdline_tv_options(struct kunit *test)
956{
957	const struct drm_cmdline_tv_option_test *params = test->param_value;
958	const struct drm_display_mode *expected_mode = params->mode_fn(NULL);
959	struct drm_cmdline_mode mode = { };
960
961	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(params->cmdline,
962									  &no_connector, &mode));
963	KUNIT_EXPECT_TRUE(test, mode.specified);
964	KUNIT_EXPECT_EQ(test, mode.xres, expected_mode->hdisplay);
965	KUNIT_EXPECT_EQ(test, mode.yres, expected_mode->vdisplay);
966	KUNIT_EXPECT_EQ(test, mode.tv_mode, params->tv_mode);
967
968	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
969
970	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
971
972	KUNIT_EXPECT_FALSE(test, mode.rb);
973	KUNIT_EXPECT_FALSE(test, mode.cvt);
974	KUNIT_EXPECT_EQ(test, mode.interlace, !!(expected_mode->flags & DRM_MODE_FLAG_INTERLACE));
975	KUNIT_EXPECT_FALSE(test, mode.margins);
976	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
977}
978
979#define TV_OPT_TEST(_opt, _cmdline, _mode_fn)		\
980	{						\
981		.name = #_opt,				\
982		.cmdline = _cmdline,			\
983		.mode_fn = _mode_fn,			\
984		.tv_mode = DRM_MODE_TV_MODE_ ## _opt,	\
985	}
986
987static const struct drm_cmdline_tv_option_test drm_cmdline_tv_option_tests[] = {
988	TV_OPT_TEST(NTSC, "720x480i,tv_mode=NTSC", drm_mode_analog_ntsc_480i),
989	TV_OPT_TEST(NTSC_443, "720x480i,tv_mode=NTSC-443", drm_mode_analog_ntsc_480i),
990	TV_OPT_TEST(NTSC_J, "720x480i,tv_mode=NTSC-J", drm_mode_analog_ntsc_480i),
991	TV_OPT_TEST(PAL, "720x576i,tv_mode=PAL", drm_mode_analog_pal_576i),
992	TV_OPT_TEST(PAL_M, "720x480i,tv_mode=PAL-M", drm_mode_analog_ntsc_480i),
993	TV_OPT_TEST(PAL_N, "720x576i,tv_mode=PAL-N", drm_mode_analog_pal_576i),
994	TV_OPT_TEST(SECAM, "720x576i,tv_mode=SECAM", drm_mode_analog_pal_576i),
995};
996
997static void drm_cmdline_tv_option_desc(const struct drm_cmdline_tv_option_test *t,
998				       char *desc)
999{
1000	sprintf(desc, "%s", t->name);
1001}
1002
1003KUNIT_ARRAY_PARAM(drm_cmdline_tv_option,
1004		  drm_cmdline_tv_option_tests,
1005		  drm_cmdline_tv_option_desc);
1006
1007static struct kunit_case drm_cmdline_parser_tests[] = {
1008	KUNIT_CASE(drm_test_cmdline_force_d_only),
1009	KUNIT_CASE(drm_test_cmdline_force_D_only_dvi),
1010	KUNIT_CASE(drm_test_cmdline_force_D_only_hdmi),
1011	KUNIT_CASE(drm_test_cmdline_force_D_only_not_digital),
1012	KUNIT_CASE(drm_test_cmdline_force_e_only),
1013	KUNIT_CASE(drm_test_cmdline_res),
1014	KUNIT_CASE(drm_test_cmdline_res_vesa),
1015	KUNIT_CASE(drm_test_cmdline_res_vesa_rblank),
1016	KUNIT_CASE(drm_test_cmdline_res_rblank),
1017	KUNIT_CASE(drm_test_cmdline_res_bpp),
1018	KUNIT_CASE(drm_test_cmdline_res_refresh),
1019	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh),
1020	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh_interlaced),
1021	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh_margins),
1022	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh_force_off),
1023	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh_force_on),
1024	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh_force_on_analog),
1025	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh_force_on_digital),
1026	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on),
1027	KUNIT_CASE(drm_test_cmdline_res_margins_force_on),
1028	KUNIT_CASE(drm_test_cmdline_res_vesa_margins),
1029	KUNIT_CASE(drm_test_cmdline_name),
1030	KUNIT_CASE(drm_test_cmdline_name_bpp),
1031	KUNIT_CASE(drm_test_cmdline_name_option),
1032	KUNIT_CASE(drm_test_cmdline_name_bpp_option),
1033	KUNIT_CASE(drm_test_cmdline_rotate_0),
1034	KUNIT_CASE(drm_test_cmdline_rotate_90),
1035	KUNIT_CASE(drm_test_cmdline_rotate_180),
1036	KUNIT_CASE(drm_test_cmdline_rotate_270),
1037	KUNIT_CASE(drm_test_cmdline_hmirror),
1038	KUNIT_CASE(drm_test_cmdline_vmirror),
1039	KUNIT_CASE(drm_test_cmdline_margin_options),
1040	KUNIT_CASE(drm_test_cmdline_multiple_options),
1041	KUNIT_CASE(drm_test_cmdline_bpp_extra_and_option),
1042	KUNIT_CASE(drm_test_cmdline_extra_and_option),
1043	KUNIT_CASE(drm_test_cmdline_freestanding_options),
1044	KUNIT_CASE(drm_test_cmdline_freestanding_force_e_and_options),
1045	KUNIT_CASE(drm_test_cmdline_panel_orientation),
1046	KUNIT_CASE_PARAM(drm_test_cmdline_invalid, drm_cmdline_invalid_gen_params),
1047	KUNIT_CASE_PARAM(drm_test_cmdline_tv_options, drm_cmdline_tv_option_gen_params),
1048	{}
1049};
1050
1051static struct kunit_suite drm_cmdline_parser_test_suite = {
1052	.name = "drm_cmdline_parser",
1053	.test_cases = drm_cmdline_parser_tests
1054};
1055
1056kunit_test_suite(drm_cmdline_parser_test_suite);
1057
1058MODULE_AUTHOR("Maxime Ripard <maxime.ripard@bootlin.com>");
1059MODULE_LICENSE("GPL");
1060