drm_cmdline_parser_test.c 34 KB

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