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