Merge tag 'drm-misc-next-2023-01-12' of git://anongit.freedesktop.org/drm/drm-misc...
[linux-block.git] / drivers / gpu / drm / tests / drm_format_helper_test.c
index 567c71f95edc520e297ad1222cfa3f9673ed9510..34e80eb6d96ef5a9b8b64c27e15b3847e414a400 100644 (file)
@@ -32,16 +32,41 @@ struct convert_to_rgb565_result {
        const u16 expected_swab[TEST_BUF_SIZE];
 };
 
+struct convert_to_xrgb1555_result {
+       unsigned int dst_pitch;
+       const u16 expected[TEST_BUF_SIZE];
+};
+
+struct convert_to_argb1555_result {
+       unsigned int dst_pitch;
+       const u16 expected[TEST_BUF_SIZE];
+};
+
+struct convert_to_rgba5551_result {
+       unsigned int dst_pitch;
+       const u16 expected[TEST_BUF_SIZE];
+};
+
 struct convert_to_rgb888_result {
        unsigned int dst_pitch;
        const u8 expected[TEST_BUF_SIZE];
 };
 
+struct convert_to_argb8888_result {
+       unsigned int dst_pitch;
+       const u32 expected[TEST_BUF_SIZE];
+};
+
 struct convert_to_xrgb2101010_result {
        unsigned int dst_pitch;
        const u32 expected[TEST_BUF_SIZE];
 };
 
+struct convert_to_argb2101010_result {
+       unsigned int dst_pitch;
+       const u32 expected[TEST_BUF_SIZE];
+};
+
 struct convert_xrgb8888_case {
        const char *name;
        unsigned int pitch;
@@ -50,8 +75,13 @@ struct convert_xrgb8888_case {
        struct convert_to_gray8_result gray8_result;
        struct convert_to_rgb332_result rgb332_result;
        struct convert_to_rgb565_result rgb565_result;
+       struct convert_to_xrgb1555_result xrgb1555_result;
+       struct convert_to_argb1555_result argb1555_result;
+       struct convert_to_rgba5551_result rgba5551_result;
        struct convert_to_rgb888_result rgb888_result;
+       struct convert_to_argb8888_result argb8888_result;
        struct convert_to_xrgb2101010_result xrgb2101010_result;
+       struct convert_to_argb2101010_result argb2101010_result;
 };
 
 static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
@@ -73,14 +103,34 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
                        .expected = { 0xF800 },
                        .expected_swab = { 0x00F8 },
                },
+               .xrgb1555_result = {
+                       .dst_pitch = 0,
+                       .expected = { 0x7C00 },
+               },
+               .argb1555_result = {
+                       .dst_pitch = 0,
+                       .expected = { 0xFC00 },
+               },
+               .rgba5551_result = {
+                       .dst_pitch = 0,
+                       .expected = { 0xF801 },
+               },
                .rgb888_result = {
                        .dst_pitch = 0,
                        .expected = { 0x00, 0x00, 0xFF },
                },
+               .argb8888_result = {
+                       .dst_pitch = 0,
+                       .expected = { 0xFFFF0000 },
+               },
                .xrgb2101010_result = {
                        .dst_pitch = 0,
                        .expected = { 0x3FF00000 },
                },
+               .argb2101010_result = {
+                       .dst_pitch = 0,
+                       .expected = { 0xFFF00000 },
+               },
        },
        {
                .name = "single_pixel_clip_rectangle",
@@ -103,14 +153,34 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
                        .expected = { 0xF800 },
                        .expected_swab = { 0x00F8 },
                },
+               .xrgb1555_result = {
+                       .dst_pitch = 0,
+                       .expected = { 0x7C00 },
+               },
+               .argb1555_result = {
+                       .dst_pitch = 0,
+                       .expected = { 0xFC00 },
+               },
+               .rgba5551_result = {
+                       .dst_pitch = 0,
+                       .expected = { 0xF801 },
+               },
                .rgb888_result = {
                        .dst_pitch = 0,
                        .expected = { 0x00, 0x00, 0xFF },
                },
