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
sysfb_build_fourcc_list_case_desc(struct sysfb_build_fourcc_list_case * t,char * desc)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
drm_test_sysfb_build_fourcc_list(struct kunit * test)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