vkms_config_test.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029
  1. // SPDX-License-Identifier: GPL-2.0+
  2. #include <kunit/test.h>
  3. #include "../vkms_config.h"
  4. MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");
  5. static size_t vkms_config_get_num_planes(struct vkms_config *config)
  6. {
  7. struct vkms_config_plane *plane_cfg;
  8. size_t count = 0;
  9. vkms_config_for_each_plane(config, plane_cfg)
  10. count++;
  11. return count;
  12. }
  13. static size_t vkms_config_get_num_encoders(struct vkms_config *config)
  14. {
  15. struct vkms_config_encoder *encoder_cfg;
  16. size_t count = 0;
  17. vkms_config_for_each_encoder(config, encoder_cfg)
  18. count++;
  19. return count;
  20. }
  21. static size_t vkms_config_get_num_connectors(struct vkms_config *config)
  22. {
  23. struct vkms_config_connector *connector_cfg;
  24. size_t count = 0;
  25. vkms_config_for_each_connector(config, connector_cfg)
  26. count++;
  27. return count;
  28. }
  29. static struct vkms_config_plane *get_first_plane(struct vkms_config *config)
  30. {
  31. struct vkms_config_plane *plane_cfg;
  32. vkms_config_for_each_plane(config, plane_cfg)
  33. return plane_cfg;
  34. return NULL;
  35. }
  36. static struct vkms_config_crtc *get_first_crtc(struct vkms_config *config)
  37. {
  38. struct vkms_config_crtc *crtc_cfg;
  39. vkms_config_for_each_crtc(config, crtc_cfg)
  40. return crtc_cfg;
  41. return NULL;
  42. }
  43. static struct vkms_config_encoder *get_first_encoder(struct vkms_config *config)
  44. {
  45. struct vkms_config_encoder *encoder_cfg;
  46. vkms_config_for_each_encoder(config, encoder_cfg)
  47. return encoder_cfg;
  48. return NULL;
  49. }
  50. static struct vkms_config_connector *get_first_connector(struct vkms_config *config)
  51. {
  52. struct vkms_config_connector *connector_cfg;
  53. vkms_config_for_each_connector(config, connector_cfg)
  54. return connector_cfg;
  55. return NULL;
  56. }
  57. struct default_config_case {
  58. bool enable_cursor;
  59. bool enable_writeback;
  60. bool enable_overlay;
  61. bool enable_plane_pipeline;
  62. };
  63. static void vkms_config_test_empty_config(struct kunit *test)
  64. {
  65. struct vkms_config *config;
  66. const char *dev_name = "test";
  67. config = vkms_config_create(dev_name);
  68. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  69. /* The dev_name string and the config have different lifetimes */
  70. dev_name = NULL;
  71. KUNIT_EXPECT_STREQ(test, vkms_config_get_device_name(config), "test");
  72. KUNIT_EXPECT_EQ(test, vkms_config_get_num_planes(config), 0);
  73. KUNIT_EXPECT_EQ(test, vkms_config_get_num_crtcs(config), 0);
  74. KUNIT_EXPECT_EQ(test, vkms_config_get_num_encoders(config), 0);
  75. KUNIT_EXPECT_EQ(test, vkms_config_get_num_connectors(config), 0);
  76. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  77. vkms_config_destroy(config);
  78. }
  79. static struct default_config_case default_config_cases[] = {
  80. { false, false, false, false },
  81. { true, false, false, false },
  82. { true, true, false, false },
  83. { true, false, true, false },
  84. { false, true, false, false },
  85. { false, true, true, false },
  86. { false, false, true, false },
  87. { true, true, true, false },
  88. { false, false, false, true },
  89. { true, false, false, true },
  90. { true, true, false, true },
  91. { true, false, true, true },
  92. { false, true, false, true },
  93. { false, true, true, true },
  94. { false, false, true, true },
  95. { true, true, true, true },
  96. };
  97. KUNIT_ARRAY_PARAM(default_config, default_config_cases, NULL);
  98. static void vkms_config_test_default_config(struct kunit *test)
  99. {
  100. const struct default_config_case *params = test->param_value;
  101. struct vkms_config *config;
  102. struct vkms_config_plane *plane_cfg;
  103. struct vkms_config_crtc *crtc_cfg;
  104. int n_primaries = 0;
  105. int n_cursors = 0;
  106. int n_overlays = 0;
  107. config = vkms_config_default_create(params->enable_cursor,
  108. params->enable_writeback,
  109. params->enable_overlay,
  110. params->enable_plane_pipeline);
  111. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  112. /* Planes */
  113. vkms_config_for_each_plane(config, plane_cfg) {
  114. KUNIT_EXPECT_EQ(test,
  115. vkms_config_plane_get_default_pipeline(plane_cfg),
  116. params->enable_plane_pipeline);
  117. switch (vkms_config_plane_get_type(plane_cfg)) {
  118. case DRM_PLANE_TYPE_PRIMARY:
  119. n_primaries++;
  120. break;
  121. case DRM_PLANE_TYPE_CURSOR:
  122. n_cursors++;
  123. break;
  124. case DRM_PLANE_TYPE_OVERLAY:
  125. n_overlays++;
  126. break;
  127. default:
  128. KUNIT_FAIL_AND_ABORT(test, "Unknown plane type");
  129. }
  130. }
  131. KUNIT_EXPECT_EQ(test, n_primaries, 1);
  132. KUNIT_EXPECT_EQ(test, n_cursors, params->enable_cursor ? 1 : 0);
  133. KUNIT_EXPECT_EQ(test, n_overlays, params->enable_overlay ? 8 : 0);
  134. /* CRTCs */
  135. KUNIT_EXPECT_EQ(test, vkms_config_get_num_crtcs(config), 1);
  136. crtc_cfg = get_first_crtc(config);
  137. KUNIT_EXPECT_EQ(test, vkms_config_crtc_get_writeback(crtc_cfg),
  138. params->enable_writeback);
  139. vkms_config_for_each_plane(config, plane_cfg) {
  140. struct vkms_config_crtc *possible_crtc;
  141. int n_possible_crtcs = 0;
  142. unsigned long idx = 0;
  143. vkms_config_plane_for_each_possible_crtc(plane_cfg, idx, possible_crtc) {
  144. KUNIT_EXPECT_PTR_EQ(test, crtc_cfg, possible_crtc);
  145. n_possible_crtcs++;
  146. }
  147. KUNIT_EXPECT_EQ(test, n_possible_crtcs, 1);
  148. }
  149. /* Encoders */
  150. KUNIT_EXPECT_EQ(test, vkms_config_get_num_encoders(config), 1);
  151. /* Connectors */
  152. KUNIT_EXPECT_EQ(test, vkms_config_get_num_connectors(config), 1);
  153. KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config));
  154. vkms_config_destroy(config);
  155. }
  156. static void vkms_config_test_get_planes(struct kunit *test)
  157. {
  158. struct vkms_config *config;
  159. struct vkms_config_plane *plane_cfg;
  160. struct vkms_config_plane *plane_cfg1, *plane_cfg2;
  161. int n_planes = 0;
  162. config = vkms_config_create("test");
  163. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  164. vkms_config_for_each_plane(config, plane_cfg)
  165. n_planes++;
  166. KUNIT_ASSERT_EQ(test, n_planes, 0);
  167. plane_cfg1 = vkms_config_create_plane(config);
  168. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg1);
  169. vkms_config_for_each_plane(config, plane_cfg) {
  170. n_planes++;
  171. if (plane_cfg != plane_cfg1)
  172. KUNIT_FAIL(test, "Unexpected plane");
  173. }
  174. KUNIT_ASSERT_EQ(test, n_planes, 1);
  175. n_planes = 0;
  176. plane_cfg2 = vkms_config_create_plane(config);
  177. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg2);
  178. vkms_config_for_each_plane(config, plane_cfg) {
  179. n_planes++;
  180. if (plane_cfg != plane_cfg1 && plane_cfg != plane_cfg2)
  181. KUNIT_FAIL(test, "Unexpected plane");
  182. }
  183. KUNIT_ASSERT_EQ(test, n_planes, 2);
  184. n_planes = 0;
  185. vkms_config_destroy_plane(plane_cfg1);
  186. vkms_config_for_each_plane(config, plane_cfg) {
  187. n_planes++;
  188. if (plane_cfg != plane_cfg2)
  189. KUNIT_FAIL(test, "Unexpected plane");
  190. }
  191. KUNIT_ASSERT_EQ(test, n_planes, 1);
  192. vkms_config_destroy(config);
  193. }
  194. static void vkms_config_test_get_crtcs(struct kunit *test)
  195. {
  196. struct vkms_config *config;
  197. struct vkms_config_crtc *crtc_cfg;
  198. struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2;
  199. config = vkms_config_create("test");
  200. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  201. KUNIT_ASSERT_EQ(test, vkms_config_get_num_crtcs(config), 0);
  202. vkms_config_for_each_crtc(config, crtc_cfg)
  203. KUNIT_FAIL(test, "Unexpected CRTC");
  204. crtc_cfg1 = vkms_config_create_crtc(config);
  205. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg1);
  206. KUNIT_ASSERT_EQ(test, vkms_config_get_num_crtcs(config), 1);
  207. vkms_config_for_each_crtc(config, crtc_cfg) {
  208. if (crtc_cfg != crtc_cfg1)
  209. KUNIT_FAIL(test, "Unexpected CRTC");
  210. }
  211. crtc_cfg2 = vkms_config_create_crtc(config);
  212. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg2);
  213. KUNIT_ASSERT_EQ(test, vkms_config_get_num_crtcs(config), 2);
  214. vkms_config_for_each_crtc(config, crtc_cfg) {
  215. if (crtc_cfg != crtc_cfg1 && crtc_cfg != crtc_cfg2)
  216. KUNIT_FAIL(test, "Unexpected CRTC");
  217. }
  218. vkms_config_destroy_crtc(config, crtc_cfg2);
  219. KUNIT_ASSERT_EQ(test, vkms_config_get_num_crtcs(config), 1);
  220. vkms_config_for_each_crtc(config, crtc_cfg) {
  221. if (crtc_cfg != crtc_cfg1)
  222. KUNIT_FAIL(test, "Unexpected CRTC");
  223. }
  224. vkms_config_destroy(config);
  225. }
  226. static void vkms_config_test_get_encoders(struct kunit *test)
  227. {
  228. struct vkms_config *config;
  229. struct vkms_config_encoder *encoder_cfg;
  230. struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2;
  231. int n_encoders = 0;
  232. config = vkms_config_create("test");
  233. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  234. vkms_config_for_each_encoder(config, encoder_cfg)
  235. n_encoders++;
  236. KUNIT_ASSERT_EQ(test, n_encoders, 0);
  237. encoder_cfg1 = vkms_config_create_encoder(config);
  238. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg1);
  239. vkms_config_for_each_encoder(config, encoder_cfg) {
  240. n_encoders++;
  241. if (encoder_cfg != encoder_cfg1)
  242. KUNIT_FAIL(test, "Unexpected encoder");
  243. }
  244. KUNIT_ASSERT_EQ(test, n_encoders, 1);
  245. n_encoders = 0;
  246. encoder_cfg2 = vkms_config_create_encoder(config);
  247. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg2);
  248. vkms_config_for_each_encoder(config, encoder_cfg) {
  249. n_encoders++;
  250. if (encoder_cfg != encoder_cfg1 && encoder_cfg != encoder_cfg2)
  251. KUNIT_FAIL(test, "Unexpected encoder");
  252. }
  253. KUNIT_ASSERT_EQ(test, n_encoders, 2);
  254. n_encoders = 0;
  255. vkms_config_destroy_encoder(config, encoder_cfg2);
  256. vkms_config_for_each_encoder(config, encoder_cfg) {
  257. n_encoders++;
  258. if (encoder_cfg != encoder_cfg1)
  259. KUNIT_FAIL(test, "Unexpected encoder");
  260. }
  261. KUNIT_ASSERT_EQ(test, n_encoders, 1);
  262. n_encoders = 0;
  263. vkms_config_destroy(config);
  264. }
  265. static void vkms_config_test_get_connectors(struct kunit *test)
  266. {
  267. struct vkms_config *config;
  268. struct vkms_config_connector *connector_cfg;
  269. struct vkms_config_connector *connector_cfg1, *connector_cfg2;
  270. int n_connectors = 0;
  271. config = vkms_config_create("test");
  272. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  273. vkms_config_for_each_connector(config, connector_cfg)
  274. n_connectors++;
  275. KUNIT_ASSERT_EQ(test, n_connectors, 0);
  276. connector_cfg1 = vkms_config_create_connector(config);
  277. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg1);
  278. vkms_config_for_each_connector(config, connector_cfg) {
  279. n_connectors++;
  280. if (connector_cfg != connector_cfg1)
  281. KUNIT_FAIL(test, "Unexpected connector");
  282. }
  283. KUNIT_ASSERT_EQ(test, n_connectors, 1);
  284. n_connectors = 0;
  285. connector_cfg2 = vkms_config_create_connector(config);
  286. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg2);
  287. vkms_config_for_each_connector(config, connector_cfg) {
  288. n_connectors++;
  289. if (connector_cfg != connector_cfg1 &&
  290. connector_cfg != connector_cfg2)
  291. KUNIT_FAIL(test, "Unexpected connector");
  292. }
  293. KUNIT_ASSERT_EQ(test, n_connectors, 2);
  294. n_connectors = 0;
  295. vkms_config_destroy_connector(connector_cfg2);
  296. vkms_config_for_each_connector(config, connector_cfg) {
  297. n_connectors++;
  298. if (connector_cfg != connector_cfg1)
  299. KUNIT_FAIL(test, "Unexpected connector");
  300. }
  301. KUNIT_ASSERT_EQ(test, n_connectors, 1);
  302. n_connectors = 0;
  303. vkms_config_destroy(config);
  304. }
  305. static void vkms_config_test_invalid_plane_number(struct kunit *test)
  306. {
  307. struct vkms_config *config;
  308. struct vkms_config_plane *plane_cfg;
  309. int n;
  310. config = vkms_config_default_create(false, false, false, false);
  311. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  312. /* Invalid: No planes */
  313. plane_cfg = get_first_plane(config);
  314. vkms_config_destroy_plane(plane_cfg);
  315. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  316. /* Invalid: Too many planes */
  317. for (n = 0; n <= 32; n++)
  318. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vkms_config_create_plane(config));
  319. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  320. vkms_config_destroy(config);
  321. }
  322. static void vkms_config_test_valid_plane_type(struct kunit *test)
  323. {
  324. struct vkms_config *config;
  325. struct vkms_config_plane *plane_cfg;
  326. struct vkms_config_crtc *crtc_cfg;
  327. struct vkms_config_encoder *encoder_cfg;
  328. int err;
  329. config = vkms_config_default_create(false, false, false, false);
  330. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  331. plane_cfg = get_first_plane(config);
  332. vkms_config_destroy_plane(plane_cfg);
  333. crtc_cfg = get_first_crtc(config);
  334. /* Invalid: No primary plane */
  335. plane_cfg = vkms_config_create_plane(config);
  336. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg);
  337. vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_OVERLAY);
  338. err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg);
  339. KUNIT_EXPECT_EQ(test, err, 0);
  340. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  341. /* Invalid: Multiple primary planes */
  342. plane_cfg = vkms_config_create_plane(config);
  343. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg);
  344. vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY);
  345. err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg);
  346. KUNIT_EXPECT_EQ(test, err, 0);
  347. plane_cfg = vkms_config_create_plane(config);
  348. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg);
  349. vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY);
  350. err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg);
  351. KUNIT_EXPECT_EQ(test, err, 0);
  352. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  353. /* Valid: One primary plane */
  354. vkms_config_destroy_plane(plane_cfg);
  355. KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config));
  356. /* Invalid: Multiple cursor planes */
  357. plane_cfg = vkms_config_create_plane(config);
  358. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg);
  359. vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_CURSOR);
  360. err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg);
  361. KUNIT_EXPECT_EQ(test, err, 0);
  362. plane_cfg = vkms_config_create_plane(config);
  363. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg);
  364. vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_CURSOR);
  365. err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg);
  366. KUNIT_EXPECT_EQ(test, err, 0);
  367. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  368. /* Valid: One primary and one cursor plane */
  369. vkms_config_destroy_plane(plane_cfg);
  370. KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config));
  371. /* Invalid: Second CRTC without primary plane */
  372. crtc_cfg = vkms_config_create_crtc(config);
  373. encoder_cfg = vkms_config_create_encoder(config);
  374. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg);
  375. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg);
  376. err = vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg);
  377. KUNIT_EXPECT_EQ(test, err, 0);
  378. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  379. /* Valid: Second CRTC with a primary plane */
  380. plane_cfg = vkms_config_create_plane(config);
  381. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg);
  382. vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY);
  383. err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg);
  384. KUNIT_EXPECT_EQ(test, err, 0);
  385. KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config));
  386. vkms_config_destroy(config);
  387. }
  388. static void vkms_config_test_valid_plane_possible_crtcs(struct kunit *test)
  389. {
  390. struct vkms_config *config;
  391. struct vkms_config_plane *plane_cfg;
  392. struct vkms_config_crtc *crtc_cfg;
  393. config = vkms_config_default_create(false, false, false, false);
  394. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  395. plane_cfg = get_first_plane(config);
  396. crtc_cfg = get_first_crtc(config);
  397. /* Invalid: Primary plane without a possible CRTC */
  398. vkms_config_plane_detach_crtc(plane_cfg, crtc_cfg);
  399. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  400. vkms_config_destroy(config);
  401. }
  402. static void vkms_config_test_invalid_crtc_number(struct kunit *test)
  403. {
  404. struct vkms_config *config;
  405. struct vkms_config_crtc *crtc_cfg;
  406. int n;
  407. config = vkms_config_default_create(false, false, false, false);
  408. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  409. /* Invalid: No CRTCs */
  410. crtc_cfg = get_first_crtc(config);
  411. vkms_config_destroy_crtc(config, crtc_cfg);
  412. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  413. /* Invalid: Too many CRTCs */
  414. for (n = 0; n <= 32; n++)
  415. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vkms_config_create_crtc(config));
  416. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  417. vkms_config_destroy(config);
  418. }
  419. static void vkms_config_test_invalid_encoder_number(struct kunit *test)
  420. {
  421. struct vkms_config *config;
  422. struct vkms_config_encoder *encoder_cfg;
  423. int n;
  424. config = vkms_config_default_create(false, false, false, false);
  425. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  426. /* Invalid: No encoders */
  427. encoder_cfg = get_first_encoder(config);
  428. vkms_config_destroy_encoder(config, encoder_cfg);
  429. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  430. /* Invalid: Too many encoders */
  431. for (n = 0; n <= 32; n++)
  432. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vkms_config_create_encoder(config));
  433. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  434. vkms_config_destroy(config);
  435. }
  436. static void vkms_config_test_valid_encoder_possible_crtcs(struct kunit *test)
  437. {
  438. struct vkms_config *config;
  439. struct vkms_config_plane *plane_cfg;
  440. struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2;
  441. struct vkms_config_encoder *encoder_cfg;
  442. int err;
  443. config = vkms_config_default_create(false, false, false, false);
  444. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  445. crtc_cfg1 = get_first_crtc(config);
  446. /* Invalid: Encoder without a possible CRTC */
  447. encoder_cfg = vkms_config_create_encoder(config);
  448. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg);
  449. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  450. /* Valid: Second CRTC with shared encoder */
  451. crtc_cfg2 = vkms_config_create_crtc(config);
  452. plane_cfg = vkms_config_create_plane(config);
  453. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg2);
  454. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg);
  455. vkms_config_plane_set_type(plane_cfg, DRM_PLANE_TYPE_PRIMARY);
  456. err = vkms_config_plane_attach_crtc(plane_cfg, crtc_cfg2);
  457. KUNIT_EXPECT_EQ(test, err, 0);
  458. err = vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg1);
  459. KUNIT_EXPECT_EQ(test, err, 0);
  460. err = vkms_config_encoder_attach_crtc(encoder_cfg, crtc_cfg2);
  461. KUNIT_EXPECT_EQ(test, err, 0);
  462. KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config));
  463. /* Invalid: Second CRTC without encoders */
  464. vkms_config_encoder_detach_crtc(encoder_cfg, crtc_cfg2);
  465. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  466. /* Valid: First CRTC with 2 possible encoder */
  467. vkms_config_destroy_plane(plane_cfg);
  468. vkms_config_destroy_crtc(config, crtc_cfg2);
  469. KUNIT_EXPECT_TRUE(test, vkms_config_is_valid(config));
  470. vkms_config_destroy(config);
  471. }
  472. static void vkms_config_test_invalid_connector_number(struct kunit *test)
  473. {
  474. struct vkms_config *config;
  475. struct vkms_config_connector *connector_cfg;
  476. int n;
  477. config = vkms_config_default_create(false, false, false, false);
  478. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  479. /* Invalid: No connectors */
  480. connector_cfg = get_first_connector(config);
  481. vkms_config_destroy_connector(connector_cfg);
  482. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  483. /* Invalid: Too many connectors */
  484. for (n = 0; n <= 32; n++)
  485. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, vkms_config_create_connector(config));
  486. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  487. vkms_config_destroy(config);
  488. }
  489. static void vkms_config_test_valid_connector_possible_encoders(struct kunit *test)
  490. {
  491. struct vkms_config *config;
  492. struct vkms_config_encoder *encoder_cfg;
  493. struct vkms_config_connector *connector_cfg;
  494. config = vkms_config_default_create(false, false, false, false);
  495. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  496. encoder_cfg = get_first_encoder(config);
  497. connector_cfg = get_first_connector(config);
  498. /* Invalid: Connector without a possible encoder */
  499. vkms_config_connector_detach_encoder(connector_cfg, encoder_cfg);
  500. KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));
  501. vkms_config_destroy(config);
  502. }
  503. static void vkms_config_test_attach_different_configs(struct kunit *test)
  504. {
  505. struct vkms_config *config1, *config2;
  506. struct vkms_config_plane *plane_cfg1, *plane_cfg2;
  507. struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2;
  508. struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2;
  509. struct vkms_config_connector *connector_cfg1, *connector_cfg2;
  510. int err;
  511. config1 = vkms_config_create("test1");
  512. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config1);
  513. config2 = vkms_config_create("test2");
  514. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config2);
  515. plane_cfg1 = vkms_config_create_plane(config1);
  516. crtc_cfg1 = vkms_config_create_crtc(config1);
  517. encoder_cfg1 = vkms_config_create_encoder(config1);
  518. connector_cfg1 = vkms_config_create_connector(config1);
  519. plane_cfg2 = vkms_config_create_plane(config2);
  520. crtc_cfg2 = vkms_config_create_crtc(config2);
  521. encoder_cfg2 = vkms_config_create_encoder(config2);
  522. connector_cfg2 = vkms_config_create_connector(config2);
  523. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg1);
  524. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg2);
  525. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg1);
  526. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg2);
  527. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg1);
  528. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg2);
  529. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg1);
  530. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg2);
  531. err = vkms_config_plane_attach_crtc(plane_cfg1, crtc_cfg2);
  532. KUNIT_EXPECT_NE(test, err, 0);
  533. err = vkms_config_plane_attach_crtc(plane_cfg2, crtc_cfg1);
  534. KUNIT_EXPECT_NE(test, err, 0);
  535. err = vkms_config_encoder_attach_crtc(encoder_cfg1, crtc_cfg2);
  536. KUNIT_EXPECT_NE(test, err, 0);
  537. err = vkms_config_encoder_attach_crtc(encoder_cfg2, crtc_cfg1);
  538. KUNIT_EXPECT_NE(test, err, 0);
  539. err = vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg2);
  540. KUNIT_EXPECT_NE(test, err, 0);
  541. err = vkms_config_connector_attach_encoder(connector_cfg2, encoder_cfg1);
  542. KUNIT_EXPECT_NE(test, err, 0);
  543. vkms_config_destroy(config1);
  544. vkms_config_destroy(config2);
  545. }
  546. static void vkms_config_test_plane_attach_crtc(struct kunit *test)
  547. {
  548. struct vkms_config *config;
  549. struct vkms_config_plane *overlay_cfg;
  550. struct vkms_config_plane *primary_cfg;
  551. struct vkms_config_plane *cursor_cfg;
  552. struct vkms_config_crtc *crtc_cfg;
  553. int err;
  554. config = vkms_config_create("test");
  555. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  556. overlay_cfg = vkms_config_create_plane(config);
  557. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, overlay_cfg);
  558. vkms_config_plane_set_type(overlay_cfg, DRM_PLANE_TYPE_OVERLAY);
  559. primary_cfg = vkms_config_create_plane(config);
  560. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, primary_cfg);
  561. vkms_config_plane_set_type(primary_cfg, DRM_PLANE_TYPE_PRIMARY);
  562. cursor_cfg = vkms_config_create_plane(config);
  563. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, cursor_cfg);
  564. vkms_config_plane_set_type(cursor_cfg, DRM_PLANE_TYPE_CURSOR);
  565. crtc_cfg = vkms_config_create_crtc(config);
  566. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg);
  567. /* No primary or cursor planes */
  568. KUNIT_EXPECT_NULL(test, vkms_config_crtc_primary_plane(config, crtc_cfg));
  569. KUNIT_EXPECT_NULL(test, vkms_config_crtc_cursor_plane(config, crtc_cfg));
  570. /* Overlay plane, but no primary or cursor planes */
  571. err = vkms_config_plane_attach_crtc(overlay_cfg, crtc_cfg);
  572. KUNIT_EXPECT_EQ(test, err, 0);
  573. KUNIT_EXPECT_NULL(test, vkms_config_crtc_primary_plane(config, crtc_cfg));
  574. KUNIT_EXPECT_NULL(test, vkms_config_crtc_cursor_plane(config, crtc_cfg));
  575. /* Primary plane, attaching it twice must fail */
  576. err = vkms_config_plane_attach_crtc(primary_cfg, crtc_cfg);
  577. KUNIT_EXPECT_EQ(test, err, 0);
  578. err = vkms_config_plane_attach_crtc(primary_cfg, crtc_cfg);
  579. KUNIT_EXPECT_NE(test, err, 0);
  580. KUNIT_EXPECT_PTR_EQ(test,
  581. vkms_config_crtc_primary_plane(config, crtc_cfg),
  582. primary_cfg);
  583. KUNIT_EXPECT_NULL(test, vkms_config_crtc_cursor_plane(config, crtc_cfg));
  584. /* Primary and cursor planes */
  585. err = vkms_config_plane_attach_crtc(cursor_cfg, crtc_cfg);
  586. KUNIT_EXPECT_EQ(test, err, 0);
  587. KUNIT_EXPECT_PTR_EQ(test,
  588. vkms_config_crtc_primary_plane(config, crtc_cfg),
  589. primary_cfg);
  590. KUNIT_EXPECT_PTR_EQ(test,
  591. vkms_config_crtc_cursor_plane(config, crtc_cfg),
  592. cursor_cfg);
  593. /* Detach primary and destroy cursor plane */
  594. vkms_config_plane_detach_crtc(overlay_cfg, crtc_cfg);
  595. vkms_config_plane_detach_crtc(primary_cfg, crtc_cfg);
  596. vkms_config_destroy_plane(cursor_cfg);
  597. KUNIT_EXPECT_NULL(test, vkms_config_crtc_primary_plane(config, crtc_cfg));
  598. KUNIT_EXPECT_NULL(test, vkms_config_crtc_cursor_plane(config, crtc_cfg));
  599. vkms_config_destroy(config);
  600. }
  601. static void vkms_config_test_plane_get_possible_crtcs(struct kunit *test)
  602. {
  603. struct vkms_config *config;
  604. struct vkms_config_plane *plane_cfg1, *plane_cfg2;
  605. struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2;
  606. struct vkms_config_crtc *possible_crtc;
  607. unsigned long idx = 0;
  608. int n_crtcs = 0;
  609. int err;
  610. config = vkms_config_create("test");
  611. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  612. plane_cfg1 = vkms_config_create_plane(config);
  613. plane_cfg2 = vkms_config_create_plane(config);
  614. crtc_cfg1 = vkms_config_create_crtc(config);
  615. crtc_cfg2 = vkms_config_create_crtc(config);
  616. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg1);
  617. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, plane_cfg2);
  618. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg1);
  619. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg2);
  620. /* No possible CRTCs */
  621. vkms_config_plane_for_each_possible_crtc(plane_cfg1, idx, possible_crtc)
  622. KUNIT_FAIL(test, "Unexpected possible CRTC");
  623. vkms_config_plane_for_each_possible_crtc(plane_cfg2, idx, possible_crtc)
  624. KUNIT_FAIL(test, "Unexpected possible CRTC");
  625. /* Plane 1 attached to CRTC 1 and 2 */
  626. err = vkms_config_plane_attach_crtc(plane_cfg1, crtc_cfg1);
  627. KUNIT_EXPECT_EQ(test, err, 0);
  628. err = vkms_config_plane_attach_crtc(plane_cfg1, crtc_cfg2);
  629. KUNIT_EXPECT_EQ(test, err, 0);
  630. vkms_config_plane_for_each_possible_crtc(plane_cfg1, idx, possible_crtc) {
  631. n_crtcs++;
  632. if (possible_crtc != crtc_cfg1 && possible_crtc != crtc_cfg2)
  633. KUNIT_FAIL(test, "Unexpected possible CRTC");
  634. }
  635. KUNIT_ASSERT_EQ(test, n_crtcs, 2);
  636. n_crtcs = 0;
  637. vkms_config_plane_for_each_possible_crtc(plane_cfg2, idx, possible_crtc)
  638. KUNIT_FAIL(test, "Unexpected possible CRTC");
  639. /* Plane 1 attached to CRTC 1 and plane 2 to CRTC 2 */
  640. vkms_config_plane_detach_crtc(plane_cfg1, crtc_cfg2);
  641. vkms_config_plane_for_each_possible_crtc(plane_cfg1, idx, possible_crtc) {
  642. n_crtcs++;
  643. if (possible_crtc != crtc_cfg1)
  644. KUNIT_FAIL(test, "Unexpected possible CRTC");
  645. }
  646. KUNIT_ASSERT_EQ(test, n_crtcs, 1);
  647. n_crtcs = 0;
  648. err = vkms_config_plane_attach_crtc(plane_cfg2, crtc_cfg2);
  649. KUNIT_EXPECT_EQ(test, err, 0);
  650. vkms_config_plane_for_each_possible_crtc(plane_cfg2, idx, possible_crtc) {
  651. n_crtcs++;
  652. if (possible_crtc != crtc_cfg2)
  653. KUNIT_FAIL(test, "Unexpected possible CRTC");
  654. }
  655. KUNIT_ASSERT_EQ(test, n_crtcs, 1);
  656. vkms_config_destroy(config);
  657. }
  658. static void vkms_config_test_encoder_get_possible_crtcs(struct kunit *test)
  659. {
  660. struct vkms_config *config;
  661. struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2;
  662. struct vkms_config_crtc *crtc_cfg1, *crtc_cfg2;
  663. struct vkms_config_crtc *possible_crtc;
  664. unsigned long idx = 0;
  665. int n_crtcs = 0;
  666. int err;
  667. config = vkms_config_create("test");
  668. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  669. encoder_cfg1 = vkms_config_create_encoder(config);
  670. encoder_cfg2 = vkms_config_create_encoder(config);
  671. crtc_cfg1 = vkms_config_create_crtc(config);
  672. crtc_cfg2 = vkms_config_create_crtc(config);
  673. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg1);
  674. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg2);
  675. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg1);
  676. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_cfg2);
  677. /* No possible CRTCs */
  678. vkms_config_encoder_for_each_possible_crtc(encoder_cfg1, idx, possible_crtc)
  679. KUNIT_FAIL(test, "Unexpected possible CRTC");
  680. vkms_config_encoder_for_each_possible_crtc(encoder_cfg2, idx, possible_crtc)
  681. KUNIT_FAIL(test, "Unexpected possible CRTC");
  682. /* Encoder 1 attached to CRTC 1 and 2 */
  683. err = vkms_config_encoder_attach_crtc(encoder_cfg1, crtc_cfg1);
  684. KUNIT_EXPECT_EQ(test, err, 0);
  685. err = vkms_config_encoder_attach_crtc(encoder_cfg1, crtc_cfg2);
  686. KUNIT_EXPECT_EQ(test, err, 0);
  687. vkms_config_encoder_for_each_possible_crtc(encoder_cfg1, idx, possible_crtc) {
  688. n_crtcs++;
  689. if (possible_crtc != crtc_cfg1 && possible_crtc != crtc_cfg2)
  690. KUNIT_FAIL(test, "Unexpected possible CRTC");
  691. }
  692. KUNIT_ASSERT_EQ(test, n_crtcs, 2);
  693. n_crtcs = 0;
  694. vkms_config_encoder_for_each_possible_crtc(encoder_cfg2, idx, possible_crtc)
  695. KUNIT_FAIL(test, "Unexpected possible CRTC");
  696. /* Encoder 1 attached to CRTC 1 and encoder 2 to CRTC 2 */
  697. vkms_config_encoder_detach_crtc(encoder_cfg1, crtc_cfg2);
  698. vkms_config_encoder_for_each_possible_crtc(encoder_cfg1, idx, possible_crtc) {
  699. n_crtcs++;
  700. if (possible_crtc != crtc_cfg1)
  701. KUNIT_FAIL(test, "Unexpected possible CRTC");
  702. }
  703. KUNIT_ASSERT_EQ(test, n_crtcs, 1);
  704. n_crtcs = 0;
  705. err = vkms_config_encoder_attach_crtc(encoder_cfg2, crtc_cfg2);
  706. KUNIT_EXPECT_EQ(test, err, 0);
  707. vkms_config_encoder_for_each_possible_crtc(encoder_cfg2, idx, possible_crtc) {
  708. n_crtcs++;
  709. if (possible_crtc != crtc_cfg2)
  710. KUNIT_FAIL(test, "Unexpected possible CRTC");
  711. }
  712. KUNIT_ASSERT_EQ(test, n_crtcs, 1);
  713. vkms_config_destroy(config);
  714. }
  715. static void vkms_config_test_connector_get_possible_encoders(struct kunit *test)
  716. {
  717. struct vkms_config *config;
  718. struct vkms_config_connector *connector_cfg1, *connector_cfg2;
  719. struct vkms_config_encoder *encoder_cfg1, *encoder_cfg2;
  720. struct vkms_config_encoder *possible_encoder;
  721. unsigned long idx = 0;
  722. int n_encoders = 0;
  723. int err;
  724. config = vkms_config_create("test");
  725. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  726. connector_cfg1 = vkms_config_create_connector(config);
  727. connector_cfg2 = vkms_config_create_connector(config);
  728. encoder_cfg1 = vkms_config_create_encoder(config);
  729. encoder_cfg2 = vkms_config_create_encoder(config);
  730. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg1);
  731. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg2);
  732. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg1);
  733. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, encoder_cfg2);
  734. /* No possible encoders */
  735. vkms_config_connector_for_each_possible_encoder(connector_cfg1, idx,
  736. possible_encoder)
  737. KUNIT_FAIL(test, "Unexpected possible encoder");
  738. vkms_config_connector_for_each_possible_encoder(connector_cfg2, idx,
  739. possible_encoder)
  740. KUNIT_FAIL(test, "Unexpected possible encoder");
  741. /* Connector 1 attached to encoders 1 and 2 */
  742. err = vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg1);
  743. KUNIT_EXPECT_EQ(test, err, 0);
  744. err = vkms_config_connector_attach_encoder(connector_cfg1, encoder_cfg2);
  745. KUNIT_EXPECT_EQ(test, err, 0);
  746. vkms_config_connector_for_each_possible_encoder(connector_cfg1, idx,
  747. possible_encoder) {
  748. n_encoders++;
  749. if (possible_encoder != encoder_cfg1 &&
  750. possible_encoder != encoder_cfg2)
  751. KUNIT_FAIL(test, "Unexpected possible encoder");
  752. }
  753. KUNIT_ASSERT_EQ(test, n_encoders, 2);
  754. n_encoders = 0;
  755. vkms_config_connector_for_each_possible_encoder(connector_cfg2, idx,
  756. possible_encoder)
  757. KUNIT_FAIL(test, "Unexpected possible encoder");
  758. /* Connector 1 attached to encoder 1 and connector 2 to encoder 2 */
  759. vkms_config_connector_detach_encoder(connector_cfg1, encoder_cfg2);
  760. vkms_config_connector_for_each_possible_encoder(connector_cfg1, idx,
  761. possible_encoder) {
  762. n_encoders++;
  763. if (possible_encoder != encoder_cfg1)
  764. KUNIT_FAIL(test, "Unexpected possible encoder");
  765. }
  766. KUNIT_ASSERT_EQ(test, n_encoders, 1);
  767. n_encoders = 0;
  768. err = vkms_config_connector_attach_encoder(connector_cfg2, encoder_cfg2);
  769. KUNIT_EXPECT_EQ(test, err, 0);
  770. vkms_config_connector_for_each_possible_encoder(connector_cfg2, idx,
  771. possible_encoder) {
  772. n_encoders++;
  773. if (possible_encoder != encoder_cfg2)
  774. KUNIT_FAIL(test, "Unexpected possible encoder");
  775. }
  776. KUNIT_ASSERT_EQ(test, n_encoders, 1);
  777. vkms_config_destroy(config);
  778. }
  779. static void vkms_config_test_connector_status(struct kunit *test)
  780. {
  781. struct vkms_config *config;
  782. struct vkms_config_connector *connector_cfg;
  783. enum drm_connector_status status;
  784. config = vkms_config_create("test");
  785. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);
  786. connector_cfg = vkms_config_create_connector(config);
  787. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, connector_cfg);
  788. status = vkms_config_connector_get_status(connector_cfg);
  789. KUNIT_EXPECT_EQ(test, status, connector_status_connected);
  790. vkms_config_connector_set_status(connector_cfg,
  791. connector_status_disconnected);
  792. status = vkms_config_connector_get_status(connector_cfg);
  793. KUNIT_EXPECT_EQ(test, status, connector_status_disconnected);
  794. vkms_config_destroy(config);
  795. }
  796. static struct kunit_case vkms_config_test_cases[] = {
  797. KUNIT_CASE(vkms_config_test_empty_config),
  798. KUNIT_CASE_PARAM(vkms_config_test_default_config,
  799. default_config_gen_params),
  800. KUNIT_CASE(vkms_config_test_get_planes),
  801. KUNIT_CASE(vkms_config_test_get_crtcs),
  802. KUNIT_CASE(vkms_config_test_get_encoders),
  803. KUNIT_CASE(vkms_config_test_get_connectors),
  804. KUNIT_CASE(vkms_config_test_invalid_plane_number),
  805. KUNIT_CASE(vkms_config_test_valid_plane_type),
  806. KUNIT_CASE(vkms_config_test_valid_plane_possible_crtcs),
  807. KUNIT_CASE(vkms_config_test_invalid_crtc_number),
  808. KUNIT_CASE(vkms_config_test_invalid_encoder_number),
  809. KUNIT_CASE(vkms_config_test_valid_encoder_possible_crtcs),
  810. KUNIT_CASE(vkms_config_test_invalid_connector_number),
  811. KUNIT_CASE(vkms_config_test_valid_connector_possible_encoders),
  812. KUNIT_CASE(vkms_config_test_attach_different_configs),
  813. KUNIT_CASE(vkms_config_test_plane_attach_crtc),
  814. KUNIT_CASE(vkms_config_test_plane_get_possible_crtcs),
  815. KUNIT_CASE(vkms_config_test_encoder_get_possible_crtcs),
  816. KUNIT_CASE(vkms_config_test_connector_get_possible_encoders),
  817. KUNIT_CASE(vkms_config_test_connector_status),
  818. {}
  819. };
  820. static struct kunit_suite vkms_config_test_suite = {
  821. .name = "vkms-config",
  822. .test_cases = vkms_config_test_cases,
  823. };
  824. kunit_test_suite(vkms_config_test_suite);
  825. MODULE_LICENSE("GPL");
  826. MODULE_DESCRIPTION("Kunit test for vkms config utility");