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_multiple(void *ignored)
861 struct drm_cmdline_mode mode = { };
863 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=0,rotate=90",
870 static int drm_cmdline_test_rotate_invalid_val(void *ignored)
872 struct drm_cmdline_mode mode = { };
874 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=42",
881 static int drm_cmdline_test_rotate_truncated(void *ignored)
883 struct drm_cmdline_mode mode = { };
885 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=",
892 static int drm_cmdline_test_hmirror(void *ignored)
894 struct drm_cmdline_mode mode = { };
896 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_x",
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));
904 FAIL_ON(mode.refresh_specified);
906 FAIL_ON(mode.bpp_specified);
910 FAIL_ON(mode.interlace);
911 FAIL_ON(mode.margins);
912 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
917 static int drm_cmdline_test_vmirror(void *ignored)
919 struct drm_cmdline_mode mode = { };
921 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_y",
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));
929 FAIL_ON(mode.refresh_specified);
931 FAIL_ON(mode.bpp_specified);
935 FAIL_ON(mode.interlace);
936 FAIL_ON(mode.margins);
937 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
942 static int drm_cmdline_test_margin_options(void *ignored)
944 struct drm_cmdline_mode mode = { };
946 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
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);
957 FAIL_ON(mode.refresh_specified);
959 FAIL_ON(mode.bpp_specified);
963 FAIL_ON(mode.interlace);
964 FAIL_ON(mode.margins);
965 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
970 static int drm_cmdline_test_multiple_options(void *ignored)
972 struct drm_cmdline_mode mode = { };
974 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=270,reflect_x",
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));
982 FAIL_ON(mode.refresh_specified);
984 FAIL_ON(mode.bpp_specified);
988 FAIL_ON(mode.interlace);
989 FAIL_ON(mode.margins);
990 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
995 static int drm_cmdline_test_invalid_option(void *ignored)
997 struct drm_cmdline_mode mode = { };
999 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,test=42",
1006 static int drm_cmdline_test_bpp_extra_and_option(void *ignored)
1008 struct drm_cmdline_mode mode = { };
1010 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24e,rotate=180",
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);
1018 FAIL_ON(mode.refresh_specified);
1020 FAIL_ON(!mode.bpp_specified);
1021 FAIL_ON(mode.bpp != 24);
1025 FAIL_ON(mode.interlace);
1026 FAIL_ON(mode.margins);
1027 FAIL_ON(mode.force != DRM_FORCE_ON);
1032 static int drm_cmdline_test_extra_and_option(void *ignored)
1034 struct drm_cmdline_mode mode = { };
1036 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480e,rotate=180",
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);
1044 FAIL_ON(mode.refresh_specified);
1045 FAIL_ON(mode.bpp_specified);
1049 FAIL_ON(mode.interlace);
1050 FAIL_ON(mode.margins);
1051 FAIL_ON(mode.force != DRM_FORCE_ON);
1056 static int drm_cmdline_test_freestanding_options(void *ignored)
1058 struct drm_cmdline_mode mode = { };
1060 FAIL_ON(!drm_mode_parse_command_line_for_connector("margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
1063 FAIL_ON(mode.specified);
1064 FAIL_ON(mode.refresh_specified);
1065 FAIL_ON(mode.bpp_specified);
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);
1074 FAIL_ON(mode.interlace);
1075 FAIL_ON(mode.margins);
1076 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
1081 static int drm_cmdline_test_freestanding_force_e_and_options(void *ignored)
1083 struct drm_cmdline_mode mode = { };
1085 FAIL_ON(!drm_mode_parse_command_line_for_connector("e,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
1088 FAIL_ON(mode.specified);
1089 FAIL_ON(mode.refresh_specified);
1090 FAIL_ON(mode.bpp_specified);
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);
1099 FAIL_ON(mode.interlace);
1100 FAIL_ON(mode.margins);
1101 FAIL_ON(mode.force != DRM_FORCE_ON);
1106 static int drm_cmdline_test_panel_orientation(void *ignored)
1108 struct drm_cmdline_mode mode = { };
1110 FAIL_ON(!drm_mode_parse_command_line_for_connector("panel_orientation=upside_down",
1113 FAIL_ON(mode.specified);
1114 FAIL_ON(mode.refresh_specified);
1115 FAIL_ON(mode.bpp_specified);
1117 FAIL_ON(mode.panel_orientation != DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP);
1121 FAIL_ON(mode.interlace);
1122 FAIL_ON(mode.margins);
1123 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
1128 #include "drm_selftest.c"
1130 static int __init test_drm_cmdline_init(void)
1134 err = run_selftests(selftests, ARRAY_SIZE(selftests), NULL);
1136 return err > 0 ? 0 : err;
1138 module_init(test_drm_cmdline_init);
1141 MODULE_LICENSE("GPL");