+               .argb8888_result = {
+                       .dst_pitch = 0,
+                       .expected = { 0xFFFF0000 },
+               },
                .xrgb2101010_result = {
                        .dst_pitch = 0,
                        .expected = { 0x3FF00000 },
                },
+               .argb2101010_result = {
+                       .dst_pitch = 0,
+                       .expected = { 0xFFF00000 },
+               },
        },
        {
                /* Well known colors: White, black, red, green, blue, magenta,
@@ -160,6 +230,33 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
                                0xE0FF, 0xFF07,
                        },
                },
+               .xrgb1555_result = {
+                       .dst_pitch = 0,
+                       .expected = {
+                               0x7FFF, 0x0000,
+                               0x7C00, 0x03E0,
+                               0x001F, 0x7C1F,
+                               0x7FE0, 0x03FF,
+                       },
+               },
+               .argb1555_result = {
+                       .dst_pitch = 0,
+                       .expected = {
+                               0xFFFF, 0x8000,
+                               0xFC00, 0x83E0,
+                               0x801F, 0xFC1F,
+                               0xFFE0, 0x83FF,
+                       },
+               },
+               .rgba5551_result = {
+                       .dst_pitch = 0,
+                       .expected = {
+                               0xFFFF, 0x0001,
+                               0xF801, 0x07C1,
+                               0x003F, 0xF83F,
+                               0xFFC1, 0x07FF,
+                       },
+               },
                .rgb888_result = {
                        .dst_pitch = 0,
                        .expected = {
@@ -169,6 +266,15 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
                                0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
                        },
                },
+               .argb8888_result = {
+                       .dst_pitch = 0,
+                       .expected = {
+                               0xFFFFFFFF, 0xFF000000,
+                               0xFFFF0000, 0xFF00FF00,
+                               0xFF0000FF, 0xFFFF00FF,
+                               0xFFFFFF00, 0xFF00FFFF,
+                       },
+               },
                .xrgb2101010_result = {
                        .dst_pitch = 0,
                        .expected = {
@@ -178,6 +284,15 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
                                0x3FFFFC00, 0x000FFFFF,
                        },
                },
+               .argb2101010_result = {
+                       .dst_pitch = 0,
+                       .expected = {
+                               0xFFFFFFFF, 0xC0000000,
+                               0xFFF00000, 0xC00FFC00,
+                               0xC00003FF, 0xFFF003FF,
+                               0xFFFFFC00, 0xC00FFFFF,
+                       },
+               },
        },
        {
                /* Randomly picked colors. Full buffer within the clip area. */
@@ -218,6 +333,30 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
                                0x00A8, 0x8E6B, 0x330A, 0x0000, 0x0000,
                        },
                },
+               .xrgb1555_result = {
+                       .dst_pitch = 10,
+                       .expected = {
+                               0x0513, 0x0920, 0x5400, 0x0000, 0x0000,
+                               0x35CE, 0x0513, 0x0920, 0x0000, 0x0000,
+                               0x5400, 0x35CE, 0x0513, 0x0000, 0x0000,
+                       },
+               },
+               .argb1555_result = {
+                       .dst_pitch = 10,
+                       .expected = {
+                               0x8513, 0x8920, 0xD400, 0x0000, 0x0000,
+                               0xB5CE, 0x8513, 0x8920, 0x0000, 0x0000,
+                               0xD400, 0xB5CE, 0x8513, 0x0000, 0x0000,
+                       },
+               },
+               .rgba5551_result = {
+                       .dst_pitch = 10,
+                       .expected = {
+                               0x0A27, 0x1241, 0xA801, 0x0000, 0x0000,
+                               0x6B9D, 0x0A27, 0x1241, 0x0000, 0x0000,
+                               0xA801, 0x6B9D, 0x0A27, 0x0000, 0x0000,
+                       },
+               },
                .rgb888_result = {
                        .dst_pitch = 15,
                        .expected = {
@@ -229,6 +368,14 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
                                0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                        },
                },
