1
2
3
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
18static const struct drm_connector no_connector = {};
19
20static 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
40static 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
60static const struct drm_connector connector_hdmi = {
61 .connector_type = DRM_MODE_CONNECTOR_HDMIB,
62};
63
64static 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
84static const struct drm_connector connector_dvi = {
85 .connector_type = DRM_MODE_CONNECTOR_DVII,
86};
87
88static 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
108static 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
128static 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
139static 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
150static 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
174static 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
185static 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
196static 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
207static 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
218static 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
242static 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
266static 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
290static 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
315static 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
326static 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
351static 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
362static 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
388static 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
414static 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
440static 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
466static 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
477static 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
503static 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
529static 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
558static 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
584static 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
608static 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
632static 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
643static 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
654static 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
668static 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
685static 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
696static 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
707static 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
718static 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
729static 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
743static 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
759static 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
784static 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
809static 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
834static 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
859static int drm_cmdline_test_rotate_invalid_val(void *ignored)
860{
861 struct drm_cmdline_mode mode = { };
862
863 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=42",
864 &no_connector,
865 &mode));
866
867 return 0;
868}
869
870static int drm_cmdline_test_rotate_truncated(void *ignored)
871{
872 struct drm_cmdline_mode mode = { };
873
874 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=",
875 &no_connector,
876 &mode));
877
878 return 0;
879}
880
881static int drm_cmdline_test_hmirror(void *ignored)
882{
883 struct drm_cmdline_mode mode = { };
884
885 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_x",
886 &no_connector,
887 &mode));
888 FAIL_ON(!mode.specified);
889 FAIL_ON(mode.xres != 720);
890 FAIL_ON(mode.yres != 480);
891 FAIL_ON(mode.rotation_reflection != DRM_MODE_REFLECT_X);
892
893 FAIL_ON(mode.refresh_specified);
894
895 FAIL_ON(mode.bpp_specified);
896
897 FAIL_ON(mode.rb);
898 FAIL_ON(mode.cvt);
899 FAIL_ON(mode.interlace);
900 FAIL_ON(mode.margins);
901 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
902
903 return 0;
904}
905
906static int drm_cmdline_test_vmirror(void *ignored)
907{
908 struct drm_cmdline_mode mode = { };
909
910 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_y",
911 &no_connector,
912 &mode));
913 FAIL_ON(!mode.specified);
914 FAIL_ON(mode.xres != 720);
915 FAIL_ON(mode.yres != 480);
916 FAIL_ON(mode.rotation_reflection != DRM_MODE_REFLECT_Y);
917
918 FAIL_ON(mode.refresh_specified);
919
920 FAIL_ON(mode.bpp_specified);
921
922 FAIL_ON(mode.rb);
923 FAIL_ON(mode.cvt);
924 FAIL_ON(mode.interlace);
925 FAIL_ON(mode.margins);
926 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
927
928 return 0;
929}
930
931static int drm_cmdline_test_margin_options(void *ignored)
932{
933 struct drm_cmdline_mode mode = { };
934
935 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
936 &no_connector,
937 &mode));
938 FAIL_ON(!mode.specified);
939 FAIL_ON(mode.xres != 720);
940 FAIL_ON(mode.yres != 480);
941 FAIL_ON(mode.tv_margins.right != 14);
942 FAIL_ON(mode.tv_margins.left != 24);
943 FAIL_ON(mode.tv_margins.bottom != 36);
944 FAIL_ON(mode.tv_margins.top != 42);
945
946 FAIL_ON(mode.refresh_specified);
947
948 FAIL_ON(mode.bpp_specified);
949
950 FAIL_ON(mode.rb);
951 FAIL_ON(mode.cvt);
952 FAIL_ON(mode.interlace);
953 FAIL_ON(mode.margins);
954 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
955
956 return 0;
957}
958
959static int drm_cmdline_test_multiple_options(void *ignored)
960{
961 struct drm_cmdline_mode mode = { };
962
963 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=270,reflect_x",
964 &no_connector,
965 &mode));
966 FAIL_ON(!mode.specified);
967 FAIL_ON(mode.xres != 720);
968 FAIL_ON(mode.yres != 480);
969 FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_270 | DRM_MODE_REFLECT_X));
970
971 FAIL_ON(mode.refresh_specified);
972
973 FAIL_ON(mode.bpp_specified);
974
975 FAIL_ON(mode.rb);
976 FAIL_ON(mode.cvt);
977 FAIL_ON(mode.interlace);
978 FAIL_ON(mode.margins);
979 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
980
981 return 0;
982}
983
984static int drm_cmdline_test_invalid_option(void *ignored)
985{
986 struct drm_cmdline_mode mode = { };
987
988 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,test=42",
989 &no_connector,
990 &mode));
991
992 return 0;
993}
994
995#include "drm_selftest.c"
996
997static int __init test_drm_cmdline_init(void)
998{
999 int err;
1000
1001 err = run_selftests(selftests, ARRAY_SIZE(selftests), NULL);
1002
1003 return err > 0 ? 0 : err;
1004}
1005module_init(test_drm_cmdline_init);
1006
1007MODULE_AUTHOR("Maxime Ripard <maxime.ripard@bootlin.com>");
1008MODULE_LICENSE("GPL");
1009