xref: /linux/drivers/gpu/drm/tests/drm_sysfb_modeset_test.c (revision 8d2b0853add1d7534dc0794e3c8e0b9e8c4ec640)
14f522a44SThomas Zimmermann // SPDX-License-Identifier: GPL-2.0+
24f522a44SThomas Zimmermann 
34f522a44SThomas Zimmermann #include <kunit/test.h>
44f522a44SThomas Zimmermann 
54f522a44SThomas Zimmermann #include <drm/drm_fourcc.h>
64f522a44SThomas Zimmermann #include <drm/drm_kunit_helpers.h>
74f522a44SThomas Zimmermann 
8*1a45ef02SThomas Zimmermann #include "../sysfb/drm_sysfb_helper.h"
9*1a45ef02SThomas Zimmermann 
104f522a44SThomas Zimmermann #define TEST_BUF_SIZE 50
114f522a44SThomas Zimmermann 
12*1a45ef02SThomas Zimmermann struct sysfb_build_fourcc_list_case {
134f522a44SThomas Zimmermann 	const char *name;
144f522a44SThomas Zimmermann 	u32 native_fourccs[TEST_BUF_SIZE];
154f522a44SThomas Zimmermann 	size_t native_fourccs_size;
164f522a44SThomas Zimmermann 	u32 expected[TEST_BUF_SIZE];
174f522a44SThomas Zimmermann 	size_t expected_fourccs_size;
184f522a44SThomas Zimmermann };
194f522a44SThomas Zimmermann 
20*1a45ef02SThomas Zimmermann static struct sysfb_build_fourcc_list_case sysfb_build_fourcc_list_cases[] = {
214f522a44SThomas Zimmermann 	{
224f522a44SThomas Zimmermann 		.name = "no native formats",
234f522a44SThomas Zimmermann 		.native_fourccs = { },
244f522a44SThomas Zimmermann 		.native_fourccs_size = 0,
254f522a44SThomas Zimmermann 		.expected = { DRM_FORMAT_XRGB8888 },
264f522a44SThomas Zimmermann 		.expected_fourccs_size = 1,
274f522a44SThomas Zimmermann 	},
284f522a44SThomas Zimmermann 	{
294f522a44SThomas Zimmermann 		.name = "XRGB8888 as native format",
304f522a44SThomas Zimmermann 		.native_fourccs = { DRM_FORMAT_XRGB8888 },
314f522a44SThomas Zimmermann 		.native_fourccs_size = 1,
324f522a44SThomas Zimmermann 		.expected = { DRM_FORMAT_XRGB8888 },
334f522a44SThomas Zimmermann 		.expected_fourccs_size = 1,
344f522a44SThomas Zimmermann 	},
354f522a44SThomas Zimmermann 	{
364f522a44SThomas Zimmermann 		.name = "remove duplicates",
374f522a44SThomas Zimmermann 		.native_fourccs = {
384f522a44SThomas Zimmermann 			DRM_FORMAT_XRGB8888,
394f522a44SThomas Zimmermann 			DRM_FORMAT_XRGB8888,
404f522a44SThomas Zimmermann 			DRM_FORMAT_RGB888,
414f522a44SThomas Zimmermann 			DRM_FORMAT_RGB888,
424f522a44SThomas Zimmermann 			DRM_FORMAT_RGB888,
434f522a44SThomas Zimmermann 			DRM_FORMAT_XRGB8888,
444f522a44SThomas Zimmermann 			DRM_FORMAT_RGB888,
454f522a44SThomas Zimmermann 			DRM_FORMAT_RGB565,
464f522a44SThomas Zimmermann 			DRM_FORMAT_RGB888,
474f522a44SThomas Zimmermann 			DRM_FORMAT_XRGB8888,
484f522a44SThomas Zimmermann 			DRM_FORMAT_RGB565,
494f522a44SThomas Zimmermann 			DRM_FORMAT_RGB565,
504f522a44SThomas Zimmermann 			DRM_FORMAT_XRGB8888,
514f522a44SThomas Zimmermann 		},
524f522a44SThomas Zimmermann 		.native_fourccs_size = 11,
534f522a44SThomas Zimmermann 		.expected = {
544f522a44SThomas Zimmermann 			DRM_FORMAT_XRGB8888,
554f522a44SThomas Zimmermann 			DRM_FORMAT_RGB888,
564f522a44SThomas Zimmermann 			DRM_FORMAT_RGB565,
574f522a44SThomas Zimmermann 		},
584f522a44SThomas Zimmermann 		.expected_fourccs_size = 3,
594f522a44SThomas Zimmermann 	},
604f522a44SThomas Zimmermann 	{
614f522a44SThomas Zimmermann 		.name = "convert alpha formats",
624f522a44SThomas Zimmermann 		.native_fourccs = {
634f522a44SThomas Zimmermann 			DRM_FORMAT_ARGB1555,
644f522a44SThomas Zimmermann 			DRM_FORMAT_ABGR1555,
654f522a44SThomas Zimmermann 			DRM_FORMAT_RGBA5551,
664f522a44SThomas Zimmermann 			DRM_FORMAT_BGRA5551,
674f522a44SThomas Zimmermann 			DRM_FORMAT_ARGB8888,
684f522a44SThomas Zimmermann 			DRM_FORMAT_ABGR8888,
694f522a44SThomas Zimmermann 			DRM_FORMAT_RGBA8888,
704f522a44SThomas Zimmermann 			DRM_FORMAT_BGRA8888,
714f522a44SThomas Zimmermann 			DRM_FORMAT_ARGB2101010,
724f522a44SThomas Zimmermann 			DRM_FORMAT_ABGR2101010,
734f522a44SThomas Zimmermann 			DRM_FORMAT_RGBA1010102,
744f522a44SThomas Zimmermann 			DRM_FORMAT_BGRA1010102,
754f522a44SThomas Zimmermann 		},
764f522a44SThomas Zimmermann 		.native_fourccs_size = 12,
774f522a44SThomas Zimmermann 		.expected = {
784f522a44SThomas Zimmermann 			DRM_FORMAT_XRGB1555,
794f522a44SThomas Zimmermann 			DRM_FORMAT_XBGR1555,
804f522a44SThomas Zimmermann 			DRM_FORMAT_RGBX5551,
814f522a44SThomas Zimmermann 			DRM_FORMAT_BGRX5551,
824f522a44SThomas Zimmermann 			DRM_FORMAT_XRGB8888,
834f522a44SThomas Zimmermann 			DRM_FORMAT_XBGR8888,
844f522a44SThomas Zimmermann 			DRM_FORMAT_RGBX8888,
854f522a44SThomas Zimmermann 			DRM_FORMAT_BGRX8888,
864f522a44SThomas Zimmermann 			DRM_FORMAT_XRGB2101010,
874f522a44SThomas Zimmermann 			DRM_FORMAT_XBGR2101010,
884f522a44SThomas Zimmermann 			DRM_FORMAT_RGBX1010102,
894f522a44SThomas Zimmermann 			DRM_FORMAT_BGRX1010102,
904f522a44SThomas Zimmermann 		},
914f522a44SThomas Zimmermann 		.expected_fourccs_size = 12,
924f522a44SThomas Zimmermann 	},
934f522a44SThomas Zimmermann 	{
944f522a44SThomas Zimmermann 		.name = "random formats",
954f522a44SThomas Zimmermann 		.native_fourccs = {
964f522a44SThomas Zimmermann 			DRM_FORMAT_Y212,
974f522a44SThomas Zimmermann 			DRM_FORMAT_ARGB1555,
984f522a44SThomas Zimmermann 			DRM_FORMAT_ABGR16161616F,
994f522a44SThomas Zimmermann 			DRM_FORMAT_C8,
1004f522a44SThomas Zimmermann 			DRM_FORMAT_BGR888,
1014f522a44SThomas Zimmermann 			DRM_FORMAT_XRGB1555,
1024f522a44SThomas Zimmermann 			DRM_FORMAT_RGBA5551,
1034f522a44SThomas Zimmermann 			DRM_FORMAT_BGR565_A8,
1044f522a44SThomas Zimmermann 			DRM_FORMAT_R10,
1054f522a44SThomas Zimmermann 			DRM_FORMAT_XYUV8888,
1064f522a44SThomas Zimmermann 		},
1074f522a44SThomas Zimmermann 		.native_fourccs_size = 10,
1084f522a44SThomas Zimmermann 		.expected = {
1094f522a44SThomas Zimmermann 			DRM_FORMAT_Y212,
1104f522a44SThomas Zimmermann 			DRM_FORMAT_XRGB1555,
1114f522a44SThomas Zimmermann 			DRM_FORMAT_ABGR16161616F,
1124f522a44SThomas Zimmermann 			DRM_FORMAT_C8,
1134f522a44SThomas Zimmermann 			DRM_FORMAT_BGR888,
1144f522a44SThomas Zimmermann 			DRM_FORMAT_RGBX5551,
1154f522a44SThomas Zimmermann 			DRM_FORMAT_BGR565_A8,
1164f522a44SThomas Zimmermann 			DRM_FORMAT_R10,
1174f522a44SThomas Zimmermann 			DRM_FORMAT_XYUV8888,
1184f522a44SThomas Zimmermann 			DRM_FORMAT_XRGB8888,
1194f522a44SThomas Zimmermann 		},
1204f522a44SThomas Zimmermann 		.expected_fourccs_size = 10,
1214f522a44SThomas Zimmermann 	},
1224f522a44SThomas Zimmermann };
1234f522a44SThomas Zimmermann 
124*1a45ef02SThomas Zimmermann static void sysfb_build_fourcc_list_case_desc(struct sysfb_build_fourcc_list_case *t, char *desc)
1254f522a44SThomas Zimmermann {
1264f522a44SThomas Zimmermann 	strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);
1274f522a44SThomas Zimmermann }
1284f522a44SThomas Zimmermann 
129*1a45ef02SThomas Zimmermann KUNIT_ARRAY_PARAM(sysfb_build_fourcc_list, sysfb_build_fourcc_list_cases,
130*1a45ef02SThomas Zimmermann 		  sysfb_build_fourcc_list_case_desc);
1314f522a44SThomas Zimmermann 
132*1a45ef02SThomas Zimmermann static void drm_test_sysfb_build_fourcc_list(struct kunit *test)
1334f522a44SThomas Zimmermann {
134*1a45ef02SThomas Zimmermann 	const struct sysfb_build_fourcc_list_case *params = test->param_value;
1354f522a44SThomas Zimmermann 	u32 fourccs_out[TEST_BUF_SIZE] = {0};
1364f522a44SThomas Zimmermann 	size_t nfourccs_out;
1374f522a44SThomas Zimmermann 	struct drm_device *drm;
1384f522a44SThomas Zimmermann 	struct device *dev;
1394f522a44SThomas Zimmermann 
1404f522a44SThomas Zimmermann 	dev = drm_kunit_helper_alloc_device(test);
1414f522a44SThomas Zimmermann 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
1424f522a44SThomas Zimmermann 
1434f522a44SThomas Zimmermann 	drm = __drm_kunit_helper_alloc_drm_device(test, dev, sizeof(*drm), 0, DRIVER_MODESET);
1444f522a44SThomas Zimmermann 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, drm);
1454f522a44SThomas Zimmermann 
146*1a45ef02SThomas Zimmermann 	nfourccs_out = drm_sysfb_build_fourcc_list(drm, params->native_fourccs,
1474f522a44SThomas Zimmermann 						   params->native_fourccs_size,
1484f522a44SThomas Zimmermann 						   fourccs_out, TEST_BUF_SIZE);
1494f522a44SThomas Zimmermann 
1504f522a44SThomas Zimmermann 	KUNIT_EXPECT_EQ(test, nfourccs_out, params->expected_fourccs_size);
1514f522a44SThomas Zimmermann 	KUNIT_EXPECT_MEMEQ(test, fourccs_out, params->expected, TEST_BUF_SIZE);
1524f522a44SThomas Zimmermann }
1534f522a44SThomas Zimmermann 
1544f522a44SThomas Zimmermann static struct kunit_case drm_sysfb_modeset_test_cases[] = {
155*1a45ef02SThomas Zimmermann 	KUNIT_CASE_PARAM(drm_test_sysfb_build_fourcc_list, sysfb_build_fourcc_list_gen_params),
1564f522a44SThomas Zimmermann 	{}
1574f522a44SThomas Zimmermann };
1584f522a44SThomas Zimmermann 
1594f522a44SThomas Zimmermann static struct kunit_suite drm_sysfb_modeset_test_suite = {
1604f522a44SThomas Zimmermann 	.name = "drm_sysfb_modeset_test",
1614f522a44SThomas Zimmermann 	.test_cases = drm_sysfb_modeset_test_cases,
1624f522a44SThomas Zimmermann };
1634f522a44SThomas Zimmermann 
1644f522a44SThomas Zimmermann kunit_test_suite(drm_sysfb_modeset_test_suite);
1654f522a44SThomas Zimmermann 
1664f522a44SThomas Zimmermann MODULE_DESCRIPTION("KUnit tests for the drm_sysfb_modeset APIs");
1674f522a44SThomas Zimmermann MODULE_LICENSE("GPL");
1684f522a44SThomas Zimmermann MODULE_AUTHOR("José Expósito <jose.exposito89@gmail.com>");
169