linux/drivers/gpu/drm/selftests/test-drm_cmdline_parser.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (c) 2019 Bootlin
   4 */
   5
   6#define pr_fmt(fmt) "drm_cmdline: " fmt
   7
   8#include <linux/kernel.h>
   9#include <linux/module.h>
  10
  11#include <drm/drm_connector.h>
  12#include <drm/drm_modes.h>
  13
  14#define TESTS "drm_cmdline_selftests.h"
  15#include "drm_selftest.h"
  16#include "test-drm_modeset_common.h"
  17
  18static const struct drm_connector no_connector = {};
  19
  20static int drm_cmdline_test_force_e_only(void *ignored)
  21{
  22        struct drm_cmdline_mode mode = { };
  23
  24        FAIL_ON(!drm_mode_parse_command_line_for_connector("e",
  25                                                           &no_connector,
  26                                                           &mode));
  27        FAIL_ON(mode.specified);
  28        FAIL_ON(mode.refresh_specified);
  29        FAIL_ON(mode.bpp_specified);
  30
  31        FAIL_ON(mode.rb);
  32        FAIL_ON(mode.cvt);
  33        FAIL_ON(mode.interlace);
  34        FAIL_ON(mode.margins);
  35        FAIL_ON(mode.force != DRM_FORCE_ON);
  36
  37        return 0;
  38}
  39
  40static int drm_cmdline_test_force_D_only_not_digital(void *ignored)
  41{
  42        struct drm_cmdline_mode mode = { };
  43
  44        FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
  45                                                           &no_connector,
  46                                                           &mode));
  47        FAIL_ON(mode.specified);
  48        FAIL_ON(mode.refresh_specified);
  49        FAIL_ON(mode.bpp_specified);
  50
  51        FAIL_ON(mode.rb);
  52        FAIL_ON(mode.cvt);
  53        FAIL_ON(mode.interlace);
  54        FAIL_ON(mode.margins);
  55        FAIL_ON(mode.force != DRM_FORCE_ON);
  56
  57        return 0;
  58}
  59
  60static const struct drm_connector connector_hdmi = {
  61        .connector_type = DRM_MODE_CONNECTOR_HDMIB,
  62};
  63
  64static int drm_cmdline_test_force_D_only_hdmi(void *ignored)
  65{
  66        struct drm_cmdline_mode mode = { };
  67
  68        FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
  69                                                           &connector_hdmi,
  70                                                           &mode));
  71        FAIL_ON(mode.specified);
  72        FAIL_ON(mode.refresh_specified);
  73        FAIL_ON(mode.bpp_specified);
  74
  75        FAIL_ON(mode.rb);
  76        FAIL_ON(mode.cvt);
  77        FAIL_ON(mode.interlace);
  78        FAIL_ON(mode.margins);
  79        FAIL_ON(mode.force != DRM_FORCE_ON_DIGITAL);
  80
  81        return 0;
  82}
  83
  84static const struct drm_connector connector_dvi = {
  85        .connector_type = DRM_MODE_CONNECTOR_DVII,
  86};
  87
  88static int drm_cmdline_test_force_D_only_dvi(void *ignored)
  89{
  90        struct drm_cmdline_mode mode = { };
  91
  92        FAIL_ON(!drm_mode_parse_command_line_for_connector("D",
  93                                                           &connector_dvi,
  94                                                           &mode));
  95        FAIL_ON(mode.specified);
  96        FAIL_ON(mode.refresh_specified);
  97        FAIL_ON(mode.bpp_specified);
  98
  99        FAIL_ON(mode.rb);
 100        FAIL_ON(mode.cvt);
 101        FAIL_ON(mode.interlace);
 102        FAIL_ON(mode.margins);
 103        FAIL_ON(mode.force != DRM_FORCE_ON_DIGITAL);
 104
 105        return 0;
 106}
 107
 108static int drm_cmdline_test_force_d_only(void *ignored)
 109{
 110        struct drm_cmdline_mode mode = { };
 111
 112        FAIL_ON(!drm_mode_parse_command_line_for_connector("d",
 113                                                           &no_connector,
 114                                                           &mode));
 115        FAIL_ON(mode.specified);
 116        FAIL_ON(mode.refresh_specified);
 117        FAIL_ON(mode.bpp_specified);
 118
 119        FAIL_ON(mode.rb);
 120        FAIL_ON(mode.cvt);
 121        FAIL_ON(mode.interlace);
 122        FAIL_ON(mode.margins);
 123        FAIL_ON(mode.force != DRM_FORCE_OFF);
 124
 125        return 0;
 126}
 127
 128static int drm_cmdline_test_margin_only(void *ignored)
 129{
 130        struct drm_cmdline_mode mode = { };
 131
 132        FAIL_ON(drm_mode_parse_command_line_for_connector("m",
 133                                                          &no_connector,
 134                                                          &mode));
 135
 136        return 0;
 137}
 138
 139static int drm_cmdline_test_interlace_only(void *ignored)
 140{
 141        struct drm_cmdline_mode mode = { };
 142
 143        FAIL_ON(drm_mode_parse_command_line_for_connector("i",
 144                                                          &no_connector,
 145                                                          &mode));
 146
 147        return 0;
 148}
 149
 150static int drm_cmdline_test_res(void *ignored)
 151{
 152        struct drm_cmdline_mode mode = { };
 153
 154        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480",
 155                                                           &no_connector,
 156                                                           &mode));
 157        FAIL_ON(!mode.specified);
 158        FAIL_ON(mode.xres != 720);
 159        FAIL_ON(mode.yres != 480);
 160
 161        FAIL_ON(mode.refresh_specified);
 162
 163        FAIL_ON(mode.bpp_specified);
 164
 165        FAIL_ON(mode.rb);
 166        FAIL_ON(mode.cvt);
 167        FAIL_ON(mode.interlace);
 168        FAIL_ON(mode.margins);
 169        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 170
 171        return 0;
 172}
 173
 174static int drm_cmdline_test_res_missing_x(void *ignored)
 175{
 176        struct drm_cmdline_mode mode = { };
 177
 178        FAIL_ON(drm_mode_parse_command_line_for_connector("x480",
 179                                                          &no_connector,
 180                                                          &mode));
 181
 182        return 0;
 183}
 184
 185static int drm_cmdline_test_res_missing_y(void *ignored)
 186{
 187        struct drm_cmdline_mode mode = { };
 188
 189        FAIL_ON(drm_mode_parse_command_line_for_connector("1024x",
 190                                                          &no_connector,
 191                                                          &mode));
 192
 193        return 0;
 194}
 195
 196static int drm_cmdline_test_res_bad_y(void *ignored)
 197{
 198        struct drm_cmdline_mode mode = { };
 199
 200        FAIL_ON(drm_mode_parse_command_line_for_connector("1024xtest",
 201                                                          &no_connector,
 202                                                          &mode));
 203
 204        return 0;
 205}
 206
 207static int drm_cmdline_test_res_missing_y_bpp(void *ignored)
 208{
 209        struct drm_cmdline_mode mode = { };
 210
 211        FAIL_ON(drm_mode_parse_command_line_for_connector("1024x-24",
 212                                                          &no_connector,
 213                                                          &mode));
 214
 215        return 0;
 216}
 217
 218static int drm_cmdline_test_res_vesa(void *ignored)
 219{
 220        struct drm_cmdline_mode mode = { };
 221
 222        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480M",
 223                                                           &no_connector,
 224                                                           &mode));
 225        FAIL_ON(!mode.specified);
 226        FAIL_ON(mode.xres != 720);
 227        FAIL_ON(mode.yres != 480);
 228
 229        FAIL_ON(mode.refresh_specified);
 230
 231        FAIL_ON(mode.bpp_specified);
 232
 233        FAIL_ON(mode.rb);
 234        FAIL_ON(!mode.cvt);
 235        FAIL_ON(mode.interlace);
 236        FAIL_ON(mode.margins);
 237        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 238
 239        return 0;
 240}
 241
 242static int drm_cmdline_test_res_vesa_rblank(void *ignored)
 243{
 244        struct drm_cmdline_mode mode = { };
 245
 246        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480MR",
 247                                                           &no_connector,
 248                                                           &mode));
 249        FAIL_ON(!mode.specified);
 250        FAIL_ON(mode.xres != 720);
 251        FAIL_ON(mode.yres != 480);
 252
 253        FAIL_ON(mode.refresh_specified);
 254
 255        FAIL_ON(mode.bpp_specified);
 256
 257        FAIL_ON(!mode.rb);
 258        FAIL_ON(!mode.cvt);
 259        FAIL_ON(mode.interlace);
 260        FAIL_ON(mode.margins);
 261        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 262
 263        return 0;
 264}
 265
 266static int drm_cmdline_test_res_rblank(void *ignored)
 267{
 268        struct drm_cmdline_mode mode = { };
 269
 270        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480R",
 271                                                           &no_connector,
 272                                                           &mode));
 273        FAIL_ON(!mode.specified);
 274        FAIL_ON(mode.xres != 720);
 275        FAIL_ON(mode.yres != 480);
 276
 277        FAIL_ON(mode.refresh_specified);
 278
 279        FAIL_ON(mode.bpp_specified);
 280
 281        FAIL_ON(!mode.rb);
 282        FAIL_ON(mode.cvt);
 283        FAIL_ON(mode.interlace);
 284        FAIL_ON(mode.margins);
 285        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 286
 287        return 0;
 288}
 289
 290static int drm_cmdline_test_res_bpp(void *ignored)
 291{
 292        struct drm_cmdline_mode mode = { };
 293
 294        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24",
 295                                                           &no_connector,
 296                                                           &mode));
 297        FAIL_ON(!mode.specified);
 298        FAIL_ON(mode.xres != 720);
 299        FAIL_ON(mode.yres != 480);
 300
 301        FAIL_ON(mode.refresh_specified);
 302
 303        FAIL_ON(!mode.bpp_specified);
 304        FAIL_ON(mode.bpp != 24);
 305
 306        FAIL_ON(mode.rb);
 307        FAIL_ON(mode.cvt);
 308        FAIL_ON(mode.interlace);
 309        FAIL_ON(mode.margins);
 310        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 311
 312        return 0;
 313}
 314
 315static int drm_cmdline_test_res_bad_bpp(void *ignored)
 316{
 317        struct drm_cmdline_mode mode = { };
 318
 319        FAIL_ON(drm_mode_parse_command_line_for_connector("720x480-test",
 320                                                          &no_connector,
 321                                                          &mode));
 322
 323        return 0;
 324}
 325
 326static int drm_cmdline_test_res_refresh(void *ignored)
 327{
 328        struct drm_cmdline_mode mode = { };
 329
 330        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480@60",
 331                                                           &no_connector,
 332                                                           &mode));
 333        FAIL_ON(!mode.specified);
 334        FAIL_ON(mode.xres != 720);
 335        FAIL_ON(mode.yres != 480);
 336
 337        FAIL_ON(!mode.refresh_specified);
 338        FAIL_ON(mode.refresh != 60);
 339
 340        FAIL_ON(mode.bpp_specified);
 341
 342        FAIL_ON(mode.rb);
 343        FAIL_ON(mode.cvt);
 344        FAIL_ON(mode.interlace);
 345        FAIL_ON(mode.margins);
 346        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 347
 348        return 0;
 349}
 350
 351static int drm_cmdline_test_res_bad_refresh(void *ignored)
 352{
 353        struct drm_cmdline_mode mode = { };
 354
 355        FAIL_ON(drm_mode_parse_command_line_for_connector("720x480@refresh",
 356                                                          &no_connector,
 357                                                          &mode));
 358
 359        return 0;
 360}
 361
 362static int drm_cmdline_test_res_bpp_refresh(void *ignored)
 363{
 364        struct drm_cmdline_mode mode = { };
 365
 366        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60",
 367                                                           &no_connector,
 368                                                           &mode));
 369        FAIL_ON(!mode.specified);
 370        FAIL_ON(mode.xres != 720);
 371        FAIL_ON(mode.yres != 480);
 372
 373        FAIL_ON(!mode.refresh_specified);
 374        FAIL_ON(mode.refresh != 60);
 375
 376        FAIL_ON(!mode.bpp_specified);
 377        FAIL_ON(mode.bpp != 24);
 378
 379        FAIL_ON(mode.rb);
 380        FAIL_ON(mode.cvt);
 381        FAIL_ON(mode.interlace);
 382        FAIL_ON(mode.margins);
 383        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 384
 385        return 0;
 386}
 387
 388static int drm_cmdline_test_res_bpp_refresh_interlaced(void *ignored)
 389{
 390        struct drm_cmdline_mode mode = { };
 391
 392        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60i",
 393                                                           &no_connector,
 394                                                           &mode));
 395        FAIL_ON(!mode.specified);
 396        FAIL_ON(mode.xres != 720);
 397        FAIL_ON(mode.yres != 480);
 398
 399        FAIL_ON(!mode.refresh_specified);
 400        FAIL_ON(mode.refresh != 60);
 401
 402        FAIL_ON(!mode.bpp_specified);
 403        FAIL_ON(mode.bpp != 24);
 404
 405        FAIL_ON(mode.rb);
 406        FAIL_ON(mode.cvt);
 407        FAIL_ON(!mode.interlace);
 408        FAIL_ON(mode.margins);
 409        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 410
 411        return 0;
 412}
 413
 414static int drm_cmdline_test_res_bpp_refresh_margins(void *ignored)
 415{
 416        struct drm_cmdline_mode mode = { };
 417
 418        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60m",
 419                                                           &no_connector,
 420                                                           &mode));
 421        FAIL_ON(!mode.specified);
 422        FAIL_ON(mode.xres != 720);
 423        FAIL_ON(mode.yres != 480);
 424
 425        FAIL_ON(!mode.refresh_specified);
 426        FAIL_ON(mode.refresh != 60);
 427
 428        FAIL_ON(!mode.bpp_specified);
 429        FAIL_ON(mode.bpp != 24);
 430
 431        FAIL_ON(mode.rb);
 432        FAIL_ON(mode.cvt);
 433        FAIL_ON(mode.interlace);
 434        FAIL_ON(!mode.margins);
 435        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 436
 437        return 0;
 438}
 439
 440static int drm_cmdline_test_res_bpp_refresh_force_off(void *ignored)
 441{
 442        struct drm_cmdline_mode mode = { };
 443
 444        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60d",
 445                                                           &no_connector,
 446                                                           &mode));
 447        FAIL_ON(!mode.specified);
 448        FAIL_ON(mode.xres != 720);
 449        FAIL_ON(mode.yres != 480);
 450
 451        FAIL_ON(!mode.refresh_specified);
 452        FAIL_ON(mode.refresh != 60);
 453
 454        FAIL_ON(!mode.bpp_specified);
 455        FAIL_ON(mode.bpp != 24);
 456
 457        FAIL_ON(mode.rb);
 458        FAIL_ON(mode.cvt);
 459        FAIL_ON(mode.interlace);
 460        FAIL_ON(mode.margins);
 461        FAIL_ON(mode.force != DRM_FORCE_OFF);
 462
 463        return 0;
 464}
 465
 466static int drm_cmdline_test_res_bpp_refresh_force_on_off(void *ignored)
 467{
 468        struct drm_cmdline_mode mode = { };
 469
 470        FAIL_ON(drm_mode_parse_command_line_for_connector("720x480-24@60de",
 471                                                          &no_connector,
 472                                                          &mode));
 473
 474        return 0;
 475}
 476
 477static int drm_cmdline_test_res_bpp_refresh_force_on(void *ignored)
 478{
 479        struct drm_cmdline_mode mode = { };
 480
 481        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60e",
 482                                                           &no_connector,
 483                                                           &mode));
 484        FAIL_ON(!mode.specified);
 485        FAIL_ON(mode.xres != 720);
 486        FAIL_ON(mode.yres != 480);
 487
 488        FAIL_ON(!mode.refresh_specified);
 489        FAIL_ON(mode.refresh != 60);
 490
 491        FAIL_ON(!mode.bpp_specified);
 492        FAIL_ON(mode.bpp != 24);
 493
 494        FAIL_ON(mode.rb);
 495        FAIL_ON(mode.cvt);
 496        FAIL_ON(mode.interlace);
 497        FAIL_ON(mode.margins);
 498        FAIL_ON(mode.force != DRM_FORCE_ON);
 499
 500        return 0;
 501}
 502
 503static int drm_cmdline_test_res_bpp_refresh_force_on_analog(void *ignored)
 504{
 505        struct drm_cmdline_mode mode = { };
 506
 507        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60D",
 508                                                           &no_connector,
 509                                                           &mode));
 510        FAIL_ON(!mode.specified);
 511        FAIL_ON(mode.xres != 720);
 512        FAIL_ON(mode.yres != 480);
 513
 514        FAIL_ON(!mode.refresh_specified);
 515        FAIL_ON(mode.refresh != 60);
 516
 517        FAIL_ON(!mode.bpp_specified);
 518        FAIL_ON(mode.bpp != 24);
 519
 520        FAIL_ON(mode.rb);
 521        FAIL_ON(mode.cvt);
 522        FAIL_ON(mode.interlace);
 523        FAIL_ON(mode.margins);
 524        FAIL_ON(mode.force != DRM_FORCE_ON);
 525
 526        return 0;
 527}
 528
 529static int drm_cmdline_test_res_bpp_refresh_force_on_digital(void *ignored)
 530{
 531        struct drm_cmdline_mode mode = { };
 532        static const struct drm_connector connector = {
 533                .connector_type = DRM_MODE_CONNECTOR_DVII,
 534        };
 535
 536        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60D",
 537                                                           &connector,
 538                                                           &mode));
 539        FAIL_ON(!mode.specified);
 540        FAIL_ON(mode.xres != 720);
 541        FAIL_ON(mode.yres != 480);
 542
 543        FAIL_ON(!mode.refresh_specified);
 544        FAIL_ON(mode.refresh != 60);
 545
 546        FAIL_ON(!mode.bpp_specified);
 547        FAIL_ON(mode.bpp != 24);
 548
 549        FAIL_ON(mode.rb);
 550        FAIL_ON(mode.cvt);
 551        FAIL_ON(mode.interlace);
 552        FAIL_ON(mode.margins);
 553        FAIL_ON(mode.force != DRM_FORCE_ON_DIGITAL);
 554
 555        return 0;
 556}
 557
 558static int drm_cmdline_test_res_bpp_refresh_interlaced_margins_force_on(void *ignored)
 559{
 560        struct drm_cmdline_mode mode = { };
 561
 562        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480-24@60ime",
 563                                                           &no_connector,
 564                                                           &mode));
 565        FAIL_ON(!mode.specified);
 566        FAIL_ON(mode.xres != 720);
 567        FAIL_ON(mode.yres != 480);
 568
 569        FAIL_ON(!mode.refresh_specified);
 570        FAIL_ON(mode.refresh != 60);
 571
 572        FAIL_ON(!mode.bpp_specified);
 573        FAIL_ON(mode.bpp != 24);
 574
 575        FAIL_ON(mode.rb);
 576        FAIL_ON(mode.cvt);
 577        FAIL_ON(!mode.interlace);
 578        FAIL_ON(!mode.margins);
 579        FAIL_ON(mode.force != DRM_FORCE_ON);
 580
 581        return 0;
 582}
 583
 584static int drm_cmdline_test_res_margins_force_on(void *ignored)
 585{
 586        struct drm_cmdline_mode mode = { };
 587
 588        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480me",
 589                                                           &no_connector,
 590                                                           &mode));
 591        FAIL_ON(!mode.specified);
 592        FAIL_ON(mode.xres != 720);
 593        FAIL_ON(mode.yres != 480);
 594
 595        FAIL_ON(mode.refresh_specified);
 596
 597        FAIL_ON(mode.bpp_specified);
 598
 599        FAIL_ON(mode.rb);
 600        FAIL_ON(mode.cvt);
 601        FAIL_ON(mode.interlace);
 602        FAIL_ON(!mode.margins);
 603        FAIL_ON(mode.force != DRM_FORCE_ON);
 604
 605        return 0;
 606}
 607
 608static int drm_cmdline_test_res_vesa_margins(void *ignored)
 609{
 610        struct drm_cmdline_mode mode = { };
 611
 612        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480Mm",
 613                                                           &no_connector,
 614                                                           &mode));
 615        FAIL_ON(!mode.specified);
 616        FAIL_ON(mode.xres != 720);
 617        FAIL_ON(mode.yres != 480);
 618
 619        FAIL_ON(mode.refresh_specified);
 620
 621        FAIL_ON(mode.bpp_specified);
 622
 623        FAIL_ON(mode.rb);
 624        FAIL_ON(!mode.cvt);
 625        FAIL_ON(mode.interlace);
 626        FAIL_ON(!mode.margins);
 627        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 628
 629        return 0;
 630}
 631
 632static int drm_cmdline_test_res_invalid_mode(void *ignored)
 633{
 634        struct drm_cmdline_mode mode = { };
 635
 636        FAIL_ON(drm_mode_parse_command_line_for_connector("720x480f",
 637                                                          &no_connector,
 638                                                          &mode));
 639
 640        return 0;
 641}
 642
 643static int drm_cmdline_test_res_bpp_wrong_place_mode(void *ignored)
 644{
 645        struct drm_cmdline_mode mode = { };
 646
 647        FAIL_ON(drm_mode_parse_command_line_for_connector("720x480e-24",
 648                                                          &no_connector,
 649                                                          &mode));
 650
 651        return 0;
 652}
 653
 654static int drm_cmdline_test_name(void *ignored)
 655{
 656        struct drm_cmdline_mode mode = { };
 657
 658        FAIL_ON(!drm_mode_parse_command_line_for_connector("NTSC",
 659                                                           &no_connector,
 660                                                           &mode));
 661        FAIL_ON(strcmp(mode.name, "NTSC"));
 662        FAIL_ON(mode.refresh_specified);
 663        FAIL_ON(mode.bpp_specified);
 664
 665        return 0;
 666}
 667
 668static int drm_cmdline_test_name_bpp(void *ignored)
 669{
 670        struct drm_cmdline_mode mode = { };
 671
 672        FAIL_ON(!drm_mode_parse_command_line_for_connector("NTSC-24",
 673                                                           &no_connector,
 674                                                           &mode));
 675        FAIL_ON(strcmp(mode.name, "NTSC"));
 676
 677        FAIL_ON(mode.refresh_specified);
 678
 679        FAIL_ON(!mode.bpp_specified);
 680        FAIL_ON(mode.bpp != 24);
 681
 682        return 0;
 683}
 684
 685static int drm_cmdline_test_name_bpp_refresh(void *ignored)
 686{
 687        struct drm_cmdline_mode mode = { };
 688
 689        FAIL_ON(drm_mode_parse_command_line_for_connector("NTSC-24@60",
 690                                                          &no_connector,
 691                                                          &mode));
 692
 693        return 0;
 694}
 695
 696static int drm_cmdline_test_name_refresh(void *ignored)
 697{
 698        struct drm_cmdline_mode mode = { };
 699
 700        FAIL_ON(drm_mode_parse_command_line_for_connector("NTSC@60",
 701                                                          &no_connector,
 702                                                          &mode));
 703
 704        return 0;
 705}
 706
 707static int drm_cmdline_test_name_refresh_wrong_mode(void *ignored)
 708{
 709        struct drm_cmdline_mode mode = { };
 710
 711        FAIL_ON(drm_mode_parse_command_line_for_connector("NTSC@60m",
 712                                                          &no_connector,
 713                                                          &mode));
 714
 715        return 0;
 716}
 717
 718static int drm_cmdline_test_name_refresh_invalid_mode(void *ignored)
 719{
 720        struct drm_cmdline_mode mode = { };
 721
 722        FAIL_ON(drm_mode_parse_command_line_for_connector("NTSC@60f",
 723                                                          &no_connector,
 724                                                          &mode));
 725
 726        return 0;
 727}
 728
 729static int drm_cmdline_test_name_option(void *ignored)
 730{
 731        struct drm_cmdline_mode mode = { };
 732
 733        FAIL_ON(!drm_mode_parse_command_line_for_connector("NTSC,rotate=180",
 734                                                           &no_connector,
 735                                                           &mode));
 736        FAIL_ON(!mode.specified);
 737        FAIL_ON(strcmp(mode.name, "NTSC"));
 738        FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
 739
 740        return 0;
 741}
 742
 743static int drm_cmdline_test_name_bpp_option(void *ignored)
 744{
 745        struct drm_cmdline_mode mode = { };
 746
 747        FAIL_ON(!drm_mode_parse_command_line_for_connector("NTSC-24,rotate=180",
 748                                                           &no_connector,
 749                                                           &mode));
 750        FAIL_ON(!mode.specified);
 751        FAIL_ON(strcmp(mode.name, "NTSC"));
 752        FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
 753        FAIL_ON(!mode.bpp_specified);
 754        FAIL_ON(mode.bpp != 24);
 755
 756        return 0;
 757}
 758
 759static int drm_cmdline_test_rotate_0(void *ignored)
 760{
 761        struct drm_cmdline_mode mode = { };
 762
 763        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=0",
 764                                                           &no_connector,
 765                                                           &mode));
 766        FAIL_ON(!mode.specified);
 767        FAIL_ON(mode.xres != 720);
 768        FAIL_ON(mode.yres != 480);
 769        FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_0);
 770
 771        FAIL_ON(mode.refresh_specified);
 772
 773        FAIL_ON(mode.bpp_specified);
 774
 775        FAIL_ON(mode.rb);
 776        FAIL_ON(mode.cvt);
 777        FAIL_ON(mode.interlace);
 778        FAIL_ON(mode.margins);
 779        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 780
 781        return 0;
 782}
 783
 784static int drm_cmdline_test_rotate_90(void *ignored)
 785{
 786        struct drm_cmdline_mode mode = { };
 787
 788        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=90",
 789                                                           &no_connector,
 790                                                           &mode));
 791        FAIL_ON(!mode.specified);
 792        FAIL_ON(mode.xres != 720);
 793        FAIL_ON(mode.yres != 480);
 794        FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_90);
 795
 796        FAIL_ON(mode.refresh_specified);
 797
 798        FAIL_ON(mode.bpp_specified);
 799
 800        FAIL_ON(mode.rb);
 801        FAIL_ON(mode.cvt);
 802        FAIL_ON(mode.interlace);
 803        FAIL_ON(mode.margins);
 804        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 805
 806        return 0;
 807}
 808
 809static int drm_cmdline_test_rotate_180(void *ignored)
 810{
 811        struct drm_cmdline_mode mode = { };
 812
 813        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=180",
 814                                                           &no_connector,
 815                                                           &mode));
 816        FAIL_ON(!mode.specified);
 817        FAIL_ON(mode.xres != 720);
 818        FAIL_ON(mode.yres != 480);
 819        FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_180);
 820
 821        FAIL_ON(mode.refresh_specified);
 822
 823        FAIL_ON(mode.bpp_specified);
 824
 825        FAIL_ON(mode.rb);
 826        FAIL_ON(mode.cvt);
 827        FAIL_ON(mode.interlace);
 828        FAIL_ON(mode.margins);
 829        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 830
 831        return 0;
 832}
 833
 834static int drm_cmdline_test_rotate_270(void *ignored)
 835{
 836        struct drm_cmdline_mode mode = { };
 837
 838        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=270",
 839                                                           &no_connector,
 840                                                           &mode));
 841        FAIL_ON(!mode.specified);
 842        FAIL_ON(mode.xres != 720);
 843        FAIL_ON(mode.yres != 480);
 844        FAIL_ON(mode.rotation_reflection != DRM_MODE_ROTATE_270);
 845
 846        FAIL_ON(mode.refresh_specified);
 847
 848        FAIL_ON(mode.bpp_specified);
 849
 850        FAIL_ON(mode.rb);
 851        FAIL_ON(mode.cvt);
 852        FAIL_ON(mode.interlace);
 853        FAIL_ON(mode.margins);
 854        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 855
 856        return 0;
 857}
 858
 859static int drm_cmdline_test_rotate_invalid_val(void *ignored)
 860{
 861        struct drm_cmdline_mode mode = { };
 862
 863        FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=42",
 864                                                          &no_connector,
 865                                                          &mode));
 866
 867        return 0;
 868}
 869
 870static int drm_cmdline_test_rotate_truncated(void *ignored)
 871{
 872        struct drm_cmdline_mode mode = { };
 873
 874        FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=",
 875                                                          &no_connector,
 876                                                          &mode));
 877
 878        return 0;
 879}
 880
 881static int drm_cmdline_test_hmirror(void *ignored)
 882{
 883        struct drm_cmdline_mode mode = { };
 884
 885        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_x",
 886                                                           &no_connector,
 887                                                           &mode));
 888        FAIL_ON(!mode.specified);
 889        FAIL_ON(mode.xres != 720);
 890        FAIL_ON(mode.yres != 480);
 891        FAIL_ON(mode.rotation_reflection != DRM_MODE_REFLECT_X);
 892
 893        FAIL_ON(mode.refresh_specified);
 894
 895        FAIL_ON(mode.bpp_specified);
 896
 897        FAIL_ON(mode.rb);
 898        FAIL_ON(mode.cvt);
 899        FAIL_ON(mode.interlace);
 900        FAIL_ON(mode.margins);
 901        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 902
 903        return 0;
 904}
 905
 906static int drm_cmdline_test_vmirror(void *ignored)
 907{
 908        struct drm_cmdline_mode mode = { };
 909
 910        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_y",
 911                                                           &no_connector,
 912                                                           &mode));
 913        FAIL_ON(!mode.specified);
 914        FAIL_ON(mode.xres != 720);
 915        FAIL_ON(mode.yres != 480);
 916        FAIL_ON(mode.rotation_reflection != DRM_MODE_REFLECT_Y);
 917
 918        FAIL_ON(mode.refresh_specified);
 919
 920        FAIL_ON(mode.bpp_specified);
 921
 922        FAIL_ON(mode.rb);
 923        FAIL_ON(mode.cvt);
 924        FAIL_ON(mode.interlace);
 925        FAIL_ON(mode.margins);
 926        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 927
 928        return 0;
 929}
 930
 931static int drm_cmdline_test_margin_options(void *ignored)
 932{
 933        struct drm_cmdline_mode mode = { };
 934
 935        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42",
 936                                                           &no_connector,
 937                                                           &mode));
 938        FAIL_ON(!mode.specified);
 939        FAIL_ON(mode.xres != 720);
 940        FAIL_ON(mode.yres != 480);
 941        FAIL_ON(mode.tv_margins.right != 14);
 942        FAIL_ON(mode.tv_margins.left != 24);
 943        FAIL_ON(mode.tv_margins.bottom != 36);
 944        FAIL_ON(mode.tv_margins.top != 42);
 945
 946        FAIL_ON(mode.refresh_specified);
 947
 948        FAIL_ON(mode.bpp_specified);
 949
 950        FAIL_ON(mode.rb);
 951        FAIL_ON(mode.cvt);
 952        FAIL_ON(mode.interlace);
 953        FAIL_ON(mode.margins);
 954        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 955
 956        return 0;
 957}
 958
 959static int drm_cmdline_test_multiple_options(void *ignored)
 960{
 961        struct drm_cmdline_mode mode = { };
 962
 963        FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=270,reflect_x",
 964                                                           &no_connector,
 965                                                           &mode));
 966        FAIL_ON(!mode.specified);
 967        FAIL_ON(mode.xres != 720);
 968        FAIL_ON(mode.yres != 480);
 969        FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_270 | DRM_MODE_REFLECT_X));
 970
 971        FAIL_ON(mode.refresh_specified);
 972
 973        FAIL_ON(mode.bpp_specified);
 974
 975        FAIL_ON(mode.rb);
 976        FAIL_ON(mode.cvt);
 977        FAIL_ON(mode.interlace);
 978        FAIL_ON(mode.margins);
 979        FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED);
 980
 981        return 0;
 982}
 983
 984static int drm_cmdline_test_invalid_option(void *ignored)
 985{
 986        struct drm_cmdline_mode mode = { };
 987
 988        FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,test=42",
 989                                                          &no_connector,
 990                                                          &mode));
 991
 992        return 0;
 993}
 994
 995#include "drm_selftest.c"
 996
 997static int __init test_drm_cmdline_init(void)
 998{
 999        int err;
1000
1001        err = run_selftests(selftests, ARRAY_SIZE(selftests), NULL);
1002
1003        return err > 0 ? 0 : err;
1004}
1005module_init(test_drm_cmdline_init);
1006
1007MODULE_AUTHOR("Maxime Ripard <maxime.ripard@bootlin.com>");
1008MODULE_LICENSE("GPL");
1009