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