19f0527d2SMaíra Canal // SPDX-License-Identifier: GPL-2.0
29f0527d2SMaíra Canal /*
39f0527d2SMaíra Canal  * Copyright (c) 2019 Bootlin
49f0527d2SMaíra Canal  * Copyright (c) 2022 Maíra Canal <mairacanal@riseup.net>
59f0527d2SMaíra Canal  */
69f0527d2SMaíra Canal 
79f0527d2SMaíra Canal #include <kunit/test.h>
89f0527d2SMaíra Canal 
99f0527d2SMaíra Canal #include <drm/drm_connector.h>
109f0527d2SMaíra Canal #include <drm/drm_modes.h>
119f0527d2SMaíra Canal 
129f0527d2SMaíra Canal static const struct drm_connector no_connector = {};
139f0527d2SMaíra Canal 
drm_test_cmdline_force_e_only(struct kunit * test)14961bcdf9SMaíra Canal static void drm_test_cmdline_force_e_only(struct kunit *test)
159f0527d2SMaíra Canal {
169f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
179f0527d2SMaíra Canal 	const char *cmdline = "e";
189f0527d2SMaíra Canal 
19169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
209f0527d2SMaíra Canal 									  &no_connector, &mode));
219f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.specified);
229f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
239f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
249f0527d2SMaíra Canal 
259f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
269f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
279f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
289f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
299f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
309f0527d2SMaíra Canal }
319f0527d2SMaíra Canal 
drm_test_cmdline_force_D_only_not_digital(struct kunit * test)32961bcdf9SMaíra Canal static void drm_test_cmdline_force_D_only_not_digital(struct kunit *test)
339f0527d2SMaíra Canal {
349f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
359f0527d2SMaíra Canal 	const char *cmdline = "D";
369f0527d2SMaíra Canal 
37169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
389f0527d2SMaíra Canal 									  &no_connector, &mode));
399f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.specified);
409f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
419f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
429f0527d2SMaíra Canal 
439f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
449f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
459f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
469f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
479f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
489f0527d2SMaíra Canal }
499f0527d2SMaíra Canal 
509f0527d2SMaíra Canal static const struct drm_connector connector_hdmi = {
519f0527d2SMaíra Canal 	.connector_type	= DRM_MODE_CONNECTOR_HDMIB,
529f0527d2SMaíra Canal };
539f0527d2SMaíra Canal 
drm_test_cmdline_force_D_only_hdmi(struct kunit * test)54961bcdf9SMaíra Canal static void drm_test_cmdline_force_D_only_hdmi(struct kunit *test)
559f0527d2SMaíra Canal {
569f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
579f0527d2SMaíra Canal 	const char *cmdline = "D";
589f0527d2SMaíra Canal 
59169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
609f0527d2SMaíra Canal 									  &connector_hdmi, &mode));
619f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.specified);
629f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
639f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
649f0527d2SMaíra Canal 
659f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
669f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
679f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
689f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
699f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON_DIGITAL);
709f0527d2SMaíra Canal }
719f0527d2SMaíra Canal 
729f0527d2SMaíra Canal static const struct drm_connector connector_dvi = {
739f0527d2SMaíra Canal 	.connector_type	= DRM_MODE_CONNECTOR_DVII,
749f0527d2SMaíra Canal };
759f0527d2SMaíra Canal 
drm_test_cmdline_force_D_only_dvi(struct kunit * test)76961bcdf9SMaíra Canal static void drm_test_cmdline_force_D_only_dvi(struct kunit *test)
779f0527d2SMaíra Canal {
789f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
799f0527d2SMaíra Canal 	const char *cmdline = "D";
809f0527d2SMaíra Canal 
81169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
829f0527d2SMaíra Canal 									  &connector_dvi, &mode));
839f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.specified);
849f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
859f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
869f0527d2SMaíra Canal 
879f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
889f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
899f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
909f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
919f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON_DIGITAL);
929f0527d2SMaíra Canal }
939f0527d2SMaíra Canal 
drm_test_cmdline_force_d_only(struct kunit * test)94961bcdf9SMaíra Canal static void drm_test_cmdline_force_d_only(struct kunit *test)
959f0527d2SMaíra Canal {
969f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
979f0527d2SMaíra Canal 	const char *cmdline = "d";
989f0527d2SMaíra Canal 
99169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
1009f0527d2SMaíra Canal 									  &no_connector, &mode));
1019f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.specified);
1029f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
1039f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
1049f0527d2SMaíra Canal 
1059f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
1069f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
1079f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
1089f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
1099f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_OFF);
1109f0527d2SMaíra Canal }
1119f0527d2SMaíra Canal 
drm_test_cmdline_res(struct kunit * test)112961bcdf9SMaíra Canal static void drm_test_cmdline_res(struct kunit *test)
1139f0527d2SMaíra Canal {
1149f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
1159f0527d2SMaíra Canal 	const char *cmdline = "720x480";
1169f0527d2SMaíra Canal 
117169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
1189f0527d2SMaíra Canal 									  &no_connector, &mode));
1199f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
1209f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
1219f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
1229f0527d2SMaíra Canal 
1239f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
1249f0527d2SMaíra Canal 
1259f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
1269f0527d2SMaíra Canal 
1279f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
1289f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
1299f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
1309f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
1319f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
1329f0527d2SMaíra Canal }
1339f0527d2SMaíra Canal 
drm_test_cmdline_res_vesa(struct kunit * test)134961bcdf9SMaíra Canal static void drm_test_cmdline_res_vesa(struct kunit *test)
1359f0527d2SMaíra Canal {
1369f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
1379f0527d2SMaíra Canal 	const char *cmdline = "720x480M";
1389f0527d2SMaíra Canal 
139169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
1409f0527d2SMaíra Canal 									  &no_connector, &mode));
1419f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
1429f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
1439f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
1449f0527d2SMaíra Canal 
1459f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
1469f0527d2SMaíra Canal 
1479f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
1489f0527d2SMaíra Canal 
1499f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
1509f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.cvt);
1519f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
1529f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
1539f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
1549f0527d2SMaíra Canal }
1559f0527d2SMaíra Canal 
drm_test_cmdline_res_vesa_rblank(struct kunit * test)156961bcdf9SMaíra Canal static void drm_test_cmdline_res_vesa_rblank(struct kunit *test)
1579f0527d2SMaíra Canal {
1589f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
1599f0527d2SMaíra Canal 	const char *cmdline = "720x480MR";
1609f0527d2SMaíra Canal 
161169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
1629f0527d2SMaíra Canal 									  &no_connector, &mode));
1639f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
1649f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
1659f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
1669f0527d2SMaíra Canal 
1679f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
1689f0527d2SMaíra Canal 
1699f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
1709f0527d2SMaíra Canal 
1719f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.rb);
1729f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.cvt);
1739f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
1749f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
1759f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
1769f0527d2SMaíra Canal }
1779f0527d2SMaíra Canal 
drm_test_cmdline_res_rblank(struct kunit * test)178961bcdf9SMaíra Canal static void drm_test_cmdline_res_rblank(struct kunit *test)
1799f0527d2SMaíra Canal {
1809f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
1819f0527d2SMaíra Canal 	const char *cmdline = "720x480R";
1829f0527d2SMaíra Canal 
183169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
1849f0527d2SMaíra Canal 									  &no_connector, &mode));
1859f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
1869f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
1879f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
1889f0527d2SMaíra Canal 
1899f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
1909f0527d2SMaíra Canal 
1919f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
1929f0527d2SMaíra Canal 
1939f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.rb);
1949f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
1959f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
1969f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
1979f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
1989f0527d2SMaíra Canal }
1999f0527d2SMaíra Canal 
drm_test_cmdline_res_bpp(struct kunit * test)200961bcdf9SMaíra Canal static void drm_test_cmdline_res_bpp(struct kunit *test)
2019f0527d2SMaíra Canal {
2029f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
2039f0527d2SMaíra Canal 	const char *cmdline = "720x480-24";
2049f0527d2SMaíra Canal 
205169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
2069f0527d2SMaíra Canal 									  &no_connector, &mode));
2079f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
2089f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
2099f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
2109f0527d2SMaíra Canal 
2119f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
2129f0527d2SMaíra Canal 
2139f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
2149f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
2159f0527d2SMaíra Canal 
2169f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
2179f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
2189f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
2199f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
2209f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
2219f0527d2SMaíra Canal }
2229f0527d2SMaíra Canal 
drm_test_cmdline_res_refresh(struct kunit * test)223961bcdf9SMaíra Canal static void drm_test_cmdline_res_refresh(struct kunit *test)
2249f0527d2SMaíra Canal {
2259f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
2269f0527d2SMaíra Canal 	const char *cmdline = "720x480@60";
2279f0527d2SMaíra Canal 
228169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
2299f0527d2SMaíra Canal 									  &no_connector, &mode));
2309f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
2319f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
2329f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
2339f0527d2SMaíra Canal 
2349f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
2359f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
2369f0527d2SMaíra Canal 
2379f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
2389f0527d2SMaíra Canal 
2399f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
2409f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
2419f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
2429f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
2439f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
2449f0527d2SMaíra Canal }
2459f0527d2SMaíra Canal 
drm_test_cmdline_res_bpp_refresh(struct kunit * test)246961bcdf9SMaíra Canal static void drm_test_cmdline_res_bpp_refresh(struct kunit *test)
2479f0527d2SMaíra Canal {
2489f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
2499f0527d2SMaíra Canal 	const char *cmdline = "720x480-24@60";
2509f0527d2SMaíra Canal 
251169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
2529f0527d2SMaíra Canal 									  &no_connector, &mode));
2539f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
2549f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
2559f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
2569f0527d2SMaíra Canal 
2579f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
2589f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
2599f0527d2SMaíra Canal 
2609f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
2619f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
2629f0527d2SMaíra Canal 
2639f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
2649f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
2659f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
2669f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
2679f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
2689f0527d2SMaíra Canal }
2699f0527d2SMaíra Canal 
drm_test_cmdline_res_bpp_refresh_interlaced(struct kunit * test)270961bcdf9SMaíra Canal static void drm_test_cmdline_res_bpp_refresh_interlaced(struct kunit *test)
2719f0527d2SMaíra Canal {
2729f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
2739f0527d2SMaíra Canal 	const char *cmdline = "720x480-24@60i";
2749f0527d2SMaíra Canal 
275169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
2769f0527d2SMaíra Canal 									  &no_connector, &mode));
2779f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
2789f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
2799f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
2809f0527d2SMaíra Canal 
2819f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
2829f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
2839f0527d2SMaíra Canal 
2849f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
2859f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
2869f0527d2SMaíra Canal 
2879f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
2889f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
2899f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.interlace);
2909f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
2919f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
2929f0527d2SMaíra Canal }
2939f0527d2SMaíra Canal 
drm_test_cmdline_res_bpp_refresh_margins(struct kunit * test)294961bcdf9SMaíra Canal static void drm_test_cmdline_res_bpp_refresh_margins(struct kunit *test)
2959f0527d2SMaíra Canal {
2969f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
2979f0527d2SMaíra Canal 	const char *cmdline = "720x480-24@60m";
2989f0527d2SMaíra Canal 
299169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
3009f0527d2SMaíra Canal 									  &no_connector, &mode));
3019f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
3029f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
3039f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
3049f0527d2SMaíra Canal 
3059f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
3069f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
3079f0527d2SMaíra Canal 
3089f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
3099f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
3109f0527d2SMaíra Canal 
3119f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
3129f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
3139f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
3149f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.margins);
3159f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
3169f0527d2SMaíra Canal }
3179f0527d2SMaíra Canal 
drm_test_cmdline_res_bpp_refresh_force_off(struct kunit * test)318961bcdf9SMaíra Canal static void drm_test_cmdline_res_bpp_refresh_force_off(struct kunit *test)
3199f0527d2SMaíra Canal {
3209f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
3219f0527d2SMaíra Canal 	const char *cmdline = "720x480-24@60d";
3229f0527d2SMaíra Canal 
323169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
3249f0527d2SMaíra Canal 									  &no_connector, &mode));
3259f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
3269f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
3279f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
3289f0527d2SMaíra Canal 
3299f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
3309f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
3319f0527d2SMaíra Canal 
3329f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
3339f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
3349f0527d2SMaíra Canal 
3359f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
3369f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
3379f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
3389f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
3399f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_OFF);
3409f0527d2SMaíra Canal }
3419f0527d2SMaíra Canal 
drm_test_cmdline_res_bpp_refresh_force_on(struct kunit * test)342961bcdf9SMaíra Canal static void drm_test_cmdline_res_bpp_refresh_force_on(struct kunit *test)
3439f0527d2SMaíra Canal {
3449f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
3459f0527d2SMaíra Canal 	const char *cmdline = "720x480-24@60e";
3469f0527d2SMaíra Canal 
347169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
3489f0527d2SMaíra Canal 									  &no_connector, &mode));
3499f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
3509f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
3519f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
3529f0527d2SMaíra Canal 
3539f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
3549f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
3559f0527d2SMaíra Canal 
3569f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
3579f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
3589f0527d2SMaíra Canal 
3599f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
3609f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
3619f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
3629f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
3639f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
3649f0527d2SMaíra Canal }
3659f0527d2SMaíra Canal 
drm_test_cmdline_res_bpp_refresh_force_on_analog(struct kunit * test)366961bcdf9SMaíra Canal static void drm_test_cmdline_res_bpp_refresh_force_on_analog(struct kunit *test)
3679f0527d2SMaíra Canal {
3689f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
3699f0527d2SMaíra Canal 	const char *cmdline = "720x480-24@60D";
3709f0527d2SMaíra Canal 
371169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
3729f0527d2SMaíra Canal 									  &no_connector, &mode));
3739f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
3749f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
3759f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
3769f0527d2SMaíra Canal 
3779f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
3789f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
3799f0527d2SMaíra Canal 
3809f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
3819f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
3829f0527d2SMaíra Canal 
3839f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
3849f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
3859f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
3869f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
3879f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
3889f0527d2SMaíra Canal }
3899f0527d2SMaíra Canal 
drm_test_cmdline_res_bpp_refresh_force_on_digital(struct kunit * test)390961bcdf9SMaíra Canal static void drm_test_cmdline_res_bpp_refresh_force_on_digital(struct kunit *test)
3919f0527d2SMaíra Canal {
3929f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
3939f0527d2SMaíra Canal 	static const struct drm_connector connector = {
3949f0527d2SMaíra Canal 		.connector_type = DRM_MODE_CONNECTOR_DVII,
3959f0527d2SMaíra Canal 	};
3969f0527d2SMaíra Canal 	const char *cmdline = "720x480-24@60D";
3979f0527d2SMaíra Canal 
398169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
3999f0527d2SMaíra Canal 									  &connector, &mode));
4009f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
4019f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
4029f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
4039f0527d2SMaíra Canal 
4049f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
4059f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
4069f0527d2SMaíra Canal 
4079f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
4089f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
4099f0527d2SMaíra Canal 
4109f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
4119f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
4129f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
4139f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
4149f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON_DIGITAL);
4159f0527d2SMaíra Canal }
4169f0527d2SMaíra Canal 
drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on(struct kunit * test)417961bcdf9SMaíra Canal static void drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on(struct kunit *test)
4189f0527d2SMaíra Canal {
4199f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
4209f0527d2SMaíra Canal 	const char *cmdline = "720x480-24@60ime";
4219f0527d2SMaíra Canal 
4229f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
4239f0527d2SMaíra Canal 									  &no_connector, &mode));
4249f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
4259f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
4269f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
4279f0527d2SMaíra Canal 
4289f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.refresh_specified);
4299f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.refresh, 60);
4309f0527d2SMaíra Canal 
4319f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
4329f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
4339f0527d2SMaíra Canal 
4349f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
4359f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
4369f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.interlace);
4379f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.margins);
4389f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
4399f0527d2SMaíra Canal }
4409f0527d2SMaíra Canal 
drm_test_cmdline_res_margins_force_on(struct kunit * test)441961bcdf9SMaíra Canal static void drm_test_cmdline_res_margins_force_on(struct kunit *test)
4429f0527d2SMaíra Canal {
4439f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
4449f0527d2SMaíra Canal 	const char *cmdline = "720x480me";
4459f0527d2SMaíra Canal 
446169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
4479f0527d2SMaíra Canal 									  &no_connector, &mode));
4489f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
4499f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
4509f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
4519f0527d2SMaíra Canal 
4529f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
4539f0527d2SMaíra Canal 
4549f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
4559f0527d2SMaíra Canal 
4569f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
4579f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
4589f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
4599f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.margins);
4609f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
4619f0527d2SMaíra Canal }
4629f0527d2SMaíra Canal 
drm_test_cmdline_res_vesa_margins(struct kunit * test)463961bcdf9SMaíra Canal static void drm_test_cmdline_res_vesa_margins(struct kunit *test)
4649f0527d2SMaíra Canal {
4659f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
4669f0527d2SMaíra Canal 	const char *cmdline = "720x480Mm";
4679f0527d2SMaíra Canal 
468169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
4699f0527d2SMaíra Canal 									  &no_connector, &mode));
4709f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
4719f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
4729f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
4739f0527d2SMaíra Canal 
4749f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
4759f0527d2SMaíra Canal 
4769f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
4779f0527d2SMaíra Canal 
4789f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
4799f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.cvt);
4809f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
4819f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.margins);
4829f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
4839f0527d2SMaíra Canal }
4849f0527d2SMaíra Canal 
drm_test_cmdline_name(struct kunit * test)485961bcdf9SMaíra Canal static void drm_test_cmdline_name(struct kunit *test)
4869f0527d2SMaíra Canal {
4879f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
4889f0527d2SMaíra Canal 	const char *cmdline = "NTSC";
4899f0527d2SMaíra Canal 
490169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
4919f0527d2SMaíra Canal 									  &no_connector, &mode));
4929f0527d2SMaíra Canal 	KUNIT_EXPECT_STREQ(test, mode.name, "NTSC");
4939f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
4949f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
4959f0527d2SMaíra Canal }
4969f0527d2SMaíra Canal 
drm_test_cmdline_name_bpp(struct kunit * test)497961bcdf9SMaíra Canal static void drm_test_cmdline_name_bpp(struct kunit *test)
4989f0527d2SMaíra Canal {
4999f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
5009f0527d2SMaíra Canal 	const char *cmdline = "NTSC-24";
5019f0527d2SMaíra Canal 
502169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
5039f0527d2SMaíra Canal 									  &no_connector, &mode));
5049f0527d2SMaíra Canal 	KUNIT_EXPECT_STREQ(test, mode.name, "NTSC");
5059f0527d2SMaíra Canal 
5069f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
5079f0527d2SMaíra Canal 
5089f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
5099f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
5109f0527d2SMaíra Canal }
5119f0527d2SMaíra Canal 
drm_test_cmdline_name_option(struct kunit * test)512961bcdf9SMaíra Canal static void drm_test_cmdline_name_option(struct kunit *test)
5139f0527d2SMaíra Canal {
5149f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
5159f0527d2SMaíra Canal 	const char *cmdline = "NTSC,rotate=180";
5169f0527d2SMaíra Canal 
517169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
5189f0527d2SMaíra Canal 									  &no_connector, &mode));
5199f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
5209f0527d2SMaíra Canal 	KUNIT_EXPECT_STREQ(test, mode.name, "NTSC");
5219f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
5229f0527d2SMaíra Canal }
5239f0527d2SMaíra Canal 
drm_test_cmdline_name_bpp_option(struct kunit * test)524961bcdf9SMaíra Canal static void drm_test_cmdline_name_bpp_option(struct kunit *test)
5259f0527d2SMaíra Canal {
5269f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
5279f0527d2SMaíra Canal 	const char *cmdline = "NTSC-24,rotate=180";
5289f0527d2SMaíra Canal 
529169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
5309f0527d2SMaíra Canal 									  &no_connector, &mode));
5319f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
5329f0527d2SMaíra Canal 	KUNIT_EXPECT_STREQ(test, mode.name, "NTSC");
5339f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
5349f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
5359f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
5369f0527d2SMaíra Canal }
5379f0527d2SMaíra Canal 
drm_test_cmdline_rotate_0(struct kunit * test)538961bcdf9SMaíra Canal static void drm_test_cmdline_rotate_0(struct kunit *test)
5399f0527d2SMaíra Canal {
5409f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
5419f0527d2SMaíra Canal 	const char *cmdline = "720x480,rotate=0";
5429f0527d2SMaíra Canal 
543169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
5449f0527d2SMaíra Canal 									  &no_connector, &mode));
5459f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
5469f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
5479f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
5489f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_0);
5499f0527d2SMaíra Canal 
5509f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
5519f0527d2SMaíra Canal 
5529f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
5539f0527d2SMaíra Canal 
5549f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
5559f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
5569f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
5579f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
5589f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
5599f0527d2SMaíra Canal }
5609f0527d2SMaíra Canal 
drm_test_cmdline_rotate_90(struct kunit * test)561961bcdf9SMaíra Canal static void drm_test_cmdline_rotate_90(struct kunit *test)
5629f0527d2SMaíra Canal {
5639f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
5649f0527d2SMaíra Canal 	const char *cmdline = "720x480,rotate=90";
5659f0527d2SMaíra Canal 
566169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
5679f0527d2SMaíra Canal 									  &no_connector, &mode));
5689f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
5699f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
5709f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
5719f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_90);
5729f0527d2SMaíra Canal 
5739f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
5749f0527d2SMaíra Canal 
5759f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
5769f0527d2SMaíra Canal 
5779f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
5789f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
5799f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
5809f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
5819f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
5829f0527d2SMaíra Canal }
5839f0527d2SMaíra Canal 
drm_test_cmdline_rotate_180(struct kunit * test)584961bcdf9SMaíra Canal static void drm_test_cmdline_rotate_180(struct kunit *test)
5859f0527d2SMaíra Canal {
5869f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
5879f0527d2SMaíra Canal 	const char *cmdline = "720x480,rotate=180";
5889f0527d2SMaíra Canal 
589169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
5909f0527d2SMaíra Canal 									  &no_connector, &mode));
5919f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
5929f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
5939f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
5949f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
5959f0527d2SMaíra Canal 
5969f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
5979f0527d2SMaíra Canal 
5989f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
5999f0527d2SMaíra Canal 
6009f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
6019f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
6029f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
6039f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
6049f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
6059f0527d2SMaíra Canal }
6069f0527d2SMaíra Canal 
drm_test_cmdline_rotate_270(struct kunit * test)607961bcdf9SMaíra Canal static void drm_test_cmdline_rotate_270(struct kunit *test)
6089f0527d2SMaíra Canal {
6099f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
6109f0527d2SMaíra Canal 	const char *cmdline = "720x480,rotate=270";
6119f0527d2SMaíra Canal 
612169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
6139f0527d2SMaíra Canal 									  &no_connector, &mode));
6149f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
6159f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
6169f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
6179f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_270);
6189f0527d2SMaíra Canal 
6199f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
6209f0527d2SMaíra Canal 
6219f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
6229f0527d2SMaíra Canal 
6239f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
6249f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
6259f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
6269f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
6279f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
6289f0527d2SMaíra Canal }
6299f0527d2SMaíra Canal 
drm_test_cmdline_hmirror(struct kunit * test)630961bcdf9SMaíra Canal static void drm_test_cmdline_hmirror(struct kunit *test)
6319f0527d2SMaíra Canal {
6329f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
6339f0527d2SMaíra Canal 	const char *cmdline = "720x480,reflect_x";
6349f0527d2SMaíra Canal 
635169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
6369f0527d2SMaíra Canal 									  &no_connector, &mode));
6379f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
6389f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
6399f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
6409f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_X));
6419f0527d2SMaíra Canal 
6429f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
6439f0527d2SMaíra Canal 
6449f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
6459f0527d2SMaíra Canal 
6469f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
6479f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
6489f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
6499f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
6509f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
6519f0527d2SMaíra Canal }
6529f0527d2SMaíra Canal 
drm_test_cmdline_vmirror(struct kunit * test)653961bcdf9SMaíra Canal static void drm_test_cmdline_vmirror(struct kunit *test)
6549f0527d2SMaíra Canal {
6559f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
6569f0527d2SMaíra Canal 	const char *cmdline = "720x480,reflect_y";
6579f0527d2SMaíra Canal 
658169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
6599f0527d2SMaíra Canal 									  &no_connector, &mode));
6609f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
6619f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
6629f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
6639f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, (DRM_MODE_ROTATE_0 | DRM_MODE_REFLECT_Y));
6649f0527d2SMaíra Canal 
6659f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
6669f0527d2SMaíra Canal 
6679f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
6689f0527d2SMaíra Canal 
6699f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
6709f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
6719f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
6729f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
6739f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
6749f0527d2SMaíra Canal }
6759f0527d2SMaíra Canal 
drm_test_cmdline_margin_options(struct kunit * test)676961bcdf9SMaíra Canal static void drm_test_cmdline_margin_options(struct kunit *test)
6779f0527d2SMaíra Canal {
6789f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
6799f0527d2SMaíra Canal 	const char *cmdline =
6809f0527d2SMaíra Canal 		"720x480,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42";
6819f0527d2SMaíra Canal 
682169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
6839f0527d2SMaíra Canal 									  &no_connector, &mode));
6849f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
6859f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
6869f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
6879f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.tv_margins.right, 14);
6889f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.tv_margins.left, 24);
6899f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.tv_margins.bottom, 36);
6909f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.tv_margins.top, 42);
6919f0527d2SMaíra Canal 
6929f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
6939f0527d2SMaíra Canal 
6949f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
6959f0527d2SMaíra Canal 
6969f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
6979f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
6989f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
6999f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
7009f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
7019f0527d2SMaíra Canal }
7029f0527d2SMaíra Canal 
drm_test_cmdline_multiple_options(struct kunit * test)703961bcdf9SMaíra Canal static void drm_test_cmdline_multiple_options(struct kunit *test)
7049f0527d2SMaíra Canal {
7059f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
7069f0527d2SMaíra Canal 	const char *cmdline = "720x480,rotate=270,reflect_x";
7079f0527d2SMaíra Canal 
708169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
7099f0527d2SMaíra Canal 									  &no_connector, &mode));
7109f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
7119f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
7129f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
7139f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, (DRM_MODE_ROTATE_270 | DRM_MODE_REFLECT_X));
7149f0527d2SMaíra Canal 
7159f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
7169f0527d2SMaíra Canal 
7179f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
7189f0527d2SMaíra Canal 
7199f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
7209f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
7219f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
7229f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
7239f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
7249f0527d2SMaíra Canal }
7259f0527d2SMaíra Canal 
drm_test_cmdline_bpp_extra_and_option(struct kunit * test)726961bcdf9SMaíra Canal static void drm_test_cmdline_bpp_extra_and_option(struct kunit *test)
7279f0527d2SMaíra Canal {
7289f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
7299f0527d2SMaíra Canal 	const char *cmdline = "720x480-24e,rotate=180";
7309f0527d2SMaíra Canal 
731169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
7329f0527d2SMaíra Canal 									  &no_connector, &mode));
7339f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
7349f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
7359f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
7369f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
7379f0527d2SMaíra Canal 
7389f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
7399f0527d2SMaíra Canal 
7409f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.bpp_specified);
7419f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.bpp, 24);
7429f0527d2SMaíra Canal 
7439f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
7449f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
7459f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
7469f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
7479f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
7489f0527d2SMaíra Canal }
7499f0527d2SMaíra Canal 
drm_test_cmdline_extra_and_option(struct kunit * test)750961bcdf9SMaíra Canal static void drm_test_cmdline_extra_and_option(struct kunit *test)
7519f0527d2SMaíra Canal {
7529f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
7539f0527d2SMaíra Canal 	const char *cmdline = "720x480e,rotate=180";
7549f0527d2SMaíra Canal 
755169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
7569f0527d2SMaíra Canal 									  &no_connector, &mode));
7579f0527d2SMaíra Canal 	KUNIT_EXPECT_TRUE(test, mode.specified);
7589f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.xres, 720);
7599f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.yres, 480);
7609f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.rotation_reflection, DRM_MODE_ROTATE_180);
7619f0527d2SMaíra Canal 
7629f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
7639f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
7649f0527d2SMaíra Canal 
7659f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
7669f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
7679f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
7689f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
7699f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
7709f0527d2SMaíra Canal }
7719f0527d2SMaíra Canal 
drm_test_cmdline_freestanding_options(struct kunit * test)772961bcdf9SMaíra Canal static void drm_test_cmdline_freestanding_options(struct kunit *test)
7739f0527d2SMaíra Canal {
7749f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
7759f0527d2SMaíra Canal 	const char *cmdline = "margin_right=14,margin_left=24,margin_bottom=36,margin_top=42";
7769f0527d2SMaíra Canal 
777169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
7789f0527d2SMaíra Canal 									  &no_connector, &mode));
7799f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.specified);
7809f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
7819f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
7829f0527d2SMaíra Canal 
7839f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.tv_margins.right, 14);
7849f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.tv_margins.left, 24);
7859f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.tv_margins.bottom, 36);
7869f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.tv_margins.top, 42);
7879f0527d2SMaíra Canal 
7889f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
7899f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
7909f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
7919f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
7929f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
7939f0527d2SMaíra Canal }
7949f0527d2SMaíra Canal 
drm_test_cmdline_freestanding_force_e_and_options(struct kunit * test)795961bcdf9SMaíra Canal static void drm_test_cmdline_freestanding_force_e_and_options(struct kunit *test)
7969f0527d2SMaíra Canal {
7979f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
7989f0527d2SMaíra Canal 	const char *cmdline = "e,margin_right=14,margin_left=24,margin_bottom=36,margin_top=42";
7999f0527d2SMaíra Canal 
800169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
8019f0527d2SMaíra Canal 									  &no_connector, &mode));
8029f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.specified);
8039f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
8049f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
8059f0527d2SMaíra Canal 
8069f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.tv_margins.right, 14);
8079f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.tv_margins.left, 24);
8089f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.tv_margins.bottom, 36);
8099f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.tv_margins.top, 42);
8109f0527d2SMaíra Canal 
8119f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
8129f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
8139f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
8149f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
8159f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_ON);
8169f0527d2SMaíra Canal }
8179f0527d2SMaíra Canal 
drm_test_cmdline_panel_orientation(struct kunit * test)818961bcdf9SMaíra Canal static void drm_test_cmdline_panel_orientation(struct kunit *test)
8199f0527d2SMaíra Canal {
8209f0527d2SMaíra Canal 	struct drm_cmdline_mode mode = { };
8219f0527d2SMaíra Canal 	const char *cmdline = "panel_orientation=upside_down";
8229f0527d2SMaíra Canal 
823169a32b7SMichał Winiarski 	KUNIT_ASSERT_TRUE(test, drm_mode_parse_command_line_for_connector(cmdline,
8249f0527d2SMaíra Canal 									  &no_connector, &mode));
8259f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.specified);
8269f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
8279f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
8289f0527d2SMaíra Canal 
8299f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.panel_orientation, DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP);
8309f0527d2SMaíra Canal 
8319f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.rb);
8329f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.cvt);
8339f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.interlace);
8349f0527d2SMaíra Canal 	KUNIT_EXPECT_FALSE(test, mode.margins);
8359f0527d2SMaíra Canal 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
8369f0527d2SMaíra Canal }
8379f0527d2SMaíra Canal 
8380af02a0eSMichał Winiarski struct drm_cmdline_invalid_test {
8390af02a0eSMichał Winiarski 	const char *name;
8400af02a0eSMichał Winiarski 	const char *cmdline;
8410af02a0eSMichał Winiarski };
8420af02a0eSMichał Winiarski 
drm_test_cmdline_invalid(struct kunit * test)843961bcdf9SMaíra Canal static void drm_test_cmdline_invalid(struct kunit *test)
8440af02a0eSMichał Winiarski {
8450af02a0eSMichał Winiarski 	const struct drm_cmdline_invalid_test *params = test->param_value;
8460af02a0eSMichał Winiarski 	struct drm_cmdline_mode mode = { };
8470af02a0eSMichał Winiarski 
8480af02a0eSMichał Winiarski 	KUNIT_EXPECT_FALSE(test, drm_mode_parse_command_line_for_connector(params->cmdline,
8490af02a0eSMichał Winiarski 									   &no_connector,
8500af02a0eSMichał Winiarski 									   &mode));
8510af02a0eSMichał Winiarski }
8520af02a0eSMichał Winiarski 
8530af02a0eSMichał Winiarski static const struct drm_cmdline_invalid_test drm_cmdline_invalid_tests[] = {
8540af02a0eSMichał Winiarski 	{
8550af02a0eSMichał Winiarski 		.name = "margin_only",
8560af02a0eSMichał Winiarski 		.cmdline = "m",
8570af02a0eSMichał Winiarski 	},
8580af02a0eSMichał Winiarski 	{
8590af02a0eSMichał Winiarski 		.name = "interlace_only",
8600af02a0eSMichał Winiarski 		.cmdline = "i",
8610af02a0eSMichał Winiarski 	},
8620af02a0eSMichał Winiarski 	{
8630af02a0eSMichał Winiarski 		.name = "res_missing_x",
8640af02a0eSMichał Winiarski 		.cmdline = "x480",
8650af02a0eSMichał Winiarski 	},
8660af02a0eSMichał Winiarski 	{
8670af02a0eSMichał Winiarski 		.name = "res_missing_y",
8680af02a0eSMichał Winiarski 		.cmdline = "1024x",
8690af02a0eSMichał Winiarski 	},
8700af02a0eSMichał Winiarski 	{
8710af02a0eSMichał Winiarski 		.name = "res_bad_y",
8720af02a0eSMichał Winiarski 		.cmdline = "1024xtest",
8730af02a0eSMichał Winiarski 	},
8740af02a0eSMichał Winiarski 	{
8750af02a0eSMichał Winiarski 		.name = "res_missing_y_bpp",
8760af02a0eSMichał Winiarski 		.cmdline = "1024x-24",
8770af02a0eSMichał Winiarski 	},
8780af02a0eSMichał Winiarski 	{
8790af02a0eSMichał Winiarski 		.name = "res_bad_bpp",
8800af02a0eSMichał Winiarski 		.cmdline = "720x480-test",
8810af02a0eSMichał Winiarski 	},
8820af02a0eSMichał Winiarski 	{
8830af02a0eSMichał Winiarski 		.name = "res_bad_refresh",
8840af02a0eSMichał Winiarski 		.cmdline = "720x480@refresh",
8850af02a0eSMichał Winiarski 	},
8860af02a0eSMichał Winiarski 	{
8870af02a0eSMichał Winiarski 		.name = "res_bpp_refresh_force_on_off",
8880af02a0eSMichał Winiarski 		.cmdline = "720x480-24@60de",
8890af02a0eSMichał Winiarski 	},
8900af02a0eSMichał Winiarski 	{
8910af02a0eSMichał Winiarski 		.name = "res_invalid_mode",
8920af02a0eSMichał Winiarski 		.cmdline = "720x480f",
8930af02a0eSMichał Winiarski 	},
8940af02a0eSMichał Winiarski 	{
8950af02a0eSMichał Winiarski 		.name = "res_bpp_wrong_place_mode",
8960af02a0eSMichał Winiarski 		.cmdline = "720x480e-24",
8970af02a0eSMichał Winiarski 	},
8980af02a0eSMichał Winiarski 	{
8990af02a0eSMichał Winiarski 		.name = "name_bpp_refresh",
9000af02a0eSMichał Winiarski 		.cmdline = "NTSC-24@60",
9010af02a0eSMichał Winiarski 	},
9020af02a0eSMichał Winiarski 	{
9030af02a0eSMichał Winiarski 		.name = "name_refresh",
9040af02a0eSMichał Winiarski 		.cmdline = "NTSC@60",
9050af02a0eSMichał Winiarski 	},
9060af02a0eSMichał Winiarski 	{
9070af02a0eSMichał Winiarski 		.name = "name_refresh_wrong_mode",
9080af02a0eSMichał Winiarski 		.cmdline = "NTSC@60m",
9090af02a0eSMichał Winiarski 	},
9100af02a0eSMichał Winiarski 	{
9110af02a0eSMichał Winiarski 		.name = "name_refresh_invalid_mode",
9120af02a0eSMichał Winiarski 		.cmdline = "NTSC@60f",
9130af02a0eSMichał Winiarski 	},
9140af02a0eSMichał Winiarski 	{
9150af02a0eSMichał Winiarski 		.name = "rotate_multiple",
9160af02a0eSMichał Winiarski 		.cmdline = "720x480,rotate=0,rotate=90",
9170af02a0eSMichał Winiarski 	},
9180af02a0eSMichał Winiarski 	{
9190af02a0eSMichał Winiarski 		.name = "rotate_invalid_val",
9200af02a0eSMichał Winiarski 		.cmdline = "720x480,rotate=42",
9210af02a0eSMichał Winiarski 	},
9220af02a0eSMichał Winiarski 	{
9230af02a0eSMichał Winiarski 		.name = "rotate_truncated",
9240af02a0eSMichał Winiarski 		.cmdline = "720x480,rotate=",
9250af02a0eSMichał Winiarski 	},
9260af02a0eSMichał Winiarski 	{
9270af02a0eSMichał Winiarski 		.name = "invalid_option",
9280af02a0eSMichał Winiarski 		.cmdline = "720x480,test=42",
9290af02a0eSMichał Winiarski 	},
930*e691c999SMaxime Ripard 	{
931*e691c999SMaxime Ripard 		.name = "invalid_tv_option",
932*e691c999SMaxime Ripard 		.cmdline = "720x480i,tv_mode=invalid",
933*e691c999SMaxime Ripard 	},
934*e691c999SMaxime Ripard 	{
935*e691c999SMaxime Ripard 		.name = "truncated_tv_option",
936*e691c999SMaxime Ripard 		.cmdline = "720x480i,tv_mode=NTS",
937*e691c999SMaxime Ripard 	},
9380af02a0eSMichał Winiarski };
9390af02a0eSMichał Winiarski 
drm_cmdline_invalid_desc(const struct drm_cmdline_invalid_test * t,char * desc)9400af02a0eSMichał Winiarski static void drm_cmdline_invalid_desc(const struct drm_cmdline_invalid_test *t,
9410af02a0eSMichał Winiarski 				     char *desc)
9420af02a0eSMichał Winiarski {
9430af02a0eSMichał Winiarski 	sprintf(desc, "%s", t->name);
9440af02a0eSMichał Winiarski }
9450af02a0eSMichał Winiarski 
9460af02a0eSMichał Winiarski KUNIT_ARRAY_PARAM(drm_cmdline_invalid, drm_cmdline_invalid_tests, drm_cmdline_invalid_desc);
9470af02a0eSMichał Winiarski 
948*e691c999SMaxime Ripard struct drm_cmdline_tv_option_test {
949*e691c999SMaxime Ripard 	const char *name;
950*e691c999SMaxime Ripard 	const char *cmdline;
951*e691c999SMaxime Ripard 	struct drm_display_mode *(*mode_fn)(struct drm_device *dev);
952*e691c999SMaxime Ripard 	enum drm_connector_tv_mode tv_mode;
953*e691c999SMaxime Ripard };
954*e691c999SMaxime Ripard 
drm_test_cmdline_tv_options(struct kunit * test)955*e691c999SMaxime Ripard static void drm_test_cmdline_tv_options(struct kunit *test)
956*e691c999SMaxime Ripard {
957*e691c999SMaxime Ripard 	const struct drm_cmdline_tv_option_test *params = test->param_value;
958*e691c999SMaxime Ripard 	const struct drm_display_mode *expected_mode = params->mode_fn(NULL);
959*e691c999SMaxime Ripard 	struct drm_cmdline_mode mode = { };
960*e691c999SMaxime Ripard 
961*e691c999SMaxime Ripard 	KUNIT_EXPECT_TRUE(test, drm_mode_parse_command_line_for_connector(params->cmdline,
962*e691c999SMaxime Ripard 									  &no_connector, &mode));
963*e691c999SMaxime Ripard 	KUNIT_EXPECT_TRUE(test, mode.specified);
964*e691c999SMaxime Ripard 	KUNIT_EXPECT_EQ(test, mode.xres, expected_mode->hdisplay);
965*e691c999SMaxime Ripard 	KUNIT_EXPECT_EQ(test, mode.yres, expected_mode->vdisplay);
966*e691c999SMaxime Ripard 	KUNIT_EXPECT_EQ(test, mode.tv_mode, params->tv_mode);
967*e691c999SMaxime Ripard 
968*e691c999SMaxime Ripard 	KUNIT_EXPECT_FALSE(test, mode.refresh_specified);
969*e691c999SMaxime Ripard 
970*e691c999SMaxime Ripard 	KUNIT_EXPECT_FALSE(test, mode.bpp_specified);
971*e691c999SMaxime Ripard 
972*e691c999SMaxime Ripard 	KUNIT_EXPECT_FALSE(test, mode.rb);
973*e691c999SMaxime Ripard 	KUNIT_EXPECT_FALSE(test, mode.cvt);
974*e691c999SMaxime Ripard 	KUNIT_EXPECT_EQ(test, mode.interlace, !!(expected_mode->flags & DRM_MODE_FLAG_INTERLACE));
975*e691c999SMaxime Ripard 	KUNIT_EXPECT_FALSE(test, mode.margins);
976*e691c999SMaxime Ripard 	KUNIT_EXPECT_EQ(test, mode.force, DRM_FORCE_UNSPECIFIED);
977*e691c999SMaxime Ripard }
978*e691c999SMaxime Ripard 
979*e691c999SMaxime Ripard #define TV_OPT_TEST(_opt, _cmdline, _mode_fn)		\
980*e691c999SMaxime Ripard 	{						\
981*e691c999SMaxime Ripard 		.name = #_opt,				\
982*e691c999SMaxime Ripard 		.cmdline = _cmdline,			\
983*e691c999SMaxime Ripard 		.mode_fn = _mode_fn,			\
984*e691c999SMaxime Ripard 		.tv_mode = DRM_MODE_TV_MODE_ ## _opt,	\
985*e691c999SMaxime Ripard 	}
986*e691c999SMaxime Ripard 
987*e691c999SMaxime Ripard static const struct drm_cmdline_tv_option_test drm_cmdline_tv_option_tests[] = {
988*e691c999SMaxime Ripard 	TV_OPT_TEST(NTSC, "720x480i,tv_mode=NTSC", drm_mode_analog_ntsc_480i),
989*e691c999SMaxime Ripard 	TV_OPT_TEST(NTSC_443, "720x480i,tv_mode=NTSC-443", drm_mode_analog_ntsc_480i),
990*e691c999SMaxime Ripard 	TV_OPT_TEST(NTSC_J, "720x480i,tv_mode=NTSC-J", drm_mode_analog_ntsc_480i),
991*e691c999SMaxime Ripard 	TV_OPT_TEST(PAL, "720x576i,tv_mode=PAL", drm_mode_analog_pal_576i),
992*e691c999SMaxime Ripard 	TV_OPT_TEST(PAL_M, "720x480i,tv_mode=PAL-M", drm_mode_analog_ntsc_480i),
993*e691c999SMaxime Ripard 	TV_OPT_TEST(PAL_N, "720x576i,tv_mode=PAL-N", drm_mode_analog_pal_576i),
994*e691c999SMaxime Ripard 	TV_OPT_TEST(SECAM, "720x576i,tv_mode=SECAM", drm_mode_analog_pal_576i),
995*e691c999SMaxime Ripard };
996*e691c999SMaxime Ripard 
drm_cmdline_tv_option_desc(const struct drm_cmdline_tv_option_test * t,char * desc)997*e691c999SMaxime Ripard static void drm_cmdline_tv_option_desc(const struct drm_cmdline_tv_option_test *t,
998*e691c999SMaxime Ripard 				       char *desc)
999*e691c999SMaxime Ripard {
1000*e691c999SMaxime Ripard 	sprintf(desc, "%s", t->name);
1001*e691c999SMaxime Ripard }
1002*e691c999SMaxime Ripard 
1003*e691c999SMaxime Ripard KUNIT_ARRAY_PARAM(drm_cmdline_tv_option,
1004*e691c999SMaxime Ripard 		  drm_cmdline_tv_option_tests,
1005*e691c999SMaxime Ripard 		  drm_cmdline_tv_option_desc);
1006*e691c999SMaxime Ripard 
10079f0527d2SMaíra Canal static struct kunit_case drm_cmdline_parser_tests[] = {
1008961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_force_d_only),
1009961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_force_D_only_dvi),
1010961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_force_D_only_hdmi),
1011961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_force_D_only_not_digital),
1012961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_force_e_only),
1013961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res),
1014961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_vesa),
1015961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_vesa_rblank),
1016961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_rblank),
1017961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_bpp),
1018961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_refresh),
1019961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh),
1020961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh_interlaced),
1021961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh_margins),
1022961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh_force_off),
1023961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh_force_on),
1024961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh_force_on_analog),
1025961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh_force_on_digital),
1026961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on),
1027961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_margins_force_on),
1028961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_res_vesa_margins),
1029961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_name),
1030961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_name_bpp),
1031961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_name_option),
1032961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_name_bpp_option),
1033961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_rotate_0),
1034961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_rotate_90),
1035961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_rotate_180),
1036961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_rotate_270),
1037961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_hmirror),
1038961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_vmirror),
1039961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_margin_options),
1040961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_multiple_options),
1041961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_bpp_extra_and_option),
1042961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_extra_and_option),
1043961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_freestanding_options),
1044961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_freestanding_force_e_and_options),
1045961bcdf9SMaíra Canal 	KUNIT_CASE(drm_test_cmdline_panel_orientation),
1046961bcdf9SMaíra Canal 	KUNIT_CASE_PARAM(drm_test_cmdline_invalid, drm_cmdline_invalid_gen_params),
1047*e691c999SMaxime Ripard 	KUNIT_CASE_PARAM(drm_test_cmdline_tv_options, drm_cmdline_tv_option_gen_params),
10489f0527d2SMaíra Canal 	{}
10499f0527d2SMaíra Canal };
10509f0527d2SMaíra Canal 
10519f0527d2SMaíra Canal static struct kunit_suite drm_cmdline_parser_test_suite = {
10529f0527d2SMaíra Canal 	.name = "drm_cmdline_parser",
10539f0527d2SMaíra Canal 	.test_cases = drm_cmdline_parser_tests
10549f0527d2SMaíra Canal };
10559f0527d2SMaíra Canal 
10569f0527d2SMaíra Canal kunit_test_suite(drm_cmdline_parser_test_suite);
10579f0527d2SMaíra Canal 
10589f0527d2SMaíra Canal MODULE_AUTHOR("Maxime Ripard <maxime.ripard@bootlin.com>");
10599f0527d2SMaíra Canal MODULE_LICENSE("GPL");
1060