test-drm_cmdline_parser.c (25391B)
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_multiple(void *ignored) 860{ 861 struct drm_cmdline_mode mode = { }; 862 863 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=0,rotate=90", 864 &no_connector, 865 &mode)); 866 867 return 0; 868} 869 870static int drm_cmdline_test_rotate_invalid_val(void *ignored) 871{ 872 struct drm_cmdline_mode mode = { }; 873 874 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=42", 875 &no_connector, 876 &mode)); 877 878 return 0; 879} 880 881static int drm_cmdline_test_rotate_truncated(void *ignored) 882{ 883 struct drm_cmdline_mode mode = { }; 884 885 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,rotate=", 886 &no_connector, 887 &mode)); 888 889 return 0; 890} 891 892static int drm_cmdline_test_hmirror(void *ignored) 893{ 894 struct drm_cmdline_mode mode = { }; 895 896 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_x", 897 &no_connector, 898 &mode)); 899 FAIL_ON(!mode.specified); 900 FAIL_ON(mode.xres != 720); 901 FAIL_ON(mode.yres != 480); 902 FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_X)); 903 904 FAIL_ON(mode.refresh_specified); 905 906 FAIL_ON(mode.bpp_specified); 907 908 FAIL_ON(mode.rb); 909 FAIL_ON(mode.cvt); 910 FAIL_ON(mode.interlace); 911 FAIL_ON(mode.margins); 912 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED); 913 914 return 0; 915} 916 917static int drm_cmdline_test_vmirror(void *ignored) 918{ 919 struct drm_cmdline_mode mode = { }; 920 921 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,reflect_y", 922 &no_connector, 923 &mode)); 924 FAIL_ON(!mode.specified); 925 FAIL_ON(mode.xres != 720); 926 FAIL_ON(mode.yres != 480); 927 FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_Y)); 928 929 FAIL_ON(mode.refresh_specified); 930 931 FAIL_ON(mode.bpp_specified); 932 933 FAIL_ON(mode.rb); 934 FAIL_ON(mode.cvt); 935 FAIL_ON(mode.interlace); 936 FAIL_ON(mode.margins); 937 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED); 938 939 return 0; 940} 941 942static int drm_cmdline_test_margin_options(void *ignored) 943{ 944 struct drm_cmdline_mode mode = { }; 945 946 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42", 947 &no_connector, 948 &mode)); 949 FAIL_ON(!mode.specified); 950 FAIL_ON(mode.xres != 720); 951 FAIL_ON(mode.yres != 480); 952 FAIL_ON(mode.tv_margins.right != 14); 953 FAIL_ON(mode.tv_margins.left != 24); 954 FAIL_ON(mode.tv_margins.bottom != 36); 955 FAIL_ON(mode.tv_margins.top != 42); 956 957 FAIL_ON(mode.refresh_specified); 958 959 FAIL_ON(mode.bpp_specified); 960 961 FAIL_ON(mode.rb); 962 FAIL_ON(mode.cvt); 963 FAIL_ON(mode.interlace); 964 FAIL_ON(mode.margins); 965 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED); 966 967 return 0; 968} 969 970static int drm_cmdline_test_multiple_options(void *ignored) 971{ 972 struct drm_cmdline_mode mode = { }; 973 974 FAIL_ON(!drm_mode_parse_command_line_for_connector("720x480,rotate=270,reflect_x", 975 &no_connector, 976 &mode)); 977 FAIL_ON(!mode.specified); 978 FAIL_ON(mode.xres != 720); 979 FAIL_ON(mode.yres != 480); 980 FAIL_ON(mode.rotation_reflection != (DRM_MODE_ROTATE_270 | DRM_MODE_REFLECT_X)); 981 982 FAIL_ON(mode.refresh_specified); 983 984 FAIL_ON(mode.bpp_specified); 985 986 FAIL_ON(mode.rb); 987 FAIL_ON(mode.cvt); 988 FAIL_ON(mode.interlace); 989 FAIL_ON(mode.margins); 990 FAIL_ON(mode.force != DRM_FORCE_UNSPECIFIED); 991 992 return 0; 993} 994 995static int drm_cmdline_test_invalid_option(void *ignored) 996{ 997 struct drm_cmdline_mode mode = { }; 998 999 FAIL_ON(drm_mode_parse_command_line_for_connector("720x480,test=42", 1000 &no_connector, 1001 &mode)); 1002 1003 return 0; 1004} 1005 1006static 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 1032static 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 1056static 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 1081static 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 1106static 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 1130static 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} 1138module_init(test_drm_cmdline_init); 1139 1140MODULE_AUTHOR("Maxime Ripard <maxime.ripard@bootlin.com>"); 1141MODULE_LICENSE("GPL");