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