drm_sysfb_modeset_test.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // SPDX-License-Identifier: GPL-2.0+
  2. #include <kunit/test.h>
  3. #include <drm/drm_fourcc.h>
  4. #include <drm/drm_kunit_helpers.h>
  5. #include "../sysfb/drm_sysfb_helper.h"
  6. #define TEST_BUF_SIZE 50
  7. struct sysfb_build_fourcc_list_case {
  8. const char *name;
  9. u32 native_fourccs[TEST_BUF_SIZE];
  10. size_t native_fourccs_size;
  11. u32 expected[TEST_BUF_SIZE];
  12. size_t expected_fourccs_size;
  13. };
  14. static struct sysfb_build_fourcc_list_case sysfb_build_fourcc_list_cases[] = {
  15. {
  16. .name = "no native formats",
  17. .native_fourccs = { },
  18. .native_fourccs_size = 0,
  19. .expected = { DRM_FORMAT_XRGB8888 },
  20. .expected_fourccs_size = 1,
  21. },
  22. {
  23. .name = "XRGB8888 as native format",
  24. .native_fourccs = { DRM_FORMAT_XRGB8888 },
  25. .native_fourccs_size = 1,
  26. .expected = { DRM_FORMAT_XRGB8888 },
  27. .expected_fourccs_size = 1,
  28. },
  29. {
  30. .name = "remove duplicates",
  31. .native_fourccs = {
  32. DRM_FORMAT_XRGB8888,
  33. DRM_FORMAT_XRGB8888,
  34. DRM_FORMAT_RGB888,
  35. DRM_FORMAT_RGB888,
  36. DRM_FORMAT_RGB888,
  37. DRM_FORMAT_XRGB8888,
  38. DRM_FORMAT_RGB888,
  39. DRM_FORMAT_RGB565,
  40. DRM_FORMAT_RGB888,
  41. DRM_FORMAT_XRGB8888,
  42. DRM_FORMAT_RGB565,
  43. DRM_FORMAT_RGB565,
  44. DRM_FORMAT_XRGB8888,
  45. },
  46. .native_fourccs_size = 11,
  47. .expected = {
  48. DRM_FORMAT_XRGB8888,
  49. DRM_FORMAT_RGB888,
  50. DRM_FORMAT_RGB565,
  51. },
  52. .expected_fourccs_size = 3,
  53. },
  54. {
  55. .name = "convert alpha formats",
  56. .native_fourccs = {
  57. DRM_FORMAT_ARGB1555,
  58. DRM_FORMAT_ABGR1555,
  59. DRM_FORMAT_RGBA5551,
  60. DRM_FORMAT_BGRA5551,
  61. DRM_FORMAT_ARGB8888,
  62. DRM_FORMAT_ABGR8888,
  63. DRM_FORMAT_RGBA8888,
  64. DRM_FORMAT_BGRA8888,
  65. DRM_FORMAT_ARGB2101010,
  66. DRM_FORMAT_ABGR2101010,
  67. DRM_FORMAT_RGBA1010102,
  68. DRM_FORMAT_BGRA1010102,
  69. },
  70. .native_fourccs_size = 12,
  71. .expected = {
  72. DRM_FORMAT_XRGB1555,
  73. DRM_FORMAT_XBGR1555,
  74. DRM_FORMAT_RGBX5551,
  75. DRM_FORMAT_BGRX5551,
  76. DRM_FORMAT_XRGB8888,
  77. DRM_FORMAT_XBGR8888,
  78. DRM_FORMAT_RGBX8888,
  79. DRM_FORMAT_BGRX8888,
  80. DRM_FORMAT_XRGB2101010,
  81. DRM_FORMAT_XBGR2101010,
  82. DRM_FORMAT_RGBX1010102,
  83. DRM_FORMAT_BGRX1010102,
  84. },
  85. .expected_fourccs_size = 12,
  86. },
  87. {
  88. .name = "random formats",
  89. .native_fourccs = {
  90. DRM_FORMAT_Y212,
  91. DRM_FORMAT_ARGB1555,
  92. DRM_FORMAT_ABGR16161616F,
  93. DRM_FORMAT_C8,
  94. DRM_FORMAT_BGR888,
  95. DRM_FORMAT_XRGB1555,
  96. DRM_FORMAT_RGBA5551,
  97. DRM_FORMAT_BGR565_A8,
  98. DRM_FORMAT_R10,
  99. DRM_FORMAT_XYUV8888,
  100. },
  101. .native_fourccs_size = 10,
  102. .expected = {
  103. DRM_FORMAT_Y212,
  104. DRM_FORMAT_XRGB1555,
  105. DRM_FORMAT_ABGR16161616F,
  106. DRM_FORMAT_C8,
  107. DRM_FORMAT_BGR888,
  108. DRM_FORMAT_RGBX5551,
  109. DRM_FORMAT_BGR565_A8,
  110. DRM_FORMAT_R10,
  111. DRM_FORMAT_XYUV8888,
  112. DRM_FORMAT_XRGB8888,
  113. },
  114. .expected_fourccs_size = 10,
  115. },
  116. };
  117. static void sysfb_build_fourcc_list_case_desc(struct sysfb_build_fourcc_list_case *t, char *desc)
  118. {
  119. strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);
  120. }
  121. KUNIT_ARRAY_PARAM(sysfb_build_fourcc_list, sysfb_build_fourcc_list_cases,
  122. sysfb_build_fourcc_list_case_desc);
  123. static void drm_test_sysfb_build_fourcc_list(struct kunit *test)
  124. {
  125. const struct sysfb_build_fourcc_list_case *params = test->param_value;
  126. u32 fourccs_out[TEST_BUF_SIZE] = {0};
  127. size_t nfourccs_out;
  128. struct drm_device *drm;
  129. struct device *dev;
  130. dev = drm_kunit_helper_alloc_device(test);
  131. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
  132. drm = __drm_kunit_helper_alloc_drm_device(test, dev, sizeof(*drm), 0, DRIVER_MODESET);
  133. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, drm);
  134. nfourccs_out = drm_sysfb_build_fourcc_list(drm, params->native_fourccs,
  135. params->native_fourccs_size,
  136. fourccs_out, TEST_BUF_SIZE);
  137. KUNIT_EXPECT_EQ(test, nfourccs_out, params->expected_fourccs_size);
  138. KUNIT_EXPECT_MEMEQ(test, fourccs_out, params->expected, TEST_BUF_SIZE);
  139. }
  140. static struct kunit_case drm_sysfb_modeset_test_cases[] = {
  141. KUNIT_CASE_PARAM(drm_test_sysfb_build_fourcc_list, sysfb_build_fourcc_list_gen_params),
  142. {}
  143. };
  144. static struct kunit_suite drm_sysfb_modeset_test_suite = {
  145. .name = "drm_sysfb_modeset_test",
  146. .test_cases = drm_sysfb_modeset_test_cases,
  147. };
  148. kunit_test_suite(drm_sysfb_modeset_test_suite);
  149. MODULE_DESCRIPTION("KUnit tests for the drm_sysfb_modeset APIs");
  150. MODULE_LICENSE("GPL");
  151. MODULE_AUTHOR("José Expósito <jose.exposito89@gmail.com>");