xref: /linux/drivers/gpu/drm/tests/drm_cmdline_parser_test.c (revision 382fc1f681324bb38bedfe763107a60256c4ddc8)
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 
12 static const struct drm_connector no_connector = {};
13 
14 static void drm_cmdline_test_force_e_only(struct kunit *test)
15 {
16 	struct drm_cmdline_mode mode = { };
17 	const char *cmdline = "e";
18 
19 	KUNIT_EXPECT_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 
32 static void drm_cmdline_test_force_D_only_not_digital(struct kunit *test)
33 {
34 	struct drm_cmdline_mode mode = { };
35 	const char *cmdline = "D";
36 
37 	KUNIT_EXPECT_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 
50 static const struct drm_connector connector_hdmi = {
51 	.connector_type	= DRM_MODE_CONNECTOR_HDMIB,
52 };
53 
54 static void drm_cmdline_test_force_D_only_hdmi(struct kunit *test)
55 {
56 	struct drm_cmdline_mode mode = { };
57 	const char *cmdline = "D";
58 
59 	KUNIT_EXPECT_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 
72 static const struct drm_connector connector_dvi = {
73 	.connector_type	= DRM_MODE_CONNECTOR_DVII,
74 };
75 
76 static void drm_cmdline_test_force_D_only_dvi(struct kunit *test)
77 {
78 	struct drm_cmdline_mode mode = { };
79 	const char *cmdline = "D";
80 
81 	KUNIT_EXPECT_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 
94 static void drm_cmdline_test_force_d_only(struct kunit *test)
95 {
96 	struct drm_cmdline_mode mode = { };
97 	const char *cmdline = "d";
98 
99 	KUNIT_EXPECT_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 
112 static void drm_cmdline_test_margin_only(struct kunit *test)
113 {
114 	struct drm_cmdline_mode mode = { };
115 	const char *cmdline = "m";
116 
117 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
118 									   &no_connector, &mode));
119 }
120 
121 static void drm_cmdline_test_interlace_only(struct kunit *test)
122 {
123 	struct drm_cmdline_mode mode = { };
124 	const char *cmdline = "i";
125 
126 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
127 									   &no_connector, &mode));
128 }
129 
130 static void drm_cmdline_test_res(struct kunit *test)
131 {
132 	struct drm_cmdline_mode mode = { };
133 	const char *cmdline = "720x480";
134 
135 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
136 									  &no_connector, &mode));
137 	KUNIT_EXPECT_TRUE(test, mode.specified);
138 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
139 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
140 
141 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
142 
143 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
144 
145 	KUNIT_EXPECT_FALSE(test, mode.rb);
146 	KUNIT_EXPECT_FALSE(test, mode.cvt);
147 	KUNIT_EXPECT_FALSE(test, mode.interlace);
148 	KUNIT_EXPECT_FALSE(test, mode.margins);
149 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
150 }
151 
152 static void drm_cmdline_test_res_missing_x(struct kunit *test)
153 {
154 	struct drm_cmdline_mode mode = { };
155 	const char *cmdline = "x480";
156 
157 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
158 									   &no_connector, &mode));
159 }
160 
161 static void drm_cmdline_test_res_missing_y(struct kunit *test)
162 {
163 	struct drm_cmdline_mode mode = { };
164 	const char *cmdline = "1024x";
165 
166 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
167 									   &no_connector, &mode));
168 }
169 
170 static void drm_cmdline_test_res_bad_y(struct kunit *test)
171 {
172 	struct drm_cmdline_mode mode = { };
173 	const char *cmdline = "1024xtest";
174 
175 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
176 									   &no_connector, &mode));
177 }
178 
179 static void drm_cmdline_test_res_missing_y_bpp(struct kunit *test)
180 {
181 	struct drm_cmdline_mode mode = { };
182 	const char *cmdline = "1024x-24";
183 
184 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
185 									   &no_connector, &mode));
186 }
187 
188 static void drm_cmdline_test_res_vesa(struct kunit *test)
189 {
190 	struct drm_cmdline_mode mode = { };
191 	const char *cmdline = "720x480M";
192 
193 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
194 									  &no_connector, &mode));
195 	KUNIT_EXPECT_TRUE(test, mode.specified);
196 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
197 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
198 
199 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
200 
201 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
202 
203 	KUNIT_EXPECT_FALSE(test, mode.rb);
204 	KUNIT_EXPECT_TRUE(test, mode.cvt);
205 	KUNIT_EXPECT_FALSE(test, mode.interlace);
206 	KUNIT_EXPECT_FALSE(test, mode.margins);
207 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
208 }
209 
210 static void drm_cmdline_test_res_vesa_rblank(struct kunit *test)
211 {
212 	struct drm_cmdline_mode mode = { };
213 	const char *cmdline = "720x480MR";
214 
215 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
216 									  &no_connector, &mode));
217 	KUNIT_EXPECT_TRUE(test, mode.specified);
218 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
219 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
220 
221 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
222 
223 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
224 
225 	KUNIT_EXPECT_TRUE(test, mode.rb);
226 	KUNIT_EXPECT_TRUE(test, mode.cvt);
227 	KUNIT_EXPECT_FALSE(test, mode.interlace);
228 	KUNIT_EXPECT_FALSE(test, mode.margins);
229 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
230 }
231 
232 static void drm_cmdline_test_res_rblank(struct kunit *test)
233 {
234 	struct drm_cmdline_mode mode = { };
235 	const char *cmdline = "720x480R";
236 
237 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
238 									  &no_connector, &mode));
239 	KUNIT_EXPECT_TRUE(test, mode.specified);
240 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
241 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
242 
243 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
244 
245 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
246 
247 	KUNIT_EXPECT_TRUE(test, mode.rb);
248 	KUNIT_EXPECT_FALSE(test, mode.cvt);
249 	KUNIT_EXPECT_FALSE(test, mode.interlace);
250 	KUNIT_EXPECT_FALSE(test, mode.margins);
251 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
252 }
253 
254 static void drm_cmdline_test_res_bpp(struct kunit *test)
255 {
256 	struct drm_cmdline_mode mode = { };
257 	const char *cmdline = "720x480-24";
258 
259 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
260 									  &no_connector, &mode));
261 	KUNIT_EXPECT_TRUE(test, mode.specified);
262 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
263 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
264 
265 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
266 
267 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
268 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
269 
270 	KUNIT_EXPECT_FALSE(test, mode.rb);
271 	KUNIT_EXPECT_FALSE(test, mode.cvt);
272 	KUNIT_EXPECT_FALSE(test, mode.interlace);
273 	KUNIT_EXPECT_FALSE(test, mode.margins);
274 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
275 }
276 
277 static void drm_cmdline_test_res_bad_bpp(struct kunit *test)
278 {
279 	struct drm_cmdline_mode mode = { };
280 	const char *cmdline = "720x480-test";
281 
282 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
283 									   &no_connector, &mode));
284 }
285 
286 static void drm_cmdline_test_res_refresh(struct kunit *test)
287 {
288 	struct drm_cmdline_mode mode = { };
289 	const char *cmdline = "720x480@60";
290 
291 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
292 									  &no_connector, &mode));
293 	KUNIT_EXPECT_TRUE(test, mode.specified);
294 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
295 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
296 
297 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
298 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
299 
300 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
301 
302 	KUNIT_EXPECT_FALSE(test, mode.rb);
303 	KUNIT_EXPECT_FALSE(test, mode.cvt);
304 	KUNIT_EXPECT_FALSE(test, mode.interlace);
305 	KUNIT_EXPECT_FALSE(test, mode.margins);
306 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
307 }
308 
309 static void drm_cmdline_test_res_bad_refresh(struct kunit *test)
310 {
311 	struct drm_cmdline_mode mode = { };
312 	const char *cmdline = "720x480@refresh";
313 
314 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
315 									   &no_connector, &mode));
316 }
317 
318 static void drm_cmdline_test_res_bpp_refresh(struct kunit *test)
319 {
320 	struct drm_cmdline_mode mode = { };
321 	const char *cmdline = "720x480-24@60";
322 
323 	KUNIT_EXPECT_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_UNSPECIFIED);
340 }
341 
342 static void drm_cmdline_test_res_bpp_refresh_interlaced(struct kunit *test)
343 {
344 	struct drm_cmdline_mode mode = { };
345 	const char *cmdline = "720x480-24@60i";
346 
347 	KUNIT_EXPECT_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_TRUE(test, mode.interlace);
362 	KUNIT_EXPECT_FALSE(test, mode.margins);
363 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
364 }
365 
366 static void drm_cmdline_test_res_bpp_refresh_margins(struct kunit *test)
367 {
368 	struct drm_cmdline_mode mode = { };
369 	const char *cmdline =  "720x480-24@60m";
370 
371 	KUNIT_EXPECT_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_TRUE(test, mode.margins);
387 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
388 }
389 
390 static void drm_cmdline_test_res_bpp_refresh_force_off(struct kunit *test)
391 {
392 	struct drm_cmdline_mode mode = { };
393 	const char *cmdline =  "720x480-24@60d";
394 
395 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
396 									  &no_connector, &mode));
397 	KUNIT_EXPECT_TRUE(test, mode.specified);
398 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
399 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
400 
401 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
402 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
403 
404 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
405 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
406 
407 	KUNIT_EXPECT_FALSE(test, mode.rb);
408 	KUNIT_EXPECT_FALSE(test, mode.cvt);
409 	KUNIT_EXPECT_FALSE(test, mode.interlace);
410 	KUNIT_EXPECT_FALSE(test, mode.margins);
411 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_OFF);
412 }
413 
414 static void drm_cmdline_test_res_bpp_refresh_force_on_off(struct kunit *test)
415 {
416 	struct drm_cmdline_mode mode = { };
417 	const char *cmdline =  "720x480-24@60de";
418 
419 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
420 									   &no_connector, &mode));
421 }
422 
423 static void drm_cmdline_test_res_bpp_refresh_force_on(struct kunit *test)
424 {
425 	struct drm_cmdline_mode mode = { };
426 	const char *cmdline =  "720x480-24@60e";
427 
428 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
429 									  &no_connector, &mode));
430 	KUNIT_EXPECT_TRUE(test, mode.specified);
431 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
432 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
433 
434 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
435 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
436 
437 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
438 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
439 
440 	KUNIT_EXPECT_FALSE(test, mode.rb);
441 	KUNIT_EXPECT_FALSE(test, mode.cvt);
442 	KUNIT_EXPECT_FALSE(test, mode.interlace);
443 	KUNIT_EXPECT_FALSE(test, mode.margins);
444 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
445 }
446 
447 static void drm_cmdline_test_res_bpp_refresh_force_on_analog(struct kunit *test)
448 {
449 	struct drm_cmdline_mode mode = { };
450 	const char *cmdline = "720x480-24@60D";
451 
452 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
453 									  &no_connector, &mode));
454 	KUNIT_EXPECT_TRUE(test, mode.specified);
455 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
456 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
457 
458 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
459 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
460 
461 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
462 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
463 
464 	KUNIT_EXPECT_FALSE(test, mode.rb);
465 	KUNIT_EXPECT_FALSE(test, mode.cvt);
466 	KUNIT_EXPECT_FALSE(test, mode.interlace);
467 	KUNIT_EXPECT_FALSE(test, mode.margins);
468 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
469 }
470 
471 static void drm_cmdline_test_res_bpp_refresh_force_on_digital(struct kunit *test)
472 {
473 	struct drm_cmdline_mode mode = { };
474 	static const struct drm_connector connector = {
475 		.connector_type = DRM_MODE_CONNECTOR_DVII,
476 	};
477 	const char *cmdline = "720x480-24@60D";
478 
479 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
480 									  &connector, &mode));
481 	KUNIT_EXPECT_TRUE(test, mode.specified);
482 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
483 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
484 
485 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
486 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
487 
488 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
489 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
490 
491 	KUNIT_EXPECT_FALSE(test, mode.rb);
492 	KUNIT_EXPECT_FALSE(test, mode.cvt);
493 	KUNIT_EXPECT_FALSE(test, mode.interlace);
494 	KUNIT_EXPECT_FALSE(test, mode.margins);
495 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON_DIGITAL);
496 }
497 
498 static void drm_cmdline_test_res_bpp_refresh_interlaced_margins_force_on(struct kunit *test)
499 {
500 	struct drm_cmdline_mode mode = { };
501 	const char *cmdline = "720x480-24@60ime";
502 
503 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
504 									  &no_connector, &mode));
505 	KUNIT_EXPECT_TRUE(test, mode.specified);
506 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
507 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
508 
509 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
510 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
511 
512 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
513 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
514 
515 	KUNIT_EXPECT_FALSE(test, mode.rb);
516 	KUNIT_EXPECT_FALSE(test, mode.cvt);
517 	KUNIT_EXPECT_TRUE(test, mode.interlace);
518 	KUNIT_EXPECT_TRUE(test, mode.margins);
519 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
520 }
521 
522 static void drm_cmdline_test_res_margins_force_on(struct kunit *test)
523 {
524 	struct drm_cmdline_mode mode = { };
525 	const char *cmdline = "720x480me";
526 
527 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
528 									  &no_connector, &mode));
529 	KUNIT_EXPECT_TRUE(test, mode.specified);
530 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
531 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
532 
533 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
534 
535 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
536 
537 	KUNIT_EXPECT_FALSE(test, mode.rb);
538 	KUNIT_EXPECT_FALSE(test, mode.cvt);
539 	KUNIT_EXPECT_FALSE(test, mode.interlace);
540 	KUNIT_EXPECT_TRUE(test, mode.margins);
541 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
542 }
543 
544 static void drm_cmdline_test_res_vesa_margins(struct kunit *test)
545 {
546 	struct drm_cmdline_mode mode = { };
547 	const char *cmdline = "720x480Mm";
548 
549 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
550 									  &no_connector, &mode));
551 	KUNIT_EXPECT_TRUE(test, mode.specified);
552 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
553 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
554 
555 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
556 
557 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
558 
559 	KUNIT_EXPECT_FALSE(test, mode.rb);
560 	KUNIT_EXPECT_TRUE(test, mode.cvt);
561 	KUNIT_EXPECT_FALSE(test, mode.interlace);
562 	KUNIT_EXPECT_TRUE(test, mode.margins);
563 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
564 }
565 
566 static void drm_cmdline_test_res_invalid_mode(struct kunit *test)
567 {
568 	struct drm_cmdline_mode mode = { };
569 	const char *cmdline = "720x480f";
570 
571 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
572 									   &no_connector, &mode));
573 }
574 
575 static void drm_cmdline_test_res_bpp_wrong_place_mode(struct kunit *test)
576 {
577 	struct drm_cmdline_mode mode = { };
578 	const char *cmdline = "720x480e-24";
579 
580 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
581 									   &no_connector, &mode));
582 }
583 
584 static void drm_cmdline_test_name(struct kunit *test)
585 {
586 	struct drm_cmdline_mode mode = { };
587 	const char *cmdline = "NTSC";
588 
589 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
590 									  &no_connector, &mode));
591 	KUNIT_EXPECT_STREQ(test, mode.name, "NTSC");
592 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
593 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
594 }
595 
596 static void drm_cmdline_test_name_bpp(struct kunit *test)
597 {
598 	struct drm_cmdline_mode mode = { };
599 	const char *cmdline = "NTSC-24";
600 
601 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
602 									  &no_connector, &mode));
603 	KUNIT_EXPECT_STREQ(test, mode.name, "NTSC");
604 
605 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
606 
607 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
608 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
609 }
610 
611 static void drm_cmdline_test_name_bpp_refresh(struct kunit *test)
612 {
613 	struct drm_cmdline_mode mode = { };
614 	const char *cmdline = "NTSC-24@60";
615 
616 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
617 									   &no_connector, &mode));
618 }
619 
620 static void drm_cmdline_test_name_refresh(struct kunit *test)
621 {
622 	struct drm_cmdline_mode mode = { };
623 	const char *cmdline = "NTSC@60";
624 
625 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
626 									   &no_connector, &mode));
627 }
628 
629 static void drm_cmdline_test_name_refresh_wrong_mode(struct kunit *test)
630 {
631 	struct drm_cmdline_mode mode = { };
632 	const char *cmdline = "NTSC@60m";
633 
634 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
635 									   &no_connector, &mode));
636 }
637 
638 static void drm_cmdline_test_name_refresh_invalid_mode(struct kunit *test)
639 {
640 	struct drm_cmdline_mode mode = { };
641 	const char *cmdline = "NTSC@60f";
642 
643 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
644 									   &no_connector, &mode));
645 }
646 
647 static void drm_cmdline_test_name_option(struct kunit *test)
648 {
649 	struct drm_cmdline_mode mode = { };
650 	const char *cmdline = "NTSC,rotate=180";
651 
652 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
653 									  &no_connector, &mode));
654 	KUNIT_EXPECT_TRUE(test, mode.specified);
655 	KUNIT_EXPECT_STREQ(test, mode.name, "NTSC");
656 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
657 }
658 
659 static void drm_cmdline_test_name_bpp_option(struct kunit *test)
660 {
661 	struct drm_cmdline_mode mode = { };
662 	const char *cmdline = "NTSC-24,rotate=180";
663 
664 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
665 									  &no_connector, &mode));
666 	KUNIT_EXPECT_TRUE(test, mode.specified);
667 	KUNIT_EXPECT_STREQ(test, mode.name, "NTSC");
668 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
669 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
670 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
671 }
672 
673 static void drm_cmdline_test_rotate_0(struct kunit *test)
674 {
675 	struct drm_cmdline_mode mode = { };
676 	const char *cmdline = "720x480,rotate=0";
677 
678 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
679 									  &no_connector, &mode));
680 	KUNIT_EXPECT_TRUE(test, mode.specified);
681 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
682 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
683 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_0);
684 
685 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
686 
687 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
688 
689 	KUNIT_EXPECT_FALSE(test, mode.rb);
690 	KUNIT_EXPECT_FALSE(test, mode.cvt);
691 	KUNIT_EXPECT_FALSE(test, mode.interlace);
692 	KUNIT_EXPECT_FALSE(test, mode.margins);
693 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
694 }
695 
696 static void drm_cmdline_test_rotate_90(struct kunit *test)
697 {
698 	struct drm_cmdline_mode mode = { };
699 	const char *cmdline = "720x480,rotate=90";
700 
701 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
702 									  &no_connector, &mode));
703 	KUNIT_EXPECT_TRUE(test, mode.specified);
704 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
705 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
706 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_90);
707 
708 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
709 
710 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
711 
712 	KUNIT_EXPECT_FALSE(test, mode.rb);
713 	KUNIT_EXPECT_FALSE(test, mode.cvt);
714 	KUNIT_EXPECT_FALSE(test, mode.interlace);
715 	KUNIT_EXPECT_FALSE(test, mode.margins);
716 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
717 }
718 
719 static void drm_cmdline_test_rotate_180(struct kunit *test)
720 {
721 	struct drm_cmdline_mode mode = { };
722 	const char *cmdline = "720x480,rotate=180";
723 
724 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
725 									  &no_connector, &mode));
726 	KUNIT_EXPECT_TRUE(test, mode.specified);
727 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
728 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
729 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
730 
731 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
732 
733 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
734 
735 	KUNIT_EXPECT_FALSE(test, mode.rb);
736 	KUNIT_EXPECT_FALSE(test, mode.cvt);
737 	KUNIT_EXPECT_FALSE(test, mode.interlace);
738 	KUNIT_EXPECT_FALSE(test, mode.margins);
739 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
740 }
741 
742 static void drm_cmdline_test_rotate_270(struct kunit *test)
743 {
744 	struct drm_cmdline_mode mode = { };
745 	const char *cmdline = "720x480,rotate=270";
746 
747 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
748 									  &no_connector, &mode));
749 	KUNIT_EXPECT_TRUE(test, mode.specified);
750 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
751 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
752 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_270);
753 
754 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
755 
756 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
757 
758 	KUNIT_EXPECT_FALSE(test, mode.rb);
759 	KUNIT_EXPECT_FALSE(test, mode.cvt);
760 	KUNIT_EXPECT_FALSE(test, mode.interlace);
761 	KUNIT_EXPECT_FALSE(test, mode.margins);
762 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
763 }
764 
765 static void drm_cmdline_test_rotate_multiple(struct kunit *test)
766 {
767 	struct drm_cmdline_mode mode = { };
768 	const char *cmdline = "720x480,rotate=0,rotate=90";
769 
770 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
771 									   &no_connector, &mode));
772 }
773 
774 static void drm_cmdline_test_rotate_invalid_val(struct kunit *test)
775 {
776 	struct drm_cmdline_mode mode = { };
777 	const char *cmdline = "720x480,rotate=42";
778 
779 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
780 									   &no_connector, &mode));
781 }
782 
783 static void drm_cmdline_test_rotate_truncated(struct kunit *test)
784 {
785 	struct drm_cmdline_mode mode = { };
786 	const char *cmdline = "720x480,rotate=";
787 
788 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
789 									   &no_connector, &mode));
790 }
791 
792 static void drm_cmdline_test_hmirror(struct kunit *test)
793 {
794 	struct drm_cmdline_mode mode = { };
795 	const char *cmdline = "720x480,reflect_x";
796 
797 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
798 									  &no_connector, &mode));
799 	KUNIT_EXPECT_TRUE(test, mode.specified);
800 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
801 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
802 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_X));
803 
804 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
805 
806 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
807 
808 	KUNIT_EXPECT_FALSE(test, mode.rb);
809 	KUNIT_EXPECT_FALSE(test, mode.cvt);
810 	KUNIT_EXPECT_FALSE(test, mode.interlace);
811 	KUNIT_EXPECT_FALSE(test, mode.margins);
812 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
813 }
814 
815 static void drm_cmdline_test_vmirror(struct kunit *test)
816 {
817 	struct drm_cmdline_mode mode = { };
818 	const char *cmdline = "720x480,reflect_y";
819 
820 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
821 									  &no_connector, &mode));
822 	KUNIT_EXPECT_TRUE(test, mode.specified);
823 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
824 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
825 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_Y));
826 
827 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
828 
829 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
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 
838 static void drm_cmdline_test_margin_options(struct kunit *test)
839 {
840 	struct drm_cmdline_mode mode = { };
841 	const char *cmdline =
842 		"720x480,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42";
843 
844 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
845 									  &no_connector, &mode));
846 	KUNIT_EXPECT_TRUE(test, mode.specified);
847 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
848 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
849 	KUNIT_EXPECT_EQ(test, mode.tv_margins.right, 14);
850 	KUNIT_EXPECT_EQ(test, mode.tv_margins.left, 24);
851 	KUNIT_EXPECT_EQ(test, mode.tv_margins.bottom, 36);
852 	KUNIT_EXPECT_EQ(test, mode.tv_margins.top, 42);
853 
854 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
855 
856 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
857 
858 	KUNIT_EXPECT_FALSE(test, mode.rb);
859 	KUNIT_EXPECT_FALSE(test, mode.cvt);
860 	KUNIT_EXPECT_FALSE(test, mode.interlace);
861 	KUNIT_EXPECT_FALSE(test, mode.margins);
862 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
863 }
864 
865 static void drm_cmdline_test_multiple_options(struct kunit *test)
866 {
867 	struct drm_cmdline_mode mode = { };
868 	const char *cmdline = "720x480,rotate=270,reflect_x";
869 
870 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
871 									  &no_connector, &mode));
872 	KUNIT_EXPECT_TRUE(test, mode.specified);
873 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
874 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
875 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, (DRM_MODE_ROTATE_270 | DRM_MODE_REFLECT_X));
876 
877 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
878 
879 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
880 
881 	KUNIT_EXPECT_FALSE(test, mode.rb);
882 	KUNIT_EXPECT_FALSE(test, mode.cvt);
883 	KUNIT_EXPECT_FALSE(test, mode.interlace);
884 	KUNIT_EXPECT_FALSE(test, mode.margins);
885 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
886 }
887 
888 static void drm_cmdline_test_invalid_option(struct kunit *test)
889 {
890 	struct drm_cmdline_mode mode = { };
891 	const char *cmdline = "720x480,test=42";
892 
893 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(cmdline,
894 									   &no_connector, &mode));
895 }
896 
897 static void drm_cmdline_test_bpp_extra_and_option(struct kunit *test)
898 {
899 	struct drm_cmdline_mode mode = { };
900 	const char *cmdline = "720x480-24e,rotate=180";
901 
902 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
903 									  &no_connector, &mode));
904 	KUNIT_EXPECT_TRUE(test, mode.specified);
905 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
906 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
907 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
908 
909 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
910 
911 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
912 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
913 
914 	KUNIT_EXPECT_FALSE(test, mode.rb);
915 	KUNIT_EXPECT_FALSE(test, mode.cvt);
916 	KUNIT_EXPECT_FALSE(test, mode.interlace);
917 	KUNIT_EXPECT_FALSE(test, mode.margins);
918 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
919 }
920 
921 static void drm_cmdline_test_extra_and_option(struct kunit *test)
922 {
923 	struct drm_cmdline_mode mode = { };
924 	const char *cmdline = "720x480e,rotate=180";
925 
926 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
927 									  &no_connector, &mode));
928 	KUNIT_EXPECT_TRUE(test, mode.specified);
929 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
930 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
931 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
932 
933 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
934 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
935 
936 	KUNIT_EXPECT_FALSE(test, mode.rb);
937 	KUNIT_EXPECT_FALSE(test, mode.cvt);
938 	KUNIT_EXPECT_FALSE(test, mode.interlace);
939 	KUNIT_EXPECT_FALSE(test, mode.margins);
940 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
941 }
942 
943 static void drm_cmdline_test_freestanding_options(struct kunit *test)
944 {
945 	struct drm_cmdline_mode mode = { };
946 	const char *cmdline = "margin_right=14,margin_left=24,margin_bottom=36,margin_top=42";
947 
948 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
949 									  &no_connector, &mode));
950 	KUNIT_EXPECT_FALSE(test, mode.specified);
951 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
952 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
953 
954 	KUNIT_EXPECT_EQ(test, mode.tv_margins.right, 14);
955 	KUNIT_EXPECT_EQ(test, mode.tv_margins.left, 24);
956 	KUNIT_EXPECT_EQ(test, mode.tv_margins.bottom, 36);
957 	KUNIT_EXPECT_EQ(test, mode.tv_margins.top, 42);
958 
959 	KUNIT_EXPECT_FALSE(test, mode.rb);
960 	KUNIT_EXPECT_FALSE(test, mode.cvt);
961 	KUNIT_EXPECT_FALSE(test, mode.interlace);
962 	KUNIT_EXPECT_FALSE(test, mode.margins);
963 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
964 }
965 
966 static void drm_cmdline_test_freestanding_force_e_and_options(struct kunit *test)
967 {
968 	struct drm_cmdline_mode mode = { };
969 	const char *cmdline = "e,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42";
970 
971 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
972 									  &no_connector, &mode));
973 	KUNIT_EXPECT_FALSE(test, mode.specified);
974 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
975 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
976 
977 	KUNIT_EXPECT_EQ(test, mode.tv_margins.right, 14);
978 	KUNIT_EXPECT_EQ(test, mode.tv_margins.left, 24);
979 	KUNIT_EXPECT_EQ(test, mode.tv_margins.bottom, 36);
980 	KUNIT_EXPECT_EQ(test, mode.tv_margins.top, 42);
981 
982 	KUNIT_EXPECT_FALSE(test, mode.rb);
983 	KUNIT_EXPECT_FALSE(test, mode.cvt);
984 	KUNIT_EXPECT_FALSE(test, mode.interlace);
985 	KUNIT_EXPECT_FALSE(test, mode.margins);
986 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
987 }
988 
989 static void drm_cmdline_test_panel_orientation(struct kunit *test)
990 {
991 	struct drm_cmdline_mode mode = { };
992 	const char *cmdline = "panel_orientation=upside_down";
993 
994 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
995 									  &no_connector, &mode));
996 	KUNIT_EXPECT_FALSE(test, mode.specified);
997 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
998 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
999 
1000 	KUNIT_EXPECT_EQ(test, mode.panel_orientation, DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP);
1001 
1002 	KUNIT_EXPECT_FALSE(test, mode.rb);
1003 	KUNIT_EXPECT_FALSE(test, mode.cvt);
1004 	KUNIT_EXPECT_FALSE(test, mode.interlace);
1005 	KUNIT_EXPECT_FALSE(test, mode.margins);
1006 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
1007 }
1008 
1009 static struct kunit_case drm_cmdline_parser_tests[] = {
1010 	KUNIT_CASE(drm_cmdline_test_force_d_only),
1011 	KUNIT_CASE(drm_cmdline_test_force_D_only_dvi),
1012 	KUNIT_CASE(drm_cmdline_test_force_D_only_hdmi),
1013 	KUNIT_CASE(drm_cmdline_test_force_D_only_not_digital),
1014 	KUNIT_CASE(drm_cmdline_test_force_e_only),
1015 	KUNIT_CASE(drm_cmdline_test_margin_only),
1016 	KUNIT_CASE(drm_cmdline_test_interlace_only),
1017 	KUNIT_CASE(drm_cmdline_test_res),
1018 	KUNIT_CASE(drm_cmdline_test_res_missing_x),
1019 	KUNIT_CASE(drm_cmdline_test_res_missing_y),
1020 	KUNIT_CASE(drm_cmdline_test_res_bad_y),
1021 	KUNIT_CASE(drm_cmdline_test_res_missing_y_bpp),
1022 	KUNIT_CASE(drm_cmdline_test_res_vesa),
1023 	KUNIT_CASE(drm_cmdline_test_res_vesa_rblank),
1024 	KUNIT_CASE(drm_cmdline_test_res_rblank),
1025 	KUNIT_CASE(drm_cmdline_test_res_bpp),
1026 	KUNIT_CASE(drm_cmdline_test_res_bad_bpp),
1027 	KUNIT_CASE(drm_cmdline_test_res_refresh),
1028 	KUNIT_CASE(drm_cmdline_test_res_bad_refresh),
1029 	KUNIT_CASE(drm_cmdline_test_res_bpp_refresh),
1030 	KUNIT_CASE(drm_cmdline_test_res_bpp_refresh_interlaced),
1031 	KUNIT_CASE(drm_cmdline_test_res_bpp_refresh_margins),
1032 	KUNIT_CASE(drm_cmdline_test_res_bpp_refresh_force_off),
1033 	KUNIT_CASE(drm_cmdline_test_res_bpp_refresh_force_on_off),
1034 	KUNIT_CASE(drm_cmdline_test_res_bpp_refresh_force_on),
1035 	KUNIT_CASE(drm_cmdline_test_res_bpp_refresh_force_on_analog),
1036 	KUNIT_CASE(drm_cmdline_test_res_bpp_refresh_force_on_digital),
1037 	KUNIT_CASE(drm_cmdline_test_res_bpp_refresh_interlaced_margins_force_on),
1038 	KUNIT_CASE(drm_cmdline_test_res_margins_force_on),
1039 	KUNIT_CASE(drm_cmdline_test_res_vesa_margins),
1040 	KUNIT_CASE(drm_cmdline_test_res_invalid_mode),
1041 	KUNIT_CASE(drm_cmdline_test_res_bpp_wrong_place_mode),
1042 	KUNIT_CASE(drm_cmdline_test_name),
1043 	KUNIT_CASE(drm_cmdline_test_name_bpp),
1044 	KUNIT_CASE(drm_cmdline_test_name_refresh),
1045 	KUNIT_CASE(drm_cmdline_test_name_bpp_refresh),
1046 	KUNIT_CASE(drm_cmdline_test_name_refresh_wrong_mode),
1047 	KUNIT_CASE(drm_cmdline_test_name_refresh_invalid_mode),
1048 	KUNIT_CASE(drm_cmdline_test_name_option),
1049 	KUNIT_CASE(drm_cmdline_test_name_bpp_option),
1050 	KUNIT_CASE(drm_cmdline_test_rotate_0),
1051 	KUNIT_CASE(drm_cmdline_test_rotate_90),
1052 	KUNIT_CASE(drm_cmdline_test_rotate_180),
1053 	KUNIT_CASE(drm_cmdline_test_rotate_270),
1054 	KUNIT_CASE(drm_cmdline_test_rotate_multiple),
1055 	KUNIT_CASE(drm_cmdline_test_rotate_invalid_val),
1056 	KUNIT_CASE(drm_cmdline_test_rotate_truncated),
1057 	KUNIT_CASE(drm_cmdline_test_hmirror),
1058 	KUNIT_CASE(drm_cmdline_test_vmirror),
1059 	KUNIT_CASE(drm_cmdline_test_margin_options),
1060 	KUNIT_CASE(drm_cmdline_test_multiple_options),
1061 	KUNIT_CASE(drm_cmdline_test_invalid_option),
1062 	KUNIT_CASE(drm_cmdline_test_bpp_extra_and_option),
1063 	KUNIT_CASE(drm_cmdline_test_extra_and_option),
1064 	KUNIT_CASE(drm_cmdline_test_freestanding_options),
1065 	KUNIT_CASE(drm_cmdline_test_freestanding_force_e_and_options),
1066 	KUNIT_CASE(drm_cmdline_test_panel_orientation),
1067 	{}
1068 };
1069 
1070 static struct kunit_suite drm_cmdline_parser_test_suite = {
1071 	.name = "drm_cmdline_parser",
1072 	.test_cases = drm_cmdline_parser_tests
1073 };
1074 
1075 kunit_test_suite(drm_cmdline_parser_test_suite);
1076 
1077 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@bootlin.com>");
1078 MODULE_LICENSE("GPL");
1079