0001
0002
0003
0004
0005
0006 #define pr_fmt(fmt) "drm_cmdline: " fmt
0007
0008 #include <linux/kernel.h>
0009 #include <linux/module.h>
0010
0011 #include <drm/drm_connector.h>
0012 #include <drm/drm_modes.h>
0013
0014 #define TESTS "drm_cmdline_selftests.h"
0015 #include "drm_selftest.h"
0016 #include "test-drm_modeset_common.h"
0017
0018 static const struct drm_connector no_connector = {};
0019
0020 static int drm_cmdline_test_force_e_only(void *ignored)
0021 {
0022 struct drm_cmdline_mode mode = { };
0023
0024 FAIL_ON(!drm_mode_parse_command_line_for_connector("e",
0025 &no_connector,
0026 &mode));
0027 FAIL_ON(mode.specified);
0028 FAIL_ON(mode.refresh_specified);
0029 FAIL_ON(mode.bpp_specified);
0030
0031 FAIL_ON(mode.rb);
0032 FAIL_ON(mode.cvt);
0033 FAIL_ON(mode.interlace);
0034 FAIL_ON(mode.margins);
0035 FAIL_ON(mode.force != DRM_FORCE_ON);
0036
0037 return 0;
0038 }
0039
0040 static int drm_cmdline_test_force_D_only_not_digital(void *ignored)
0041 {
0042 struct drm_cmdline_mode mode = { };
0043
0044 FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
0045 &no_connector,
0046 &mode));
0047 FAIL_ON(mode.specified);
0048 FAIL_ON(mode.refresh_specified);
0049 FAIL_ON(mode.bpp_specified);
0050
0051 FAIL_ON(mode.rb);
0052 FAIL_ON(mode.cvt);
0053 FAIL_ON(mode.interlace);
0054 FAIL_ON(mode.margins);
0055 FAIL_ON(mode.force != DRM_FORCE_ON);
0056
0057 return 0;
0058 }
0059
0060 static const struct drm_connector connector_hdmi = {
0061 .connector_type = DRM_MODE_CONNECTOR_HDMIB,
0062 };
0063
0064 static int drm_cmdline_test_force_D_only_hdmi(void *ignored)
0065 {
0066 struct drm_cmdline_mode mode = { };
0067
0068 FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
0069 &connector_hdmi,
0070 &mode));
0071 FAIL_ON(mode.specified);
0072 FAIL_ON(mode.refresh_specified);
0073 FAIL_ON(mode.bpp_specified);
0074
0075 FAIL_ON(mode.rb);
0076 FAIL_ON(mode.cvt);
0077 FAIL_ON(mode.interlace);
0078 FAIL_ON(mode.margins);
0079 FAIL_ON(mode.force != DRM_FORCE_ON_DIGITAL);
0080
0081 return 0;
0082 }
0083
0084 static const struct drm_connector connector_dvi = {
0085 .connector_type = DRM_MODE_CONNECTOR_DVII,
0086 };
0087
0088 static int drm_cmdline_test_force_D_only_dvi(void *ignored)
0089 {
0090 struct drm_cmdline_mode mode = { };
0091
0092 FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
0093 &connector_dvi,
0094 &mode));
0095 FAIL_ON(mode.specified);
0096 FAIL_ON(mode.refresh_specified);
0097 FAIL_ON(mode.bpp_specified);
0098
0099 FAIL_ON(mode.rb);
0100 FAIL_ON(mode.cvt);
0101 FAIL_ON(mode.interlace);
0102 FAIL_ON(mode.margins);
0103 FAIL_ON(mode.force != DRM_FORCE_ON_DIGITAL);
0104
0105 return 0;
0106 }
0107
0108 static int drm_cmdline_test_force_d_only(void *ignored)
0109 {
0110 struct drm_cmdline_mode mode = { };
0111
0112 FAIL_ON(!drm_mode_parse_command_line_for_connector("d",
0113 &no_connector,
0114 &mode));
0115 FAIL_ON(mode.specified);
0116 FAIL_ON(mode.refresh_specified);
0117 FAIL_ON(mode.bpp_specified);
0118
0119 FAIL_ON(mode.rb);
0120 FAIL_ON(mode.cvt);
0121 FAIL_ON(mode.interlace);
0122 FAIL_ON(mode.margins);
0123 FAIL_ON(mode.force != DRM_FORCE_OFF);
0124
0125 return 0;
0126 }
0127
0128 static int drm_cmdline_test_margin_only(void *ignored)
0129 {
0130 struct drm_cmdline_mode mode = { };
0131
0132 FAIL_ON(drm_mode_parse_command_line_for_connector("m",
0133 &no_connector,
0134 &mode));
0135
0136 return 0;
0137 }
0138
0139 static int drm_cmdline_test_interlace_only(void *ignored)
0140 {
0141 struct drm_cmdline_mode mode = { };
0142
0143 FAIL_ON(drm_mode_parse_command_line_for_connector("i",
0144 &no_connector,
0145 &mode));
0146
0147 return 0;
0148 }
0149
0150 static int drm_cmdline_test_res(void *ignored)
0151 {
0152 struct drm_cmdline_mode mode = { };
0153
0154 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480",
0155 &no_connector,
0156 &mode));
0157 FAIL_ON(!mode.specified);
0158 FAIL_ON(mode.xres != 720);
0159 FAIL_ON(mode.yres != 480);
0160
0161 FAIL_ON(mode.refresh_specified);
0162
0163 FAIL_ON(mode.bpp_specified);
0164
0165 FAIL_ON(mode.rb);
0166 FAIL_ON(mode.cvt);
0167 FAIL_ON(mode.interlace);
0168 FAIL_ON(mode.margins);
0169 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0170
0171 return 0;
0172 }
0173
0174 static int drm_cmdline_test_res_missing_x(void *ignored)
0175 {
0176 struct drm_cmdline_mode mode = { };
0177
0178 FAIL_ON(drm_mode_parse_command_line_for_connector("x480",
0179 &no_connector,
0180 &mode));
0181
0182 return 0;
0183 }
0184
0185 static int drm_cmdline_test_res_missing_y(void *ignored)
0186 {
0187 struct drm_cmdline_mode mode = { };
0188
0189 FAIL_ON(drm_mode_parse_command_line_for_connector("1024x",
0190 &no_connector,
0191 &mode));
0192
0193 return 0;
0194 }
0195
0196 static int drm_cmdline_test_res_bad_y(void *ignored)
0197 {
0198 struct drm_cmdline_mode mode = { };
0199
0200 FAIL_ON(drm_mode_parse_command_line_for_connector("1024xtest",
0201 &no_connector,
0202 &mode));
0203
0204 return 0;
0205 }
0206
0207 static int drm_cmdline_test_res_missing_y_bpp(void *ignored)
0208 {
0209 struct drm_cmdline_mode mode = { };
0210
0211 FAIL_ON(drm_mode_parse_command_line_for_connector("1024x-24",
0212 &no_connector,
0213 &mode));
0214
0215 return 0;
0216 }
0217
0218 static int drm_cmdline_test_res_vesa(void *ignored)
0219 {
0220 struct drm_cmdline_mode mode = { };
0221
0222 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480M",
0223 &no_connector,
0224 &mode));
0225 FAIL_ON(!mode.specified);
0226 FAIL_ON(mode.xres != 720);
0227 FAIL_ON(mode.yres != 480);
0228
0229 FAIL_ON(mode.refresh_specified);
0230
0231 FAIL_ON(mode.bpp_specified);
0232
0233 FAIL_ON(mode.rb);
0234 FAIL_ON(!mode.cvt);
0235 FAIL_ON(mode.interlace);
0236 FAIL_ON(mode.margins);
0237 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0238
0239 return 0;
0240 }
0241
0242 static int drm_cmdline_test_res_vesa_rblank(void *ignored)
0243 {
0244 struct drm_cmdline_mode mode = { };
0245
0246 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480MR",
0247 &no_connector,
0248 &mode));
0249 FAIL_ON(!mode.specified);
0250 FAIL_ON(mode.xres != 720);
0251 FAIL_ON(mode.yres != 480);
0252
0253 FAIL_ON(mode.refresh_specified);
0254
0255 FAIL_ON(mode.bpp_specified);
0256
0257 FAIL_ON(!mode.rb);
0258 FAIL_ON(!mode.cvt);
0259 FAIL_ON(mode.interlace);
0260 FAIL_ON(mode.margins);
0261 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0262
0263 return 0;
0264 }
0265
0266 static int drm_cmdline_test_res_rblank(void *ignored)
0267 {
0268 struct drm_cmdline_mode mode = { };
0269
0270 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480R",
0271 &no_connector,
0272 &mode));
0273 FAIL_ON(!mode.specified);
0274 FAIL_ON(mode.xres != 720);
0275 FAIL_ON(mode.yres != 480);
0276
0277 FAIL_ON(mode.refresh_specified);
0278
0279 FAIL_ON(mode.bpp_specified);
0280
0281 FAIL_ON(!mode.rb);
0282 FAIL_ON(mode.cvt);
0283 FAIL_ON(mode.interlace);
0284 FAIL_ON(mode.margins);
0285 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0286
0287 return 0;
0288 }
0289
0290 static int drm_cmdline_test_res_bpp(void *ignored)
0291 {
0292 struct drm_cmdline_mode mode = { };
0293
0294 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24",
0295 &no_connector,
0296 &mode));
0297 FAIL_ON(!mode.specified);
0298 FAIL_ON(mode.xres != 720);
0299 FAIL_ON(mode.yres != 480);
0300
0301 FAIL_ON(mode.refresh_specified);
0302
0303 FAIL_ON(!mode.bpp_specified);
0304 FAIL_ON(mode.bpp != 24);
0305
0306 FAIL_ON(mode.rb);
0307 FAIL_ON(mode.cvt);
0308 FAIL_ON(mode.interlace);
0309 FAIL_ON(mode.margins);
0310 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0311
0312 return 0;
0313 }
0314
0315 static int drm_cmdline_test_res_bad_bpp(void *ignored)
0316 {
0317 struct drm_cmdline_mode mode = { };
0318
0319 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480-test",
0320 &no_connector,
0321 &mode));
0322
0323 return 0;
0324 }
0325
0326 static int drm_cmdline_test_res_refresh(void *ignored)
0327 {
0328 struct drm_cmdline_mode mode = { };
0329
0330 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480@60",
0331 &no_connector,
0332 &mode));
0333 FAIL_ON(!mode.specified);
0334 FAIL_ON(mode.xres != 720);
0335 FAIL_ON(mode.yres != 480);
0336
0337 FAIL_ON(!mode.refresh_specified);
0338 FAIL_ON(mode.refresh != 60);
0339
0340 FAIL_ON(mode.bpp_specified);
0341
0342 FAIL_ON(mode.rb);
0343 FAIL_ON(mode.cvt);
0344 FAIL_ON(mode.interlace);
0345 FAIL_ON(mode.margins);
0346 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0347
0348 return 0;
0349 }
0350
0351 static int drm_cmdline_test_res_bad_refresh(void *ignored)
0352 {
0353 struct drm_cmdline_mode mode = { };
0354
0355 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480@refresh",
0356 &no_connector,
0357 &mode));
0358
0359 return 0;
0360 }
0361
0362 static int drm_cmdline_test_res_bpp_refresh(void *ignored)
0363 {
0364 struct drm_cmdline_mode mode = { };
0365
0366 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60",
0367 &no_connector,
0368 &mode));
0369 FAIL_ON(!mode.specified);
0370 FAIL_ON(mode.xres != 720);
0371 FAIL_ON(mode.yres != 480);
0372
0373 FAIL_ON(!mode.refresh_specified);
0374 FAIL_ON(mode.refresh != 60);
0375
0376 FAIL_ON(!mode.bpp_specified);
0377 FAIL_ON(mode.bpp != 24);
0378
0379 FAIL_ON(mode.rb);
0380 FAIL_ON(mode.cvt);
0381 FAIL_ON(mode.interlace);
0382 FAIL_ON(mode.margins);
0383 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0384
0385 return 0;
0386 }
0387
0388 static int drm_cmdline_test_res_bpp_refresh_interlaced(void *ignored)
0389 {
0390 struct drm_cmdline_mode mode = { };
0391
0392 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60i",
0393 &no_connector,
0394 &mode));
0395 FAIL_ON(!mode.specified);
0396 FAIL_ON(mode.xres != 720);
0397 FAIL_ON(mode.yres != 480);
0398
0399 FAIL_ON(!mode.refresh_specified);
0400 FAIL_ON(mode.refresh != 60);
0401
0402 FAIL_ON(!mode.bpp_specified);
0403 FAIL_ON(mode.bpp != 24);
0404
0405 FAIL_ON(mode.rb);
0406 FAIL_ON(mode.cvt);
0407 FAIL_ON(!mode.interlace);
0408 FAIL_ON(mode.margins);
0409 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0410
0411 return 0;
0412 }
0413
0414 static int drm_cmdline_test_res_bpp_refresh_margins(void *ignored)
0415 {
0416 struct drm_cmdline_mode mode = { };
0417
0418 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60m",
0419 &no_connector,
0420 &mode));
0421 FAIL_ON(!mode.specified);
0422 FAIL_ON(mode.xres != 720);
0423 FAIL_ON(mode.yres != 480);
0424
0425 FAIL_ON(!mode.refresh_specified);
0426 FAIL_ON(mode.refresh != 60);
0427
0428 FAIL_ON(!mode.bpp_specified);
0429 FAIL_ON(mode.bpp != 24);
0430
0431 FAIL_ON(mode.rb);
0432 FAIL_ON(mode.cvt);
0433 FAIL_ON(mode.interlace);
0434 FAIL_ON(!mode.margins);
0435 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0436
0437 return 0;
0438 }
0439
0440 static int drm_cmdline_test_res_bpp_refresh_force_off(void *ignored)
0441 {
0442 struct drm_cmdline_mode mode = { };
0443
0444 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60d",
0445 &no_connector,
0446 &mode));
0447 FAIL_ON(!mode.specified);
0448 FAIL_ON(mode.xres != 720);
0449 FAIL_ON(mode.yres != 480);
0450
0451 FAIL_ON(!mode.refresh_specified);
0452 FAIL_ON(mode.refresh != 60);
0453
0454 FAIL_ON(!mode.bpp_specified);
0455 FAIL_ON(mode.bpp != 24);
0456
0457 FAIL_ON(mode.rb);
0458 FAIL_ON(mode.cvt);
0459 FAIL_ON(mode.interlace);
0460 FAIL_ON(mode.margins);
0461 FAIL_ON(mode.force != DRM_FORCE_OFF);
0462
0463 return 0;
0464 }
0465
0466 static int drm_cmdline_test_res_bpp_refresh_force_on_off(void *ignored)
0467 {
0468 struct drm_cmdline_mode mode = { };
0469
0470 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480-24@60de",
0471 &no_connector,
0472 &mode));
0473
0474 return 0;
0475 }
0476
0477 static int drm_cmdline_test_res_bpp_refresh_force_on(void *ignored)
0478 {
0479 struct drm_cmdline_mode mode = { };
0480
0481 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60e",
0482 &no_connector,
0483 &mode));
0484 FAIL_ON(!mode.specified);
0485 FAIL_ON(mode.xres != 720);
0486 FAIL_ON(mode.yres != 480);
0487
0488 FAIL_ON(!mode.refresh_specified);
0489 FAIL_ON(mode.refresh != 60);
0490
0491 FAIL_ON(!mode.bpp_specified);
0492 FAIL_ON(mode.bpp != 24);
0493
0494 FAIL_ON(mode.rb);
0495 FAIL_ON(mode.cvt);
0496 FAIL_ON(mode.interlace);
0497 FAIL_ON(mode.margins);
0498 FAIL_ON(mode.force != DRM_FORCE_ON);
0499
0500 return 0;
0501 }
0502
0503 static int drm_cmdline_test_res_bpp_refresh_force_on_analog(void *ignored)
0504 {
0505 struct drm_cmdline_mode mode = { };
0506
0507 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60D",
0508 &no_connector,
0509 &mode));
0510 FAIL_ON(!mode.specified);
0511 FAIL_ON(mode.xres != 720);
0512 FAIL_ON(mode.yres != 480);
0513
0514 FAIL_ON(!mode.refresh_specified);
0515 FAIL_ON(mode.refresh != 60);
0516
0517 FAIL_ON(!mode.bpp_specified);
0518 FAIL_ON(mode.bpp != 24);
0519
0520 FAIL_ON(mode.rb);
0521 FAIL_ON(mode.cvt);
0522 FAIL_ON(mode.interlace);
0523 FAIL_ON(mode.margins);
0524 FAIL_ON(mode.force != DRM_FORCE_ON);
0525
0526 return 0;
0527 }
0528
0529 static int drm_cmdline_test_res_bpp_refresh_force_on_digital(void *ignored)
0530 {
0531 struct drm_cmdline_mode mode = { };
0532 static const struct drm_connector connector = {
0533 .connector_type = DRM_MODE_CONNECTOR_DVII,
0534 };
0535
0536 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60D",
0537 &connector,
0538 &mode));
0539 FAIL_ON(!mode.specified);
0540 FAIL_ON(mode.xres != 720);
0541 FAIL_ON(mode.yres != 480);
0542
0543 FAIL_ON(!mode.refresh_specified);
0544 FAIL_ON(mode.refresh != 60);
0545
0546 FAIL_ON(!mode.bpp_specified);
0547 FAIL_ON(mode.bpp != 24);
0548
0549 FAIL_ON(mode.rb);
0550 FAIL_ON(mode.cvt);
0551 FAIL_ON(mode.interlace);
0552 FAIL_ON(mode.margins);
0553 FAIL_ON(mode.force != DRM_FORCE_ON_DIGITAL);
0554
0555 return 0;
0556 }
0557
0558 static int drm_cmdline_test_res_bpp_refresh_interlaced_margins_force_on(void *ignored)
0559 {
0560 struct drm_cmdline_mode mode = { };
0561
0562 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60ime",
0563 &no_connector,
0564 &mode));
0565 FAIL_ON(!mode.specified);
0566 FAIL_ON(mode.xres != 720);
0567 FAIL_ON(mode.yres != 480);
0568
0569 FAIL_ON(!mode.refresh_specified);
0570 FAIL_ON(mode.refresh != 60);
0571
0572 FAIL_ON(!mode.bpp_specified);
0573 FAIL_ON(mode.bpp != 24);
0574
0575 FAIL_ON(mode.rb);
0576 FAIL_ON(mode.cvt);
0577 FAIL_ON(!mode.interlace);
0578 FAIL_ON(!mode.margins);
0579 FAIL_ON(mode.force != DRM_FORCE_ON);
0580
0581 return 0;
0582 }
0583
0584 static int drm_cmdline_test_res_margins_force_on(void *ignored)
0585 {
0586 struct drm_cmdline_mode mode = { };
0587
0588 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480me",
0589 &no_connector,
0590 &mode));
0591 FAIL_ON(!mode.specified);
0592 FAIL_ON(mode.xres != 720);
0593 FAIL_ON(mode.yres != 480);
0594
0595 FAIL_ON(mode.refresh_specified);
0596
0597 FAIL_ON(mode.bpp_specified);
0598
0599 FAIL_ON(mode.rb);
0600 FAIL_ON(mode.cvt);
0601 FAIL_ON(mode.interlace);
0602 FAIL_ON(!mode.margins);
0603 FAIL_ON(mode.force != DRM_FORCE_ON);
0604
0605 return 0;
0606 }
0607
0608 static int drm_cmdline_test_res_vesa_margins(void *ignored)
0609 {
0610 struct drm_cmdline_mode mode = { };
0611
0612 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480Mm",
0613 &no_connector,
0614 &mode));
0615 FAIL_ON(!mode.specified);
0616 FAIL_ON(mode.xres != 720);
0617 FAIL_ON(mode.yres != 480);
0618
0619 FAIL_ON(mode.refresh_specified);
0620
0621 FAIL_ON(mode.bpp_specified);
0622
0623 FAIL_ON(mode.rb);
0624 FAIL_ON(!mode.cvt);
0625 FAIL_ON(mode.interlace);
0626 FAIL_ON(!mode.margins);
0627 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0628
0629 return 0;
0630 }
0631
0632 static int drm_cmdline_test_res_invalid_mode(void *ignored)
0633 {
0634 struct drm_cmdline_mode mode = { };
0635
0636 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480f",
0637 &no_connector,
0638 &mode));
0639
0640 return 0;
0641 }
0642
0643 static int drm_cmdline_test_res_bpp_wrong_place_mode(void *ignored)
0644 {
0645 struct drm_cmdline_mode mode = { };
0646
0647 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480e-24",
0648 &no_connector,
0649 &mode));
0650
0651 return 0;
0652 }
0653
0654 static int drm_cmdline_test_name(void *ignored)
0655 {
0656 struct drm_cmdline_mode mode = { };
0657
0658 FAIL_ON(!drm_mode_parse_command_line_for_connector("NTSC",
0659 &no_connector,
0660 &mode));
0661 FAIL_ON(strcmp(mode.name, "NTSC"));
0662 FAIL_ON(mode.refresh_specified);
0663 FAIL_ON(mode.bpp_specified);
0664
0665 return 0;
0666 }
0667
0668 static int drm_cmdline_test_name_bpp(void *ignored)
0669 {
0670 struct drm_cmdline_mode mode = { };
0671
0672 FAIL_ON(!drm_mode_parse_command_line_for_connector("NTSC-24",
0673 &no_connector,
0674 &mode));
0675 FAIL_ON(strcmp(mode.name, "NTSC"));
0676
0677 FAIL_ON(mode.refresh_specified);
0678
0679 FAIL_ON(!mode.bpp_specified);
0680 FAIL_ON(mode.bpp != 24);
0681
0682 return 0;
0683 }
0684
0685 static int drm_cmdline_test_name_bpp_refresh(void *ignored)
0686 {
0687 struct drm_cmdline_mode mode = { };
0688
0689 FAIL_ON(drm_mode_parse_command_line_for_connector("NTSC-24@60",
0690 &no_connector,
0691 &mode));
0692
0693 return 0;
0694 }
0695
0696 static int drm_cmdline_test_name_refresh(void *ignored)
0697 {
0698 struct drm_cmdline_mode mode = { };
0699
0700 FAIL_ON(drm_mode_parse_command_line_for_connector("NTSC@60",
0701 &no_connector,
0702 &mode));
0703
0704 return 0;
0705 }
0706
0707 static int drm_cmdline_test_name_refresh_wrong_mode(void *ignored)
0708 {
0709 struct drm_cmdline_mode mode = { };
0710
0711 FAIL_ON(drm_mode_parse_command_line_for_connector("NTSC@60m",
0712 &no_connector,
0713 &mode));
0714
0715 return 0;
0716 }
0717
0718 static int drm_cmdline_test_name_refresh_invalid_mode(void *ignored)
0719 {
0720 struct drm_cmdline_mode mode = { };
0721
0722 FAIL_ON(drm_mode_parse_command_line_for_connector("NTSC@60f",
0723 &no_connector,
0724 &mode));
0725
0726 return 0;
0727 }
0728
0729 static int drm_cmdline_test_name_option(void *ignored)
0730 {
0731 struct drm_cmdline_mode mode = { };
0732
0733 FAIL_ON(!drm_mode_parse_command_line_for_connector("NTSC,rotate=180",
0734 &no_connector,
0735 &mode));
0736 FAIL_ON(!mode.specified);
0737 FAIL_ON(strcmp(mode.name, "NTSC"));
0738 FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
0739
0740 return 0;
0741 }
0742
0743 static int drm_cmdline_test_name_bpp_option(void *ignored)
0744 {
0745 struct drm_cmdline_mode mode = { };
0746
0747 FAIL_ON(!drm_mode_parse_command_line_for_connector("NTSC-24,rotate=180",
0748 &no_connector,
0749 &mode));
0750 FAIL_ON(!mode.specified);
0751 FAIL_ON(strcmp(mode.name, "NTSC"));
0752 FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
0753 FAIL_ON(!mode.bpp_specified);
0754 FAIL_ON(mode.bpp != 24);
0755
0756 return 0;
0757 }
0758
0759 static int drm_cmdline_test_rotate_0(void *ignored)
0760 {
0761 struct drm_cmdline_mode mode = { };
0762
0763 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=0",
0764 &no_connector,
0765 &mode));
0766 FAIL_ON(!mode.specified);
0767 FAIL_ON(mode.xres != 720);
0768 FAIL_ON(mode.yres != 480);
0769 FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_0);
0770
0771 FAIL_ON(mode.refresh_specified);
0772
0773 FAIL_ON(mode.bpp_specified);
0774
0775 FAIL_ON(mode.rb);
0776 FAIL_ON(mode.cvt);
0777 FAIL_ON(mode.interlace);
0778 FAIL_ON(mode.margins);
0779 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0780
0781 return 0;
0782 }
0783
0784 static int drm_cmdline_test_rotate_90(void *ignored)
0785 {
0786 struct drm_cmdline_mode mode = { };
0787
0788 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=90",
0789 &no_connector,
0790 &mode));
0791 FAIL_ON(!mode.specified);
0792 FAIL_ON(mode.xres != 720);
0793 FAIL_ON(mode.yres != 480);
0794 FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_90);
0795
0796 FAIL_ON(mode.refresh_specified);
0797
0798 FAIL_ON(mode.bpp_specified);
0799
0800 FAIL_ON(mode.rb);
0801 FAIL_ON(mode.cvt);
0802 FAIL_ON(mode.interlace);
0803 FAIL_ON(mode.margins);
0804 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0805
0806 return 0;
0807 }
0808
0809 static int drm_cmdline_test_rotate_180(void *ignored)
0810 {
0811 struct drm_cmdline_mode mode = { };
0812
0813 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=180",
0814 &no_connector,
0815 &mode));
0816 FAIL_ON(!mode.specified);
0817 FAIL_ON(mode.xres != 720);
0818 FAIL_ON(mode.yres != 480);
0819 FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
0820
0821 FAIL_ON(mode.refresh_specified);
0822
0823 FAIL_ON(mode.bpp_specified);
0824
0825 FAIL_ON(mode.rb);
0826 FAIL_ON(mode.cvt);
0827 FAIL_ON(mode.interlace);
0828 FAIL_ON(mode.margins);
0829 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0830
0831 return 0;
0832 }
0833
0834 static int drm_cmdline_test_rotate_270(void *ignored)
0835 {
0836 struct drm_cmdline_mode mode = { };
0837
0838 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=270",
0839 &no_connector,
0840 &mode));
0841 FAIL_ON(!mode.specified);
0842 FAIL_ON(mode.xres != 720);
0843 FAIL_ON(mode.yres != 480);
0844 FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_270);
0845
0846 FAIL_ON(mode.refresh_specified);
0847
0848 FAIL_ON(mode.bpp_specified);
0849
0850 FAIL_ON(mode.rb);
0851 FAIL_ON(mode.cvt);
0852 FAIL_ON(mode.interlace);
0853 FAIL_ON(mode.margins);
0854 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0855
0856 return 0;
0857 }
0858
0859 static int drm_cmdline_test_rotate_multiple(void *ignored)
0860 {
0861 struct drm_cmdline_mode mode = { };
0862
0863 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=0,rotate=90",
0864 &no_connector,
0865 &mode));
0866
0867 return 0;
0868 }
0869
0870 static int drm_cmdline_test_rotate_invalid_val(void *ignored)
0871 {
0872 struct drm_cmdline_mode mode = { };
0873
0874 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=42",
0875 &no_connector,
0876 &mode));
0877
0878 return 0;
0879 }
0880
0881 static int drm_cmdline_test_rotate_truncated(void *ignored)
0882 {
0883 struct drm_cmdline_mode mode = { };
0884
0885 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=",
0886 &no_connector,
0887 &mode));
0888
0889 return 0;
0890 }
0891
0892 static int drm_cmdline_test_hmirror(void *ignored)
0893 {
0894 struct drm_cmdline_mode mode = { };
0895
0896 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_x",
0897 &no_connector,
0898 &mode));
0899 FAIL_ON(!mode.specified);
0900 FAIL_ON(mode.xres != 720);
0901 FAIL_ON(mode.yres != 480);
0902 FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_X));
0903
0904 FAIL_ON(mode.refresh_specified);
0905
0906 FAIL_ON(mode.bpp_specified);
0907
0908 FAIL_ON(mode.rb);
0909 FAIL_ON(mode.cvt);
0910 FAIL_ON(mode.interlace);
0911 FAIL_ON(mode.margins);
0912 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0913
0914 return 0;
0915 }
0916
0917 static int drm_cmdline_test_vmirror(void *ignored)
0918 {
0919 struct drm_cmdline_mode mode = { };
0920
0921 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_y",
0922 &no_connector,
0923 &mode));
0924 FAIL_ON(!mode.specified);
0925 FAIL_ON(mode.xres != 720);
0926 FAIL_ON(mode.yres != 480);
0927 FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_Y));
0928
0929 FAIL_ON(mode.refresh_specified);
0930
0931 FAIL_ON(mode.bpp_specified);
0932
0933 FAIL_ON(mode.rb);
0934 FAIL_ON(mode.cvt);
0935 FAIL_ON(mode.interlace);
0936 FAIL_ON(mode.margins);
0937 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0938
0939 return 0;
0940 }
0941
0942 static int drm_cmdline_test_margin_options(void *ignored)
0943 {
0944 struct drm_cmdline_mode mode = { };
0945
0946 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
0947 &no_connector,
0948 &mode));
0949 FAIL_ON(!mode.specified);
0950 FAIL_ON(mode.xres != 720);
0951 FAIL_ON(mode.yres != 480);
0952 FAIL_ON(mode.tv_margins.right != 14);
0953 FAIL_ON(mode.tv_margins.left != 24);
0954 FAIL_ON(mode.tv_margins.bottom != 36);
0955 FAIL_ON(mode.tv_margins.top != 42);
0956
0957 FAIL_ON(mode.refresh_specified);
0958
0959 FAIL_ON(mode.bpp_specified);
0960
0961 FAIL_ON(mode.rb);
0962 FAIL_ON(mode.cvt);
0963 FAIL_ON(mode.interlace);
0964 FAIL_ON(mode.margins);
0965 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0966
0967 return 0;
0968 }
0969
0970 static int drm_cmdline_test_multiple_options(void *ignored)
0971 {
0972 struct drm_cmdline_mode mode = { };
0973
0974 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=270,reflect_x",
0975 &no_connector,
0976 &mode));
0977 FAIL_ON(!mode.specified);
0978 FAIL_ON(mode.xres != 720);
0979 FAIL_ON(mode.yres != 480);
0980 FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_270 | DRM_MODE_REFLECT_X));
0981
0982 FAIL_ON(mode.refresh_specified);
0983
0984 FAIL_ON(mode.bpp_specified);
0985
0986 FAIL_ON(mode.rb);
0987 FAIL_ON(mode.cvt);
0988 FAIL_ON(mode.interlace);
0989 FAIL_ON(mode.margins);
0990 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
0991
0992 return 0;
0993 }
0994
0995 static int drm_cmdline_test_invalid_option(void *ignored)
0996 {
0997 struct drm_cmdline_mode mode = { };
0998
0999 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,test=42",
1000 &no_connector,
1001 &mode));
1002
1003 return 0;
1004 }
1005
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
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
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
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
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
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");