+               .argb8888_result = {
+                       .dst_pitch = 20,
+                       .expected = {
+                               0xFF0E449C, 0xFF114D05, 0xFFA80303, 0x00000000, 0x00000000,
+                               0xFF6C7073, 0xFF0E449C, 0xFF114D05, 0x00000000, 0x00000000,
+                               0xFFA80303, 0xFF6C7073, 0xFF0E449C, 0x00000000, 0x00000000,
+                       },
+               },
                .xrgb2101010_result = {
                        .dst_pitch = 20,
                        .expected = {
@@ -237,6 +384,14 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
                                0x2A20300C, 0x1B1705CD, 0x03844672, 0x00000000, 0x00000000,
                        },
                },
+               .argb2101010_result = {
+                       .dst_pitch = 20,
+                       .expected = {
+                               0xC3844672, 0xC444D414, 0xEA20300C, 0x00000000, 0x00000000,
+                               0xDB1705CD, 0xC3844672, 0xC444D414, 0x00000000, 0x00000000,
+                               0xEA20300C, 0xDB1705CD, 0xC3844672, 0x00000000, 0x00000000,
+                       },
+               },
        },
 };
 
@@ -264,7 +419,22 @@ static size_t conversion_buf_size(u32 dst_format, unsigned int dst_pitch,
        return dst_pitch * drm_rect_height(clip);
 }
 
-static u32 *le32buf_to_cpu(struct kunit *test, const u32 *buf, size_t buf_size)
+static u16 *le16buf_to_cpu(struct kunit *test, const __le16 *buf, size_t buf_size)
+{
+       u16 *dst = NULL;
+       int n;
+
+       dst = kunit_kzalloc(test, sizeof(*dst) * buf_size, GFP_KERNEL);
+       if (!dst)
+               return NULL;
+
+       for (n = 0; n < buf_size; n++)
+               dst[n] = le16_to_cpu(buf[n]);
+
+       return dst;
+}
+
+static u32 *le32buf_to_cpu(struct kunit *test, const __le32 *buf, size_t buf_size)
 {
        u32 *dst = NULL;
        int n;
@@ -279,6 +449,21 @@ static u32 *le32buf_to_cpu(struct kunit *test, const u32 *buf, size_t buf_size)
        return dst;
 }
 
