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