1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2019 Bootlin
6 #define pr_fmt(fmt) "drm_cmdline: " fmt
8 #include <linux/kernel.h>
9 #include <linux/module.h>
11 #include <drm/drm_connector.h>
12 #include <drm/drm_modes.h>
14 #define TESTS "drm_cmdline_selftests.h"
15 #include "drm_selftest.h"
16 #include "test-drm_modeset_common.h"
18 static const struct drm_connector no_connector
= {};
20 static int drm_cmdline_test_force_e_only(void *ignored
)
22 struct drm_cmdline_mode mode
= { };
24 FAIL_ON(!drm_mode_parse_command_line_for_connector("e",
27 FAIL_ON(mode
.specified
);
28 FAIL_ON(mode
.refresh_specified
);
29 FAIL_ON(mode
.bpp_specified
);
33 FAIL_ON(mode
.interlace
);
34 FAIL_ON(mode
.margins
);
35 FAIL_ON(mode
.force
!= DRM_FORCE_ON
);
40 static int drm_cmdline_test_force_D_only_not_digital(void *ignored
)
42 struct drm_cmdline_mode mode
= { };
44 FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
47 FAIL_ON(mode
.specified
);
48 FAIL_ON(mode
.refresh_specified
);
49 FAIL_ON(mode
.bpp_specified
);
53 FAIL_ON(mode
.interlace
);
54 FAIL_ON(mode
.margins
);
55 FAIL_ON(mode
.force
!= DRM_FORCE_ON
);
60 static const struct drm_connector connector_hdmi
= {
61 .connector_type
= DRM_MODE_CONNECTOR_HDMIB
,
64 static int drm_cmdline_test_force_D_only_hdmi(void *ignored
)
66 struct drm_cmdline_mode mode
= { };
68 FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
71 FAIL_ON(mode
.specified
);
72 FAIL_ON(mode
.refresh_specified
);
73 FAIL_ON(mode
.bpp_specified
);
77 FAIL_ON(mode
.interlace
);
78 FAIL_ON(mode
.margins
);
79 FAIL_ON(mode
.force
!= DRM_FORCE_ON_DIGITAL
);
84 static const struct drm_connector connector_dvi
= {
85 .connector_type
= DRM_MODE_CONNECTOR_DVII
,
88 static int drm_cmdline_test_force_D_only_dvi(void *ignored
)
90 struct drm_cmdline_mode mode
= { };
92 FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
95 FAIL_ON(mode
.specified
);
96 FAIL_ON(mode
.refresh_specified
);
97 FAIL_ON(mode
.bpp_specified
);
101 FAIL_ON(mode
.interlace
);
102 FAIL_ON(mode
.margins
);
103 FAIL_ON(mode
.force
!= DRM_FORCE_ON_DIGITAL
);
108 static int drm_cmdline_test_force_d_only(void *ignored
)
110 struct drm_cmdline_mode mode
= { };
112 FAIL_ON(!drm_mode_parse_command_line_for_connector("d",
115 FAIL_ON(mode
.specified
);
116 FAIL_ON(mode
.refresh_specified
);
117 FAIL_ON(mode
.bpp_specified
);
121 FAIL_ON(mode
.interlace
);
122 FAIL_ON(mode
.margins
);
123 FAIL_ON(mode
.force
!= DRM_FORCE_OFF
);
128 static int drm_cmdline_test_margin_only(void *ignored
)
130 struct drm_cmdline_mode mode
= { };
132 FAIL_ON(drm_mode_parse_command_line_for_connector("m",
139 static int drm_cmdline_test_interlace_only(void *ignored
)
141 struct drm_cmdline_mode mode
= { };
143 FAIL_ON(drm_mode_parse_command_line_for_connector("i",
150 static int drm_cmdline_test_res(void *ignored
)
152 struct drm_cmdline_mode mode
= { };
154 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480",
157 FAIL_ON(!mode
.specified
);
158 FAIL_ON(mode
.xres
!= 720);
159 FAIL_ON(mode
.yres
!= 480);
161 FAIL_ON(mode
.refresh_specified
);
163 FAIL_ON(mode
.bpp_specified
);
167 FAIL_ON(mode
.interlace
);
168 FAIL_ON(mode
.margins
);
169 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
174 static int drm_cmdline_test_res_missing_x(void *ignored
)
176 struct drm_cmdline_mode mode
= { };
178 FAIL_ON(drm_mode_parse_command_line_for_connector("x480",
185 static int drm_cmdline_test_res_missing_y(void *ignored
)
187 struct drm_cmdline_mode mode
= { };
189 FAIL_ON(drm_mode_parse_command_line_for_connector("1024x",
196 static int drm_cmdline_test_res_bad_y(void *ignored
)
198 struct drm_cmdline_mode mode
= { };
200 FAIL_ON(drm_mode_parse_command_line_for_connector("1024xtest",
207 static int drm_cmdline_test_res_missing_y_bpp(void *ignored
)
209 struct drm_cmdline_mode mode
= { };
211 FAIL_ON(drm_mode_parse_command_line_for_connector("1024x-24",
218 static int drm_cmdline_test_res_vesa(void *ignored
)
220 struct drm_cmdline_mode mode
= { };
222 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480M",
225 FAIL_ON(!mode
.specified
);
226 FAIL_ON(mode
.xres
!= 720);
227 FAIL_ON(mode
.yres
!= 480);
229 FAIL_ON(mode
.refresh_specified
);
231 FAIL_ON(mode
.bpp_specified
);
235 FAIL_ON(mode
.interlace
);
236 FAIL_ON(mode
.margins
);
237 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
242 static int drm_cmdline_test_res_vesa_rblank(void *ignored
)
244 struct drm_cmdline_mode mode
= { };
246 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480MR",
249 FAIL_ON(!mode
.specified
);
250 FAIL_ON(mode
.xres
!= 720);
251 FAIL_ON(mode
.yres
!= 480);
253 FAIL_ON(mode
.refresh_specified
);
255 FAIL_ON(mode
.bpp_specified
);
259 FAIL_ON(mode
.interlace
);
260 FAIL_ON(mode
.margins
);
261 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
266 static int drm_cmdline_test_res_rblank(void *ignored
)
268 struct drm_cmdline_mode mode
= { };
270 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480R",
273 FAIL_ON(!mode
.specified
);
274 FAIL_ON(mode
.xres
!= 720);
275 FAIL_ON(mode
.yres
!= 480);
277 FAIL_ON(mode
.refresh_specified
);
279 FAIL_ON(mode
.bpp_specified
);
283 FAIL_ON(mode
.interlace
);
284 FAIL_ON(mode
.margins
);
285 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
290 static int drm_cmdline_test_res_bpp(void *ignored
)
292 struct drm_cmdline_mode mode
= { };
294 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24",
297 FAIL_ON(!mode
.specified
);
298 FAIL_ON(mode
.xres
!= 720);
299 FAIL_ON(mode
.yres
!= 480);
301 FAIL_ON(mode
.refresh_specified
);
303 FAIL_ON(!mode
.bpp_specified
);
304 FAIL_ON(mode
.bpp
!= 24);
308 FAIL_ON(mode
.interlace
);
309 FAIL_ON(mode
.margins
);
310 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
315 static int drm_cmdline_test_res_bad_bpp(void *ignored
)
317 struct drm_cmdline_mode mode
= { };
319 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480-test",
326 static int drm_cmdline_test_res_refresh(void *ignored
)
328 struct drm_cmdline_mode mode
= { };
330 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480@60",
333 FAIL_ON(!mode
.specified
);
334 FAIL_ON(mode
.xres
!= 720);
335 FAIL_ON(mode
.yres
!= 480);
337 FAIL_ON(!mode
.refresh_specified
);
338 FAIL_ON(mode
.refresh
!= 60);
340 FAIL_ON(mode
.bpp_specified
);
344 FAIL_ON(mode
.interlace
);
345 FAIL_ON(mode
.margins
);
346 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
351 static int drm_cmdline_test_res_bad_refresh(void *ignored
)
353 struct drm_cmdline_mode mode
= { };
355 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480@refresh",
362 static int drm_cmdline_test_res_bpp_refresh(void *ignored
)
364 struct drm_cmdline_mode mode
= { };
366 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60",
369 FAIL_ON(!mode
.specified
);
370 FAIL_ON(mode
.xres
!= 720);
371 FAIL_ON(mode
.yres
!= 480);
373 FAIL_ON(!mode
.refresh_specified
);
374 FAIL_ON(mode
.refresh
!= 60);
376 FAIL_ON(!mode
.bpp_specified
);
377 FAIL_ON(mode
.bpp
!= 24);
381 FAIL_ON(mode
.interlace
);
382 FAIL_ON(mode
.margins
);
383 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
388 static int drm_cmdline_test_res_bpp_refresh_interlaced(void *ignored
)
390 struct drm_cmdline_mode mode
= { };
392 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60i",
395 FAIL_ON(!mode
.specified
);
396 FAIL_ON(mode
.xres
!= 720);
397 FAIL_ON(mode
.yres
!= 480);
399 FAIL_ON(!mode
.refresh_specified
);
400 FAIL_ON(mode
.refresh
!= 60);
402 FAIL_ON(!mode
.bpp_specified
);
403 FAIL_ON(mode
.bpp
!= 24);
407 FAIL_ON(!mode
.interlace
);
408 FAIL_ON(mode
.margins
);
409 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
414 static int drm_cmdline_test_res_bpp_refresh_margins(void *ignored
)
416 struct drm_cmdline_mode mode
= { };
418 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60m",
421 FAIL_ON(!mode
.specified
);
422 FAIL_ON(mode
.xres
!= 720);
423 FAIL_ON(mode
.yres
!= 480);
425 FAIL_ON(!mode
.refresh_specified
);
426 FAIL_ON(mode
.refresh
!= 60);
428 FAIL_ON(!mode
.bpp_specified
);
429 FAIL_ON(mode
.bpp
!= 24);
433 FAIL_ON(mode
.interlace
);
434 FAIL_ON(!mode
.margins
);
435 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
440 static int drm_cmdline_test_res_bpp_refresh_force_off(void *ignored
)
442 struct drm_cmdline_mode mode
= { };
444 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60d",
447 FAIL_ON(!mode
.specified
);
448 FAIL_ON(mode
.xres
!= 720);
449 FAIL_ON(mode
.yres
!= 480);
451 FAIL_ON(!mode
.refresh_specified
);
452 FAIL_ON(mode
.refresh
!= 60);
454 FAIL_ON(!mode
.bpp_specified
);
455 FAIL_ON(mode
.bpp
!= 24);
459 FAIL_ON(mode
.interlace
);
460 FAIL_ON(mode
.margins
);
461 FAIL_ON(mode
.force
!= DRM_FORCE_OFF
);
466 static int drm_cmdline_test_res_bpp_refresh_force_on_off(void *ignored
)
468 struct drm_cmdline_mode mode
= { };
470 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480-24@60de",
477 static int drm_cmdline_test_res_bpp_refresh_force_on(void *ignored
)
479 struct drm_cmdline_mode mode
= { };
481 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60e",
484 FAIL_ON(!mode
.specified
);
485 FAIL_ON(mode
.xres
!= 720);
486 FAIL_ON(mode
.yres
!= 480);
488 FAIL_ON(!mode
.refresh_specified
);
489 FAIL_ON(mode
.refresh
!= 60);
491 FAIL_ON(!mode
.bpp_specified
);
492 FAIL_ON(mode
.bpp
!= 24);
496 FAIL_ON(mode
.interlace
);
497 FAIL_ON(mode
.margins
);
498 FAIL_ON(mode
.force
!= DRM_FORCE_ON
);
503 static int drm_cmdline_test_res_bpp_refresh_force_on_analog(void *ignored
)
505 struct drm_cmdline_mode mode
= { };
507 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60D",
510 FAIL_ON(!mode
.specified
);
511 FAIL_ON(mode
.xres
!= 720);
512 FAIL_ON(mode
.yres
!= 480);
514 FAIL_ON(!mode
.refresh_specified
);
515 FAIL_ON(mode
.refresh
!= 60);
517 FAIL_ON(!mode
.bpp_specified
);
518 FAIL_ON(mode
.bpp
!= 24);
522 FAIL_ON(mode
.interlace
);
523 FAIL_ON(mode
.margins
);
524 FAIL_ON(mode
.force
!= DRM_FORCE_ON
);
529 static int drm_cmdline_test_res_bpp_refresh_force_on_digital(void *ignored
)
531 struct drm_cmdline_mode mode
= { };
532 static const struct drm_connector connector
= {
533 .connector_type
= DRM_MODE_CONNECTOR_DVII
,
536 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60D",
539 FAIL_ON(!mode
.specified
);
540 FAIL_ON(mode
.xres
!= 720);
541 FAIL_ON(mode
.yres
!= 480);
543 FAIL_ON(!mode
.refresh_specified
);
544 FAIL_ON(mode
.refresh
!= 60);
546 FAIL_ON(!mode
.bpp_specified
);
547 FAIL_ON(mode
.bpp
!= 24);
551 FAIL_ON(mode
.interlace
);
552 FAIL_ON(mode
.margins
);
553 FAIL_ON(mode
.force
!= DRM_FORCE_ON_DIGITAL
);
558 static int drm_cmdline_test_res_bpp_refresh_interlaced_margins_force_on(void *ignored
)
560 struct drm_cmdline_mode mode
= { };
562 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60ime",
565 FAIL_ON(!mode
.specified
);
566 FAIL_ON(mode
.xres
!= 720);
567 FAIL_ON(mode
.yres
!= 480);
569 FAIL_ON(!mode
.refresh_specified
);
570 FAIL_ON(mode
.refresh
!= 60);
572 FAIL_ON(!mode
.bpp_specified
);
573 FAIL_ON(mode
.bpp
!= 24);
577 FAIL_ON(!mode
.interlace
);
578 FAIL_ON(!mode
.margins
);
579 FAIL_ON(mode
.force
!= DRM_FORCE_ON
);
584 static int drm_cmdline_test_res_margins_force_on(void *ignored
)
586 struct drm_cmdline_mode mode
= { };
588 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480me",
591 FAIL_ON(!mode
.specified
);
592 FAIL_ON(mode
.xres
!= 720);
593 FAIL_ON(mode
.yres
!= 480);
595 FAIL_ON(mode
.refresh_specified
);
597 FAIL_ON(mode
.bpp_specified
);
601 FAIL_ON(mode
.interlace
);
602 FAIL_ON(!mode
.margins
);
603 FAIL_ON(mode
.force
!= DRM_FORCE_ON
);
608 static int drm_cmdline_test_res_vesa_margins(void *ignored
)
610 struct drm_cmdline_mode mode
= { };
612 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480Mm",
615 FAIL_ON(!mode
.specified
);
616 FAIL_ON(mode
.xres
!= 720);
617 FAIL_ON(mode
.yres
!= 480);
619 FAIL_ON(mode
.refresh_specified
);
621 FAIL_ON(mode
.bpp_specified
);
625 FAIL_ON(mode
.interlace
);
626 FAIL_ON(!mode
.margins
);
627 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
632 static int drm_cmdline_test_res_invalid_mode(void *ignored
)
634 struct drm_cmdline_mode mode
= { };
636 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480f",
643 static int drm_cmdline_test_res_bpp_wrong_place_mode(void *ignored
)
645 struct drm_cmdline_mode mode
= { };
647 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480e-24",
654 static int drm_cmdline_test_name(void *ignored
)
656 struct drm_cmdline_mode mode
= { };
658 FAIL_ON(!drm_mode_parse_command_line_for_connector("NTSC",
661 FAIL_ON(strcmp(mode
.name
, "NTSC"));
662 FAIL_ON(mode
.refresh_specified
);
663 FAIL_ON(mode
.bpp_specified
);
668 static int drm_cmdline_test_name_bpp(void *ignored
)
670 struct drm_cmdline_mode mode
= { };
672 FAIL_ON(!drm_mode_parse_command_line_for_connector("NTSC-24",
675 FAIL_ON(strcmp(mode
.name
, "NTSC"));
677 FAIL_ON(mode
.refresh_specified
);
679 FAIL_ON(!mode
.bpp_specified
);
680 FAIL_ON(mode
.bpp
!= 24);
685 static int drm_cmdline_test_name_bpp_refresh(void *ignored
)
687 struct drm_cmdline_mode mode
= { };
689 FAIL_ON(drm_mode_parse_command_line_for_connector("NTSC-24@60",
696 static int drm_cmdline_test_name_refresh(void *ignored
)
698 struct drm_cmdline_mode mode
= { };
700 FAIL_ON(drm_mode_parse_command_line_for_connector("NTSC@60",
707 static int drm_cmdline_test_name_refresh_wrong_mode(void *ignored
)
709 struct drm_cmdline_mode mode
= { };
711 FAIL_ON(drm_mode_parse_command_line_for_connector("NTSC@60m",
718 static int drm_cmdline_test_name_refresh_invalid_mode(void *ignored
)
720 struct drm_cmdline_mode mode
= { };
722 FAIL_ON(drm_mode_parse_command_line_for_connector("NTSC@60f",
729 static int drm_cmdline_test_name_option(void *ignored
)
731 struct drm_cmdline_mode mode
= { };
733 FAIL_ON(!drm_mode_parse_command_line_for_connector("NTSC,rotate=180",
736 FAIL_ON(!mode
.specified
);
737 FAIL_ON(strcmp(mode
.name
, "NTSC"));
738 FAIL_ON(mode
.rotation_reflection
!= DRM_MODE_ROTATE_180
);
743 static int drm_cmdline_test_name_bpp_option(void *ignored
)
745 struct drm_cmdline_mode mode
= { };
747 FAIL_ON(!drm_mode_parse_command_line_for_connector("NTSC-24,rotate=180",
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);
759 static int drm_cmdline_test_rotate_0(void *ignored
)
761 struct drm_cmdline_mode mode
= { };
763 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=0",
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
);
771 FAIL_ON(mode
.refresh_specified
);
773 FAIL_ON(mode
.bpp_specified
);
777 FAIL_ON(mode
.interlace
);
778 FAIL_ON(mode
.margins
);
779 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
784 static int drm_cmdline_test_rotate_90(void *ignored
)
786 struct drm_cmdline_mode mode
= { };
788 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=90",
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
);
796 FAIL_ON(mode
.refresh_specified
);
798 FAIL_ON(mode
.bpp_specified
);
802 FAIL_ON(mode
.interlace
);
803 FAIL_ON(mode
.margins
);
804 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
809 static int drm_cmdline_test_rotate_180(void *ignored
)
811 struct drm_cmdline_mode mode
= { };
813 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=180",
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
);
821 FAIL_ON(mode
.refresh_specified
);
823 FAIL_ON(mode
.bpp_specified
);
827 FAIL_ON(mode
.interlace
);
828 FAIL_ON(mode
.margins
);
829 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
834 static int drm_cmdline_test_rotate_270(void *ignored
)
836 struct drm_cmdline_mode mode
= { };
838 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=270",
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
);
846 FAIL_ON(mode
.refresh_specified
);
848 FAIL_ON(mode
.bpp_specified
);
852 FAIL_ON(mode
.interlace
);
853 FAIL_ON(mode
.margins
);
854 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
859 static int drm_cmdline_test_rotate_invalid_val(void *ignored
)
861 struct drm_cmdline_mode mode
= { };
863 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=42",
870 static int drm_cmdline_test_rotate_truncated(void *ignored
)
872 struct drm_cmdline_mode mode
= { };
874 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=",
881 static int drm_cmdline_test_hmirror(void *ignored
)
883 struct drm_cmdline_mode mode
= { };
885 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_x",
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
);
893 FAIL_ON(mode
.refresh_specified
);
895 FAIL_ON(mode
.bpp_specified
);
899 FAIL_ON(mode
.interlace
);
900 FAIL_ON(mode
.margins
);
901 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
906 static int drm_cmdline_test_vmirror(void *ignored
)
908 struct drm_cmdline_mode mode
= { };
910 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_y",
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
);
918 FAIL_ON(mode
.refresh_specified
);
920 FAIL_ON(mode
.bpp_specified
);
924 FAIL_ON(mode
.interlace
);
925 FAIL_ON(mode
.margins
);
926 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
931 static int drm_cmdline_test_margin_options(void *ignored
)
933 struct drm_cmdline_mode mode
= { };
935 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
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);
946 FAIL_ON(mode
.refresh_specified
);
948 FAIL_ON(mode
.bpp_specified
);
952 FAIL_ON(mode
.interlace
);
953 FAIL_ON(mode
.margins
);
954 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
959 static int drm_cmdline_test_multiple_options(void *ignored
)
961 struct drm_cmdline_mode mode
= { };
963 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=270,reflect_x",
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
));
971 FAIL_ON(mode
.refresh_specified
);
973 FAIL_ON(mode
.bpp_specified
);
977 FAIL_ON(mode
.interlace
);
978 FAIL_ON(mode
.margins
);
979 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
984 static int drm_cmdline_test_invalid_option(void *ignored
)
986 struct drm_cmdline_mode mode
= { };
988 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,test=42",
995 static int drm_cmdline_test_bpp_extra_and_option(void *ignored
)
997 struct drm_cmdline_mode mode
= { };
999 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24e,rotate=180",
1002 FAIL_ON(!mode
.specified
);
1003 FAIL_ON(mode
.xres
!= 720);
1004 FAIL_ON(mode
.yres
!= 480);
1005 FAIL_ON(mode
.rotation_reflection
!= DRM_MODE_ROTATE_180
);
1007 FAIL_ON(mode
.refresh_specified
);
1009 FAIL_ON(!mode
.bpp_specified
);
1010 FAIL_ON(mode
.bpp
!= 24);
1014 FAIL_ON(mode
.interlace
);
1015 FAIL_ON(mode
.margins
);
1016 FAIL_ON(mode
.force
!= DRM_FORCE_ON
);
1021 static int drm_cmdline_test_extra_and_option(void *ignored
)
1023 struct drm_cmdline_mode mode
= { };
1025 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480e,rotate=180",
1028 FAIL_ON(!mode
.specified
);
1029 FAIL_ON(mode
.xres
!= 720);
1030 FAIL_ON(mode
.yres
!= 480);
1031 FAIL_ON(mode
.rotation_reflection
!= DRM_MODE_ROTATE_180
);
1033 FAIL_ON(mode
.refresh_specified
);
1034 FAIL_ON(mode
.bpp_specified
);
1038 FAIL_ON(mode
.interlace
);
1039 FAIL_ON(mode
.margins
);
1040 FAIL_ON(mode
.force
!= DRM_FORCE_ON
);
1045 static int drm_cmdline_test_freestanding_options(void *ignored
)
1047 struct drm_cmdline_mode mode
= { };
1049 FAIL_ON(!drm_mode_parse_command_line_for_connector("margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
1052 FAIL_ON(mode
.specified
);
1053 FAIL_ON(mode
.refresh_specified
);
1054 FAIL_ON(mode
.bpp_specified
);
1056 FAIL_ON(mode
.tv_margins
.right
!= 14);
1057 FAIL_ON(mode
.tv_margins
.left
!= 24);
1058 FAIL_ON(mode
.tv_margins
.bottom
!= 36);
1059 FAIL_ON(mode
.tv_margins
.top
!= 42);
1063 FAIL_ON(mode
.interlace
);
1064 FAIL_ON(mode
.margins
);
1065 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
1070 static int drm_cmdline_test_freestanding_force_e_and_options(void *ignored
)
1072 struct drm_cmdline_mode mode
= { };
1074 FAIL_ON(!drm_mode_parse_command_line_for_connector("e,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
1077 FAIL_ON(mode
.specified
);
1078 FAIL_ON(mode
.refresh_specified
);
1079 FAIL_ON(mode
.bpp_specified
);
1081 FAIL_ON(mode
.tv_margins
.right
!= 14);
1082 FAIL_ON(mode
.tv_margins
.left
!= 24);
1083 FAIL_ON(mode
.tv_margins
.bottom
!= 36);
1084 FAIL_ON(mode
.tv_margins
.top
!= 42);
1088 FAIL_ON(mode
.interlace
);
1089 FAIL_ON(mode
.margins
);
1090 FAIL_ON(mode
.force
!= DRM_FORCE_ON
);
1095 static int drm_cmdline_test_panel_orientation(void *ignored
)
1097 struct drm_cmdline_mode mode
= { };
1099 FAIL_ON(!drm_mode_parse_command_line_for_connector("panel_orientation=upside_down",
1102 FAIL_ON(mode
.specified
);
1103 FAIL_ON(mode
.refresh_specified
);
1104 FAIL_ON(mode
.bpp_specified
);
1106 FAIL_ON(mode
.panel_orientation
!= DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP
);
1110 FAIL_ON(mode
.interlace
);
1111 FAIL_ON(mode
.margins
);
1112 FAIL_ON(mode
.force
!= DRM_FORCE_UNSPECIFIED
);
1117 #include "drm_selftest.c"
1119 static int __init
test_drm_cmdline_init(void)
1123 err
= run_selftests(selftests
, ARRAY_SIZE(selftests
), NULL
);
1125 return err
> 0 ? 0 : err
;
1127 module_init(test_drm_cmdline_init
);
1129 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@bootlin.com>");
1130 MODULE_LICENSE("GPL");