xref: /linux/drivers/gpu/drm/tests/drm_sysfb_modeset_test.c (revision 8d2b0853add1d7534dc0794e3c8e0b9e8c4ec640)
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