Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (c) 2019 Bootlin
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");