+static __le32 *cpubuf_to_le32(struct kunit *test, const u32 *buf, size_t buf_size)
+{
+       __le32 *dst = NULL;
+       int n;
+
+       dst = kunit_kzalloc(test, sizeof(*dst) * buf_size, GFP_KERNEL);
+       if (!dst)
+               return NULL;
+
+       for (n = 0; n < buf_size; n++)
+               dst[n] = cpu_to_le32(buf[n]);
+
+       return dst;
+}
+
 static void convert_xrgb8888_case_desc(struct convert_xrgb8888_case *t,
                                       char *desc)
 {
@@ -293,8 +478,8 @@ static void drm_test_fb_xrgb8888_to_gray8(struct kunit *test)
        const struct convert_xrgb8888_case *params = test->param_value;
        const struct convert_to_gray8_result *result = &params->gray8_result;
        size_t dst_size;
-       __u8 *buf = NULL;
-       __u32 *xrgb8888 = NULL;
+       u8 *buf = NULL;
+       __le32 *xrgb8888 = NULL;
        struct iosys_map dst, src;
 
        struct drm_framebuffer fb = {
@@ -310,7 +495,7 @@ static void drm_test_fb_xrgb8888_to_gray8(struct kunit *test)
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
        iosys_map_set_vaddr(&dst, buf);
 
-       xrgb8888 = le32buf_to_cpu(test, params->xrgb8888, TEST_BUF_SIZE);
+       xrgb8888 = cpubuf_to_le32(test, params->xrgb8888, TEST_BUF_SIZE);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
        iosys_map_set_vaddr(&src, xrgb8888);
 
@@ -323,8 +508,8 @@ static void drm_test_fb_xrgb8888_to_rgb332(struct kunit *test)
        const struct convert_xrgb8888_case *params = test->param_value;
        const struct convert_to_rgb332_result *result = &params->rgb332_result;
        size_t dst_size;
-       __u8 *buf = NULL;
-       __u32 *xrgb8888 = NULL;
+       u8 *buf = NULL;
+       __le32 *xrgb8888 = NULL;
        struct iosys_map dst, src;
 
        struct drm_framebuffer fb = {
@@ -340,7 +525,7 @@ static void drm_test_fb_xrgb8888_to_rgb332(struct kunit *test)
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
        iosys_map_set_vaddr(&dst, buf);
 
-       xrgb8888 = le32buf_to_cpu(test, params->xrgb8888, TEST_BUF_SIZE);
+       xrgb8888 = cpubuf_to_le32(test, params->xrgb8888, TEST_BUF_SIZE);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
        iosys_map_set_vaddr(&src, xrgb8888);
 
@@ -353,8 +538,8 @@ static void drm_test_fb_xrgb8888_to_rgb565(struct kunit *test)
        const struct convert_xrgb8888_case *params = test->param_value;
        const struct convert_to_rgb565_result *result = &params->rgb565_result;
        size_t dst_size;
-       __u16 *buf = NULL;
-       __u32 *xrgb8888 = NULL;
+       u16 *buf = NULL;
+       __le32 *xrgb8888 = NULL;
        struct iosys_map dst, src;
 
        struct drm_framebuffer fb = {
@@ -370,24 +555,120 @@ static void drm_test_fb_xrgb8888_to_rgb565(struct kunit *test)
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
        iosys_map_set_vaddr(&dst, buf);
 
-       xrgb8888 = le32buf_to_cpu(test, params->xrgb8888, TEST_BUF_SIZE);
+       xrgb8888 = cpubuf_to_le32(test, params->xrgb8888, TEST_BUF_SIZE);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
        iosys_map_set_vaddr(&src, xrgb8888);
 
        drm_fb_xrgb8888_to_rgb565(&dst, &result->dst_pitch, &src, &fb, &params->clip, false);
+       buf = le16buf_to_cpu(test, (__force const __le16 *)buf, dst_size / sizeof(__le16));
        KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
 
+       buf = dst.vaddr; /* restore original value of buf */
        drm_fb_xrgb8888_to_rgb565(&dst, &result->dst_pitch, &src, &fb, &params->clip, true);
+       buf = le16buf_to_cpu(test, (__force const __le16 *)buf, dst_size / sizeof(__le16));
        KUNIT_EXPECT_MEMEQ(test, buf, result->expected_swab, dst_size);
 }
 
+static void drm_test_fb_xrgb8888_to_xrgb1555(struct kunit *test)
+{
+       const struct convert_xrgb8888_case *params = test->param_value;
+       const struct convert_to_xrgb1555_result *result = &params->xrgb1555_result;
+       size_t dst_size;
+       u16 *buf = NULL;
+       __le32 *xrgb8888 = NULL;
+       struct iosys_map dst, src;
+
+       struct drm_framebuffer fb = {
+               .format = drm_format_info(DRM_FORMAT_XRGB8888),
+               .pitches = { params->pitch, 0, 0 },
+       };
+
+       dst_size = conversion_buf_size(DRM_FORMAT_XRGB1555, result->dst_pitch,
+                                      &params->clip);
+       KUNIT_ASSERT_GT(test, dst_size, 0);
+
+       buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
+       iosys_map_set_vaddr(&dst, buf);
+
+       xrgb8888 = cpubuf_to_le32(test, params->xrgb8888, TEST_BUF_SIZE);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
+       iosys_map_set_vaddr(&src, xrgb8888);
+
+       drm_fb_xrgb8888_to_xrgb1555(&dst, &result->dst_pitch, &src, &fb, &params->clip);
+       buf = le16buf_to_cpu(test, (__force const __le16 *)buf, dst_size / sizeof(__le16));
+       KUNIT_EXPECT_EQ(test, memcmp(buf, result->expected, dst_size), 0);
+}
+
+static void drm_test_fb_xrgb8888_to_argb1555(struct kunit *test)
+{
+       const struct convert_xrgb8888_case *params = test->param_value;
+       const struct convert_to_argb1555_result *result = &params->argb1555_result;
+       size_t dst_size;
+       u16 *buf = NULL;
+       __le32 *xrgb8888 = NULL;
+       struct iosys_map dst, src;
+
+       struct drm_framebuffer fb = {
+               .format = drm_format_info(DRM_FORMAT_XRGB8888),
+               .pitches = { params->pitch, 0, 0 },
+       };
+
+       dst_size = conversion_buf_size(DRM_FORMAT_ARGB1555, result->dst_pitch,
+                                      &params->clip);
+       KUNIT_ASSERT_GT(test, dst_size, 0);
+
+       buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
+       iosys_map_set_vaddr(&dst, buf);
+
+       xrgb8888 = cpubuf_to_le32(test, params->xrgb8888, TEST_BUF_SIZE);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
+       iosys_map_set_vaddr(&src, xrgb8888);
+
+       drm_fb_xrgb8888_to_argb1555(&dst, &result->dst_pitch, &src, &fb, &params->clip);
+       buf = le16buf_to_cpu(test, (__force const __le16 *)buf, dst_size / sizeof(__le16));
+       KUNIT_EXPECT_EQ(test, memcmp(buf, result->expected, dst_size), 0);
+}
+
+static void drm_test_fb_xrgb8888_to_rgba5551(struct kunit *test)
+{
+       const struct convert_xrgb8888_case *params = test->param_value;
+       const struct convert_to_rgba5551_result *result = &params->rgba5551_result;
+       size_t dst_size;
+       u16 *buf = NULL;
+       __le32 *xrgb8888 = NULL;
+       struct iosys_map dst, src;
+
+       struct drm_framebuffer fb = {
+               .format = drm_format_info(DRM_FORMAT_XRGB8888),
+               .pitches = { params->pitch, 0, 0 },
+       };
+
+       dst_size = conversion_buf_size(DRM_FORMAT_RGBA5551, result->dst_pitch,
+                                      &params->clip);
+       KUNIT_ASSERT_GT(test, dst_size, 0);
+
+       buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
+       iosys_map_set_vaddr(&dst, buf);
+
+       xrgb8888 = cpubuf_to_le32(test, params->xrgb8888, TEST_BUF_SIZE);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
+       iosys_map_set_vaddr(&src, xrgb8888);
+
+       drm_fb_xrgb8888_to_rgba5551(&dst, &result->dst_pitch, &src, &fb, &params->clip);
+       buf = le16buf_to_cpu(test, (__force const __le16 *)buf, dst_size / sizeof(__le16));
+       KUNIT_EXPECT_EQ(test, memcmp(buf, result->expected, dst_size), 0);
+}
+
 static void drm_test_fb_xrgb8888_to_rgb888(struct kunit *test)
 {
        const struct convert_xrgb8888_case *params = test->param_value;
        const struct convert_to_rgb888_result *result = &params->rgb888_result;
        size_t dst_size;
-       __u8 *buf = NULL;
-       __u32 *xrgb8888 = NULL;
+       u8 *buf = NULL;
+       __le32 *xrgb8888 = NULL;
        struct iosys_map dst, src;
 
        struct drm_framebuffer fb = {
@@ -403,21 +684,56 @@ static void drm_test_fb_xrgb8888_to_rgb888(struct kunit *test)
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
        iosys_map_set_vaddr(&dst, buf);
 
-       xrgb8888 = le32buf_to_cpu(test, params->xrgb8888, TEST_BUF_SIZE);
+       xrgb8888 = cpubuf_to_le32(test, params->xrgb8888, TEST_BUF_SIZE);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
        iosys_map_set_vaddr(&src, xrgb8888);
 
+       /*
+        * RGB888 expected results are already in little-endian
+        * order, so there's no need to convert the test output.
+        */
        drm_fb_xrgb8888_to_rgb888(&dst, &result->dst_pitch, &src, &fb, &params->clip);
        KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
 }
 
+static void drm_test_fb_xrgb8888_to_argb8888(struct kunit *test)
+{
+       const struct convert_xrgb8888_case *params = test->param_value;
+       const struct convert_to_argb8888_result *result = &params->argb8888_result;
+       size_t dst_size;
+       u32 *buf = NULL;
+       __le32 *xrgb8888 = NULL;
+       struct iosys_map dst, src;
+
+       struct drm_framebuffer fb = {
+               .format = drm_format_info(DRM_FORMAT_XRGB8888),
+               .pitches = { params->pitch, 0, 0 },
+       };
+
+       dst_size = conversion_buf_size(DRM_FORMAT_ARGB8888,
+                                      result->dst_pitch, &params->clip);
+       KUNIT_ASSERT_GT(test, dst_size, 0);
+
+       buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
+       iosys_map_set_vaddr(&dst, buf);
+
+       xrgb8888 = cpubuf_to_le32(test, params->xrgb8888, TEST_BUF_SIZE);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
+       iosys_map_set_vaddr(&src, xrgb8888);
+
+       drm_fb_xrgb8888_to_argb8888(&dst, &result->dst_pitch, &src, &fb, &params->clip);
+       buf = le32buf_to_cpu(test, (__force const __le32 *)buf, dst_size / sizeof(u32));
+       KUNIT_EXPECT_EQ(test, memcmp(buf, result->expected, dst_size), 0);
+}
+
 static void drm_test_fb_xrgb8888_to_xrgb2101010(struct kunit *test)
 {
        const struct convert_xrgb8888_case *params = test->param_value;
        const struct convert_to_xrgb2101010_result *result = &params->xrgb2101010_result;
        size_t dst_size;
-       __u32 *buf = NULL;
-       __u32 *xrgb8888 = NULL;
+       u32 *buf = NULL;
+       __le32 *xrgb8888 = NULL;
        struct iosys_map dst, src;
 
        struct drm_framebuffer fb = {
@@ -433,7 +749,7 @@ static void drm_test_fb_xrgb8888_to_xrgb2101010(struct kunit *test)
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
        iosys_map_set_vaddr(&dst, buf);
 
-       xrgb8888 = le32buf_to_cpu(test, params->xrgb8888, TEST_BUF_SIZE);
+       xrgb8888 = cpubuf_to_le32(test, params->xrgb8888, TEST_BUF_SIZE);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
        iosys_map_set_vaddr(&src, xrgb8888);
 
@@ -442,12 +758,48 @@ static void drm_test_fb_xrgb8888_to_xrgb2101010(struct kunit *test)
        KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
 }
 
+static void drm_test_fb_xrgb8888_to_argb2101010(struct kunit *test)
+{
+       const struct convert_xrgb8888_case *params = test->param_value;
+       const struct convert_to_argb2101010_result *result = &params->argb2101010_result;
+       size_t dst_size;
+       u32 *buf = NULL;
+       __le32 *xrgb8888 = NULL;
+       struct iosys_map dst, src;
+
+       struct drm_framebuffer fb = {
+               .format = drm_format_info(DRM_FORMAT_XRGB8888),
+               .pitches = { params->pitch, 0, 0 },
+       };
+
+       dst_size = conversion_buf_size(DRM_FORMAT_ARGB2101010,
+                                      result->dst_pitch, &params->clip);
+       KUNIT_ASSERT_GT(test, dst_size, 0);
+
+       buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
+       iosys_map_set_vaddr(&dst, buf);
+
+       xrgb8888 = cpubuf_to_le32(test, params->xrgb8888, TEST_BUF_SIZE);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
+       iosys_map_set_vaddr(&src, xrgb8888);
+
+       drm_fb_xrgb8888_to_argb2101010(&dst, &result->dst_pitch, &src, &fb, &params->clip);
+       buf = le32buf_to_cpu(test, (__force const __le32 *)buf, dst_size / sizeof(u32));
+       KUNIT_EXPECT_EQ(test, memcmp(buf, result->expected, dst_size), 0);
+}
+
 static struct kunit_case drm_format_helper_test_cases[] = {
        KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_gray8, convert_xrgb8888_gen_params),
        KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_rgb332, convert_xrgb8888_gen_params),
        KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_rgb565, convert_xrgb8888_gen_params),
+       KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_xrgb1555, convert_xrgb8888_gen_params),
+       KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_argb1555, convert_xrgb8888_gen_params),
+       KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_rgba5551, convert_xrgb8888_gen_params),
        KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_rgb888, convert_xrgb8888_gen_params),
+       KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_argb8888, convert_xrgb8888_gen_params),
        KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_xrgb2101010, convert_xrgb8888_gen_params),
+       KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_argb2101010, convert_xrgb8888_gen_params),
        {}
 };