cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

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");