dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/6] Increase code coverage on drm_format_helper.c
@ 2023-07-21 18:23 Arthur Grillo
  2023-07-21 18:23 ` [PATCH 1/6] drm/format-helper: Test default pitch fallback Arthur Grillo
                   ` (5 more replies)
  0 siblings, 6 replies; 20+ messages in thread
From: Arthur Grillo @ 2023-07-21 18:23 UTC (permalink / raw)
  To: dri-devel
  Cc: tzimmermann, tales.aparecida, javierm, mairacanal, davidgow,
	jose.exposito89, andrealmeid, arthurgrillo

The following series include improvements and new KUnit tests to some
functions on drm_format_helper.c.

The first patch improves existing conversion tests to assure that the
default pitch is used when NULL is used on the `dst_pitch` argument.

Patches 2, 3, 4, and 6 add the new parametrized tests to the following
functions:

- drm_fb_swab()
- drm_fb_clip_offset()
- drm_fb_build_fourcc_list()
- drm_fb_memcpy()

The 5th patch is a change to the conversion_buf_size() helper used on
the tests, this change was needed to make the patch 6.

a coverage report for the file can be found below:
https://grillo-0.github.io/coverage-reports/gsoc-drm-format-test/drivers/gpu/drm/drm_format_helper.c.gcov.html

Arthur Grillo (6):
  drm/format-helper: Test default pitch fallback
  drm/format-helper: Add KUnit tests for drm_fb_swab()
  drm/format-helper: Add KUnit tests for drm_fb_clip_offset()
  drm/format-helper: Add KUnit tests for drm_fb_build_fourcc_list()
  drm/format-helper-test: Add multi-plane support to
    conversion_buf_size()
  drm/format-helper: Add KUnit tests for drm_fb_memcpy()

 .../gpu/drm/tests/drm_format_helper_test.c    | 849 ++++++++++++++++--
 1 file changed, 791 insertions(+), 58 deletions(-)

-- 
2.41.0


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 1/6] drm/format-helper: Test default pitch fallback
  2023-07-21 18:23 [PATCH 0/6] Increase code coverage on drm_format_helper.c Arthur Grillo
@ 2023-07-21 18:23 ` Arthur Grillo
  2023-08-05 12:56   ` Maira Canal
  2023-08-09 14:54   ` André Almeida
  2023-07-21 18:23 ` [PATCH 2/6] drm/format-helper: Add KUnit tests for drm_fb_swab() Arthur Grillo
                   ` (4 subsequent siblings)
  5 siblings, 2 replies; 20+ messages in thread
From: Arthur Grillo @ 2023-07-21 18:23 UTC (permalink / raw)
  To: dri-devel
  Cc: tzimmermann, tales.aparecida, javierm, mairacanal, davidgow,
	jose.exposito89, andrealmeid, arthurgrillo

Test the default pitch fallback when NULL is passed as the dst_pitch on
the conversion procedures.

Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
---
 .../gpu/drm/tests/drm_format_helper_test.c    | 132 ++++++++++++------
 1 file changed, 87 insertions(+), 45 deletions(-)

diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
index 474bb7a1c4ee..bc6894f0a202 100644
--- a/drivers/gpu/drm/tests/drm_format_helper_test.c
+++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
@@ -16,6 +16,8 @@
 
 #define TEST_BUF_SIZE 50
 
+#define TEST_USE_DEFAULT_PITCH 0
+
 struct convert_to_gray8_result {
 	unsigned int dst_pitch;
 	const u8 expected[TEST_BUF_SIZE];
@@ -97,48 +99,48 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 		.clip = DRM_RECT_INIT(0, 0, 1, 1),
 		.xrgb8888 = { 0x01FF0000 },
 		.gray8_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0x4C },
 		},
 		.rgb332_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0xE0 },
 		},
 		.rgb565_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0xF800 },
 			.expected_swab = { 0x00F8 },
 		},
 		.xrgb1555_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0x7C00 },
 		},
 		.argb1555_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0xFC00 },
 		},
 		.rgba5551_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0xF801 },
 		},
 		.rgb888_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0x00, 0x00, 0xFF },
 		},
 		.argb8888_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0xFFFF0000 },
 		},
 		.xrgb2101010_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0x3FF00000 },
 		},
 		.argb2101010_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0xFFF00000 },
 		},
 		.mono_result = {
-			.dst_pitch = 0,
+			.dst_pitch =  TEST_USE_DEFAULT_PITCH,
 			.expected = { 0b0 },
 		},
 	},
@@ -151,48 +153,48 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 			0x00000000, 0x10FF0000,
 		},
 		.gray8_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0x4C },
 		},
 		.rgb332_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0xE0 },
 		},
 		.rgb565_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0xF800 },
 			.expected_swab = { 0x00F8 },
 		},
 		.xrgb1555_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0x7C00 },
 		},
 		.argb1555_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0xFC00 },
 		},
 		.rgba5551_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0xF801 },
 		},
 		.rgb888_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0x00, 0x00, 0xFF },
 		},
 		.argb8888_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0xFFFF0000 },
 		},
 		.xrgb2101010_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0x3FF00000 },
 		},
 		.argb2101010_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0xFFF00000 },
 		},
 		.mono_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0b0 },
 		},
 	},
@@ -212,7 +214,7 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 			0x00000000, 0x77FFFF00, 0x8800FFFF, 0x00000000,
 		},
 		.gray8_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = {
 				0xFF, 0x00,
 				0x4C, 0x99,
@@ -221,7 +223,7 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 			},
 		},
 		.rgb332_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = {
 				0xFF, 0x00,
 				0xE0, 0x1C,
@@ -230,7 +232,7 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 			},
 		},
 		.rgb565_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = {
 				0xFFFF, 0x0000,
 				0xF800, 0x07E0,
@@ -245,7 +247,7 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 			},
 		},
 		.xrgb1555_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = {
 				0x7FFF, 0x0000,
 				0x7C00, 0x03E0,
@@ -254,7 +256,7 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 			},
 		},
 		.argb1555_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = {
 				0xFFFF, 0x8000,
 				0xFC00, 0x83E0,
@@ -263,7 +265,7 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 			},
 		},
 		.rgba5551_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = {
 				0xFFFF, 0x0001,
 				0xF801, 0x07C1,
@@ -272,7 +274,7 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 			},
 		},
 		.rgb888_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = {
 				0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
 				0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00,
@@ -281,7 +283,7 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 			},
 		},
 		.argb8888_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = {
 				0xFFFFFFFF, 0xFF000000,
 				0xFFFF0000, 0xFF00FF00,
@@ -290,7 +292,7 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 			},
 		},
 		.xrgb2101010_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = {
 				0x3FFFFFFF, 0x00000000,
 				0x3FF00000, 0x000FFC00,
@@ -299,7 +301,7 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 			},
 		},
 		.argb2101010_result = {
-			.dst_pitch = 0,
+			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = {
 				0xFFFFFFFF, 0xC0000000,
 				0xFFF00000, 0xC00FFC00,
@@ -308,7 +310,7 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 			},
 		},
 		.mono_result = {
-			.dst_pitch = 0,
+			.dst_pitch =  TEST_USE_DEFAULT_PITCH,
 			.expected = {
 				0b01,
 				0b10,
@@ -530,7 +532,10 @@ static void drm_test_fb_xrgb8888_to_gray8(struct kunit *test)
 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
 	iosys_map_set_vaddr(&src, xrgb8888);
 
-	drm_fb_xrgb8888_to_gray8(&dst, &result->dst_pitch, &src, &fb, &params->clip);
+	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
+		drm_fb_xrgb8888_to_gray8(&dst, NULL, &src, &fb, &params->clip);
+	else
+		drm_fb_xrgb8888_to_gray8(&dst, &result->dst_pitch, &src, &fb, &params->clip);
 	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
 }
 
@@ -560,7 +565,10 @@ static void drm_test_fb_xrgb8888_to_rgb332(struct kunit *test)
 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
 	iosys_map_set_vaddr(&src, xrgb8888);
 
-	drm_fb_xrgb8888_to_rgb332(&dst, &result->dst_pitch, &src, &fb, &params->clip);
+	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
+		drm_fb_xrgb8888_to_rgb332(&dst, NULL, &src, &fb, &params->clip);
+	else
+		drm_fb_xrgb8888_to_rgb332(&dst, &result->dst_pitch, &src, &fb, &params->clip);
 	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
 }
 
@@ -590,12 +598,19 @@ static void drm_test_fb_xrgb8888_to_rgb565(struct kunit *test)
 	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);
+	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
+		drm_fb_xrgb8888_to_rgb565(&dst, NULL, &src, &fb, &params->clip, false);
+	else
+		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);
+	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
+		drm_fb_xrgb8888_to_rgb565(&dst, NULL, &src, &fb, &params->clip, true);
+	else
+		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);
 }
@@ -626,7 +641,10 @@ static void drm_test_fb_xrgb8888_to_xrgb1555(struct kunit *test)
 	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);
+	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
+		drm_fb_xrgb8888_to_xrgb1555(&dst, NULL, &src, &fb, &params->clip);
+	else
+		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_MEMEQ(test, buf, result->expected, dst_size);
 }
@@ -657,7 +675,10 @@ static void drm_test_fb_xrgb8888_to_argb1555(struct kunit *test)
 	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);
+	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
+		drm_fb_xrgb8888_to_argb1555(&dst, NULL, &src, &fb, &params->clip);
+	else
+		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_MEMEQ(test, buf, result->expected, dst_size);
 }
@@ -688,7 +709,10 @@ static void drm_test_fb_xrgb8888_to_rgba5551(struct kunit *test)
 	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);
+	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
+		drm_fb_xrgb8888_to_rgba5551(&dst, &result->dst_pitch, &src, &fb, &params->clip);
+	else
+		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_MEMEQ(test, buf, result->expected, dst_size);
 }
@@ -723,7 +747,11 @@ static void drm_test_fb_xrgb8888_to_rgb888(struct kunit *test)
 	 * 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);
+	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
+		drm_fb_xrgb8888_to_rgb888(&dst, NULL, &src, &fb, &params->clip);
+	else
+		drm_fb_xrgb8888_to_rgb888(&dst, &result->dst_pitch, &src, &fb, &params->clip);
+
 	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
 }
 
@@ -753,7 +781,11 @@ static void drm_test_fb_xrgb8888_to_argb8888(struct kunit *test)
 	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);
+	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
+		drm_fb_xrgb8888_to_argb8888(&dst, NULL, &src, &fb, &params->clip);
+	else
+		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_MEMEQ(test, buf, result->expected, dst_size);
 }
@@ -784,7 +816,10 @@ static void drm_test_fb_xrgb8888_to_xrgb2101010(struct kunit *test)
 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
 	iosys_map_set_vaddr(&src, xrgb8888);
 
-	drm_fb_xrgb8888_to_xrgb2101010(&dst, &result->dst_pitch, &src, &fb, &params->clip);
+	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
+		drm_fb_xrgb8888_to_xrgb2101010(&dst, NULL, &src, &fb, &params->clip);
+	else
+		drm_fb_xrgb8888_to_xrgb2101010(&dst, &result->dst_pitch, &src, &fb, &params->clip);
 	buf = le32buf_to_cpu(test, buf, dst_size / sizeof(u32));
 	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
 }
@@ -815,7 +850,11 @@ static void drm_test_fb_xrgb8888_to_argb2101010(struct kunit *test)
 	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);
+	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
+		drm_fb_xrgb8888_to_argb2101010(&dst, NULL, &src, &fb, &params->clip);
+	else
+		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_MEMEQ(test, buf, result->expected, dst_size);
 }
@@ -846,7 +885,10 @@ static void drm_test_fb_xrgb8888_to_mono(struct kunit *test)
 	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
 	iosys_map_set_vaddr(&src, xrgb8888);
 
-	drm_fb_xrgb8888_to_mono(&dst, &result->dst_pitch, &src, &fb, &params->clip);
+	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
+		drm_fb_xrgb8888_to_mono(&dst, NULL, &src, &fb, &params->clip);
+	else
+		drm_fb_xrgb8888_to_mono(&dst, &result->dst_pitch, &src, &fb, &params->clip);
 	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
 }
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 2/6] drm/format-helper: Add KUnit tests for drm_fb_swab()
  2023-07-21 18:23 [PATCH 0/6] Increase code coverage on drm_format_helper.c Arthur Grillo
  2023-07-21 18:23 ` [PATCH 1/6] drm/format-helper: Test default pitch fallback Arthur Grillo
@ 2023-07-21 18:23 ` Arthur Grillo
  2023-08-05 13:02   ` Maira Canal
  2023-08-09 14:57   ` André Almeida
  2023-07-21 18:23 ` [PATCH 3/6] drm/format-helper: Add KUnit tests for drm_fb_clip_offset() Arthur Grillo
                   ` (3 subsequent siblings)
  5 siblings, 2 replies; 20+ messages in thread
From: Arthur Grillo @ 2023-07-21 18:23 UTC (permalink / raw)
  To: dri-devel
  Cc: tzimmermann, tales.aparecida, javierm, mairacanal, davidgow,
	jose.exposito89, andrealmeid, arthurgrillo

Insert parameterized test for the drm_fb_swab() to ensure correctness
and prevent future regressions.

Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
---
 .../gpu/drm/tests/drm_format_helper_test.c    | 66 +++++++++++++++++++
 1 file changed, 66 insertions(+)

diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
index bc6894f0a202..abeda642d84a 100644
--- a/drivers/gpu/drm/tests/drm_format_helper_test.c
+++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
@@ -74,6 +74,11 @@ struct convert_to_mono_result {
 	const u8 expected[TEST_BUF_SIZE];
 };
 
+struct fb_swab_result {
+	unsigned int dst_pitch;
+	const u32 expected[TEST_BUF_SIZE];
+};
+
 struct convert_xrgb8888_case {
 	const char *name;
 	unsigned int pitch;
@@ -90,6 +95,7 @@ struct convert_xrgb8888_case {
 	struct convert_to_xrgb2101010_result xrgb2101010_result;
 	struct convert_to_argb2101010_result argb2101010_result;
 	struct convert_to_mono_result mono_result;
+	struct fb_swab_result swab_result;
 };
 
 static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
@@ -143,6 +149,10 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 			.dst_pitch =  TEST_USE_DEFAULT_PITCH,
 			.expected = { 0b0 },
 		},
+		.swab_result = {
+			.dst_pitch =  TEST_USE_DEFAULT_PITCH,
+			.expected = { 0x0000FF01 },
+		},
 	},
 	{
 		.name = "single_pixel_clip_rectangle",
@@ -197,6 +207,10 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 			.dst_pitch = TEST_USE_DEFAULT_PITCH,
 			.expected = { 0b0 },
 		},
+		.swab_result = {
+			.dst_pitch =  TEST_USE_DEFAULT_PITCH,
+			.expected = { 0x0000FF10 },
+		},
 	},
 	{
 		/* Well known colors: White, black, red, green, blue, magenta,
@@ -318,6 +332,15 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 				0b11,
 			},
 		},
+		.swab_result = {
+			.dst_pitch =  TEST_USE_DEFAULT_PITCH,
+			.expected = {
+				0xFFFFFF11, 0x00000022,
+				0x0000FF33, 0x00FF0044,
+				0xFF000055, 0xFF00FF66,
+				0x00FFFF77, 0xFFFF0088,
+			},
+		},
 	},
 	{
 		/* Randomly picked colors. Full buffer within the clip area. */
@@ -425,6 +448,14 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
 				0b010, 0b000,
 			},
 		},
+		.swab_result = {
+			.dst_pitch =  20,
+			.expected = {
+				0x9C440EA1, 0x054D11B1, 0x03F3A8C1, 0x00000000, 0x00000000,
+				0x73F06CD1, 0x9C440EA2, 0x054D11B2, 0x00000000, 0x00000000,
+				0x0303A8C2, 0x73F06CD2, 0x9C440EA3, 0x00000000, 0x00000000,
+			},
+		},
 	},
 };
 
@@ -892,6 +923,40 @@ static void drm_test_fb_xrgb8888_to_mono(struct kunit *test)
 	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
 }
 
+static void drm_test_fb_swab(struct kunit *test)
+{
+	const struct convert_xrgb8888_case *params = test->param_value;
+	const struct fb_swab_result *result = &params->swab_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_XRGB8888, 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);
+
+	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
+		drm_fb_swab(&dst, NULL, &src, &fb, &params->clip, false);
+	else
+		drm_fb_swab(&dst, &result->dst_pitch, &src, &fb, &params->clip, false);
+	buf = le32buf_to_cpu(test, (__force const __le32 *)buf, dst_size / sizeof(u32));
+	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
+}
+
 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),
@@ -904,6 +969,7 @@ static struct kunit_case drm_format_helper_test_cases[] = {
 	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),
 	KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_mono, convert_xrgb8888_gen_params),
+	KUNIT_CASE_PARAM(drm_test_fb_swab, convert_xrgb8888_gen_params),
 	{}
 };
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 3/6] drm/format-helper: Add KUnit tests for drm_fb_clip_offset()
  2023-07-21 18:23 [PATCH 0/6] Increase code coverage on drm_format_helper.c Arthur Grillo
  2023-07-21 18:23 ` [PATCH 1/6] drm/format-helper: Test default pitch fallback Arthur Grillo
  2023-07-21 18:23 ` [PATCH 2/6] drm/format-helper: Add KUnit tests for drm_fb_swab() Arthur Grillo
@ 2023-07-21 18:23 ` Arthur Grillo
  2023-08-05 13:16   ` Maira Canal
  2023-08-09 15:28   ` André Almeida
  2023-07-21 18:23 ` [PATCH 4/6] drm/format-helper: Add KUnit tests for drm_fb_build_fourcc_list() Arthur Grillo
                   ` (2 subsequent siblings)
  5 siblings, 2 replies; 20+ messages in thread
From: Arthur Grillo @ 2023-07-21 18:23 UTC (permalink / raw)
  To: dri-devel
  Cc: tzimmermann, tales.aparecida, javierm, mairacanal, davidgow,
	jose.exposito89, andrealmeid, arthurgrillo

Insert parameterized test for the drm_fb_clip_offset() to ensure
correctness and prevent future regressions.

Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
---
 .../gpu/drm/tests/drm_format_helper_test.c    | 91 +++++++++++++++++++
 1 file changed, 91 insertions(+)

diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
index abeda642d84a..2e1c5463f063 100644
--- a/drivers/gpu/drm/tests/drm_format_helper_test.c
+++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
@@ -957,6 +957,96 @@ static void drm_test_fb_swab(struct kunit *test)
 	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
 }
 
+struct clip_offset_case {
+	const char *name;
+	unsigned int pitch;
+	u32 format;
+	struct drm_rect clip;
+	unsigned int expected_offset;
+};
+
+static struct clip_offset_case clip_offset_cases[] = {
+	{
+		.name = "pass through",
+		.pitch = TEST_USE_DEFAULT_PITCH,
+		.format = DRM_FORMAT_XRGB8888,
+		.clip = DRM_RECT_INIT(0, 0, 3, 3),
+		.expected_offset = 0
+	},
+	{
+		.name = "horizontal offset",
+		.pitch = TEST_USE_DEFAULT_PITCH,
+		.format = DRM_FORMAT_XRGB8888,
+		.clip = DRM_RECT_INIT(1, 0, 3, 3),
+		.expected_offset = 4,
+	},
+	{
+		.name = "vertical offset",
+		.pitch = TEST_USE_DEFAULT_PITCH,
+		.format = DRM_FORMAT_XRGB8888,
+		.clip = DRM_RECT_INIT(0, 1, 3, 3),
+		.expected_offset = 12,
+	},
+	{
+		.name = "horizontal and vertical offset",
+		.pitch = TEST_USE_DEFAULT_PITCH,
+		.format = DRM_FORMAT_XRGB8888,
+		.clip = DRM_RECT_INIT(1, 1, 3, 3),
+		.expected_offset = 16,
+	},
+	{
+		.name = "horizontal offset (custom pitch)",
+		.pitch = 20,
+		.format = DRM_FORMAT_XRGB8888,
+		.clip = DRM_RECT_INIT(1, 0, 3, 3),
+		.expected_offset = 4,
+	},
+	{
+		.name = "vertical offset (custom pitch)",
+		.pitch = 20,
+		.format = DRM_FORMAT_XRGB8888,
+		.clip = DRM_RECT_INIT(0, 1, 3, 3),
+		.expected_offset = 20,
+	},
+	{
+		.name = "horizontal and vertical offset (custom pitch)",
+		.pitch = 20,
+		.format = DRM_FORMAT_XRGB8888,
+		.clip = DRM_RECT_INIT(1, 1, 3, 3),
+		.expected_offset = 24,
+	},
+};
+
+static void clip_offset_case_desc(struct clip_offset_case *t, char *desc)
+{
+	strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);
+}
+
+KUNIT_ARRAY_PARAM(clip_offset, clip_offset_cases, clip_offset_case_desc);
+
+static void drm_test_fb_clip_offset(struct kunit *test)
+{
+	const struct clip_offset_case *params = test->param_value;
+	const struct drm_format_info *format_info = drm_format_info(params->format);
+
+	unsigned int offset = -1;
+
+	unsigned int pitch = params->pitch;
+
+	if (pitch == TEST_USE_DEFAULT_PITCH)
+		pitch = drm_format_info_min_pitch(format_info, 0,
+						  drm_rect_width(&params->clip));
+
+	/* Assure that the pitch is not zero, because this will inevitable cause the
+	 * wrong expected result
+	 */
+	KUNIT_ASSERT_NE(test, pitch, 0);
+
+	offset = drm_fb_clip_offset(pitch, format_info, &params->clip);
+
+	KUNIT_EXPECT_EQ(test, offset, params->expected_offset);
+}
+
 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),
@@ -970,6 +1060,7 @@ static struct kunit_case drm_format_helper_test_cases[] = {
 	KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_argb2101010, convert_xrgb8888_gen_params),
 	KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_mono, convert_xrgb8888_gen_params),
 	KUNIT_CASE_PARAM(drm_test_fb_swab, convert_xrgb8888_gen_params),
+	KUNIT_CASE_PARAM(drm_test_fb_clip_offset, clip_offset_gen_params),
 	{}
 };
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 4/6] drm/format-helper: Add KUnit tests for drm_fb_build_fourcc_list()
  2023-07-21 18:23 [PATCH 0/6] Increase code coverage on drm_format_helper.c Arthur Grillo
                   ` (2 preceding siblings ...)
  2023-07-21 18:23 ` [PATCH 3/6] drm/format-helper: Add KUnit tests for drm_fb_clip_offset() Arthur Grillo
@ 2023-07-21 18:23 ` Arthur Grillo
  2023-08-05 13:21   ` Maira Canal
  2023-08-09 15:54   ` André Almeida
  2023-07-21 18:23 ` [PATCH 5/6] drm/format-helper-test: Add multi-plane support to conversion_buf_size() Arthur Grillo
  2023-07-21 18:23 ` [PATCH 6/6] drm/format-helper: Add KUnit tests for drm_fb_memcpy() Arthur Grillo
  5 siblings, 2 replies; 20+ messages in thread
From: Arthur Grillo @ 2023-07-21 18:23 UTC (permalink / raw)
  To: dri-devel
  Cc: tzimmermann, tales.aparecida, javierm, mairacanal, davidgow,
	jose.exposito89, andrealmeid, arthurgrillo

Insert parameterized test for the drm_fb_build_fourcc_list() to ensure
correctness and prevent future regressions.

Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
---
 .../gpu/drm/tests/drm_format_helper_test.c    | 143 ++++++++++++++++++
 1 file changed, 143 insertions(+)

diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
index 2e1c5463f063..de4677868647 100644
--- a/drivers/gpu/drm/tests/drm_format_helper_test.c
+++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
@@ -3,6 +3,7 @@
 #include <kunit/test.h>
 
 #include <drm/drm_device.h>
+#include <drm/drm_drv.h>
 #include <drm/drm_file.h>
 #include <drm/drm_format_helper.h>
 #include <drm/drm_fourcc.h>
@@ -11,6 +12,7 @@
 #include <drm/drm_mode.h>
 #include <drm/drm_print.h>
 #include <drm/drm_rect.h>
+#include <drm/drm_kunit_helpers.h>
 
 #include "../drm_crtc_internal.h"
 
@@ -1047,6 +1049,146 @@ static void drm_test_fb_clip_offset(struct kunit *test)
 	KUNIT_EXPECT_EQ(test, offset, params->expected_offset);
 }
 
+struct fb_build_fourcc_list_case {
+	const char *name;
+	u32 native_fourccs[TEST_BUF_SIZE];
+	u32 expected[TEST_BUF_SIZE];
+};
+
+struct fb_build_fourcc_list_case fb_build_fourcc_list_cases[] = {
+	{
+		.name = "no native formats",
+		.native_fourccs = { },
+		.expected = { DRM_FORMAT_XRGB8888 },
+	},
+	{
+		.name = "XRGB8888 as native format",
+		.native_fourccs = { DRM_FORMAT_XRGB8888 },
+		.expected = { DRM_FORMAT_XRGB8888 },
+	},
+	{
+		.name = "remove duplicates",
+		.native_fourccs = {
+			DRM_FORMAT_XRGB8888,
+			DRM_FORMAT_XRGB8888,
+			DRM_FORMAT_RGB888,
+			DRM_FORMAT_RGB888,
+			DRM_FORMAT_RGB888,
+			DRM_FORMAT_XRGB8888,
+			DRM_FORMAT_RGB888,
+			DRM_FORMAT_RGB565,
+			DRM_FORMAT_RGB888,
+			DRM_FORMAT_XRGB8888,
+			DRM_FORMAT_RGB565,
+			DRM_FORMAT_RGB565,
+			DRM_FORMAT_XRGB8888,
+		},
+		.expected = {
+			DRM_FORMAT_XRGB8888,
+			DRM_FORMAT_RGB888,
+			DRM_FORMAT_RGB565,
+		},
+	},
+	{
+		.name = "convert alpha formats",
+		.native_fourccs = {
+			DRM_FORMAT_ARGB1555,
+			DRM_FORMAT_ABGR1555,
+			DRM_FORMAT_RGBA5551,
+			DRM_FORMAT_BGRA5551,
+			DRM_FORMAT_ARGB8888,
+			DRM_FORMAT_ABGR8888,
+			DRM_FORMAT_RGBA8888,
+			DRM_FORMAT_BGRA8888,
+			DRM_FORMAT_ARGB2101010,
+			DRM_FORMAT_ABGR2101010,
+			DRM_FORMAT_RGBA1010102,
+			DRM_FORMAT_BGRA1010102,
+		},
+		.expected = {
+			DRM_FORMAT_XRGB1555,
+			DRM_FORMAT_XBGR1555,
+			DRM_FORMAT_RGBX5551,
+			DRM_FORMAT_BGRX5551,
+			DRM_FORMAT_XRGB8888,
+			DRM_FORMAT_XBGR8888,
+			DRM_FORMAT_RGBX8888,
+			DRM_FORMAT_BGRX8888,
+			DRM_FORMAT_XRGB2101010,
+			DRM_FORMAT_XBGR2101010,
+			DRM_FORMAT_RGBX1010102,
+			DRM_FORMAT_BGRX1010102,
+		},
+	},
+	{
+		.name = "random formats",
+		.native_fourccs = {
+			DRM_FORMAT_Y212,
+			DRM_FORMAT_ARGB1555,
+			DRM_FORMAT_ABGR16161616F,
+			DRM_FORMAT_C8,
+			DRM_FORMAT_BGR888,
+			DRM_FORMAT_XRGB1555,
+			DRM_FORMAT_RGBA5551,
+			DRM_FORMAT_BGR565_A8,
+			DRM_FORMAT_R10,
+			DRM_FORMAT_XYUV8888,
+		},
+		.expected = {
+			DRM_FORMAT_Y212,
+			DRM_FORMAT_XRGB1555,
+			DRM_FORMAT_ABGR16161616F,
+			DRM_FORMAT_C8,
+			DRM_FORMAT_BGR888,
+			DRM_FORMAT_RGBX5551,
+			DRM_FORMAT_BGR565_A8,
+			DRM_FORMAT_R10,
+			DRM_FORMAT_XYUV8888,
+			DRM_FORMAT_XRGB8888,
+		},
+	},
+};
+
+static void fb_build_fourcc_list_case_desc(struct fb_build_fourcc_list_case *t, char *desc)
+{
+	strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);
+}
+
+KUNIT_ARRAY_PARAM(fb_build_fourcc_list, fb_build_fourcc_list_cases, fb_build_fourcc_list_case_desc);
+
+static size_t get_nfourccs(const u32 *fourccs)
+{
+	size_t i;
+
+	for (i = 0; i < TEST_BUF_SIZE && fourccs[i]; ++i)
+		;
+
+	return i;
+}
+
+static void drm_test_fb_build_fourcc_list(struct kunit *test)
+{
+	const struct fb_build_fourcc_list_case *params = test->param_value;
+	u32 fourccs_out[TEST_BUF_SIZE];
+	size_t nfourccs_out;
+	struct drm_device *drm;
+	struct device *dev;
+
+	dev = drm_kunit_helper_alloc_device(test);
+	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
+
+	drm = __drm_kunit_helper_alloc_drm_device(test, dev, sizeof(*drm), 0, DRIVER_MODESET);
+	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, drm);
+
+	nfourccs_out = drm_fb_build_fourcc_list(drm, params->native_fourccs,
+						get_nfourccs(params->native_fourccs),
+						fourccs_out, TEST_BUF_SIZE);
+
+	drm_kunit_helper_free_device(test, dev);
+	KUNIT_EXPECT_EQ(test, nfourccs_out, get_nfourccs(params->expected));
+	KUNIT_EXPECT_MEMEQ(test, fourccs_out, params->expected, TEST_BUF_SIZE);
+}
+
 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),
@@ -1061,6 +1203,7 @@ static struct kunit_case drm_format_helper_test_cases[] = {
 	KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_mono, convert_xrgb8888_gen_params),
 	KUNIT_CASE_PARAM(drm_test_fb_swab, convert_xrgb8888_gen_params),
 	KUNIT_CASE_PARAM(drm_test_fb_clip_offset, clip_offset_gen_params),
+	KUNIT_CASE_PARAM(drm_test_fb_build_fourcc_list, fb_build_fourcc_list_gen_params),
 	{}
 };
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 5/6] drm/format-helper-test: Add multi-plane support to conversion_buf_size()
  2023-07-21 18:23 [PATCH 0/6] Increase code coverage on drm_format_helper.c Arthur Grillo
                   ` (3 preceding siblings ...)
  2023-07-21 18:23 ` [PATCH 4/6] drm/format-helper: Add KUnit tests for drm_fb_build_fourcc_list() Arthur Grillo
@ 2023-07-21 18:23 ` Arthur Grillo
  2023-08-05 13:22   ` Maira Canal
  2023-08-09 16:16   ` André Almeida
  2023-07-21 18:23 ` [PATCH 6/6] drm/format-helper: Add KUnit tests for drm_fb_memcpy() Arthur Grillo
  5 siblings, 2 replies; 20+ messages in thread
From: Arthur Grillo @ 2023-07-21 18:23 UTC (permalink / raw)
  To: dri-devel
  Cc: tzimmermann, tales.aparecida, javierm, mairacanal, davidgow,
	jose.exposito89, andrealmeid, arthurgrillo

The drm_fb_memcpy() supports multi-plane formats. To fully test it in
the future, add multi-plane support to the conversion_buf_size() helper.

Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
---
 .../gpu/drm/tests/drm_format_helper_test.c    | 28 +++++++++----------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
index de4677868647..6ecd92898e8e 100644
--- a/drivers/gpu/drm/tests/drm_format_helper_test.c
+++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
@@ -472,7 +472,7 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
  * The size of the destination buffer or negative value on error.
  */
 static size_t conversion_buf_size(u32 dst_format, unsigned int dst_pitch,
-				  const struct drm_rect *clip)
+				  const struct drm_rect *clip, int plane)
 {
 	const struct drm_format_info *dst_fi = drm_format_info(dst_format);
 
@@ -480,7 +480,7 @@ static size_t conversion_buf_size(u32 dst_format, unsigned int dst_pitch,
 		return -EINVAL;
 
 	if (!dst_pitch)
-		dst_pitch = drm_format_info_min_pitch(dst_fi, 0, drm_rect_width(clip));
+		dst_pitch = drm_format_info_min_pitch(dst_fi, plane, drm_rect_width(clip));
 
 	return dst_pitch * drm_rect_height(clip);
 }
@@ -554,7 +554,7 @@ static void drm_test_fb_xrgb8888_to_gray8(struct kunit *test)
 	};
 
 	dst_size = conversion_buf_size(DRM_FORMAT_R8, result->dst_pitch,
-				       &params->clip);
+				       &params->clip, 0);
 	KUNIT_ASSERT_GT(test, dst_size, 0);
 
 	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
@@ -587,7 +587,7 @@ static void drm_test_fb_xrgb8888_to_rgb332(struct kunit *test)
 	};
 
 	dst_size = conversion_buf_size(DRM_FORMAT_RGB332, result->dst_pitch,
-				       &params->clip);
+				       &params->clip, 0);
 	KUNIT_ASSERT_GT(test, dst_size, 0);
 
 	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
@@ -620,7 +620,7 @@ static void drm_test_fb_xrgb8888_to_rgb565(struct kunit *test)
 	};
 
 	dst_size = conversion_buf_size(DRM_FORMAT_RGB565, result->dst_pitch,
-				       &params->clip);
+				       &params->clip, 0);
 	KUNIT_ASSERT_GT(test, dst_size, 0);
 
 	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
@@ -663,7 +663,7 @@ static void drm_test_fb_xrgb8888_to_xrgb1555(struct kunit *test)
 	};
 
 	dst_size = conversion_buf_size(DRM_FORMAT_XRGB1555, result->dst_pitch,
-				       &params->clip);
+				       &params->clip, 0);
 	KUNIT_ASSERT_GT(test, dst_size, 0);
 
 	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
@@ -697,7 +697,7 @@ static void drm_test_fb_xrgb8888_to_argb1555(struct kunit *test)
 	};
 
 	dst_size = conversion_buf_size(DRM_FORMAT_ARGB1555, result->dst_pitch,
-				       &params->clip);
+				       &params->clip, 0);
 	KUNIT_ASSERT_GT(test, dst_size, 0);
 
 	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
@@ -731,7 +731,7 @@ static void drm_test_fb_xrgb8888_to_rgba5551(struct kunit *test)
 	};
 
 	dst_size = conversion_buf_size(DRM_FORMAT_RGBA5551, result->dst_pitch,
-				       &params->clip);
+				       &params->clip, 0);
 	KUNIT_ASSERT_GT(test, dst_size, 0);
 
 	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
@@ -765,7 +765,7 @@ static void drm_test_fb_xrgb8888_to_rgb888(struct kunit *test)
 	};
 
 	dst_size = conversion_buf_size(DRM_FORMAT_RGB888, result->dst_pitch,
-				       &params->clip);
+				       &params->clip, 0);
 	KUNIT_ASSERT_GT(test, dst_size, 0);
 
 	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
@@ -803,7 +803,7 @@ static void drm_test_fb_xrgb8888_to_argb8888(struct kunit *test)
 	};
 
 	dst_size = conversion_buf_size(DRM_FORMAT_ARGB8888,
-				       result->dst_pitch, &params->clip);
+				       result->dst_pitch, &params->clip, 0);
 	KUNIT_ASSERT_GT(test, dst_size, 0);
 
 	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
@@ -838,7 +838,7 @@ static void drm_test_fb_xrgb8888_to_xrgb2101010(struct kunit *test)
 	};
 
 	dst_size = conversion_buf_size(DRM_FORMAT_XRGB2101010,
-				       result->dst_pitch, &params->clip);
+				       result->dst_pitch, &params->clip, 0);
 	KUNIT_ASSERT_GT(test, dst_size, 0);
 
 	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
@@ -872,7 +872,7 @@ static void drm_test_fb_xrgb8888_to_argb2101010(struct kunit *test)
 	};
 
 	dst_size = conversion_buf_size(DRM_FORMAT_ARGB2101010,
-				       result->dst_pitch, &params->clip);
+				       result->dst_pitch, &params->clip, 0);
 	KUNIT_ASSERT_GT(test, dst_size, 0);
 
 	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
@@ -906,7 +906,7 @@ static void drm_test_fb_xrgb8888_to_mono(struct kunit *test)
 		.pitches = { params->pitch, 0, 0 },
 	};
 
-	dst_size = conversion_buf_size(DRM_FORMAT_C1, result->dst_pitch, &params->clip);
+	dst_size = conversion_buf_size(DRM_FORMAT_C1, result->dst_pitch, &params->clip, 0);
 
 	KUNIT_ASSERT_GT(test, dst_size, 0);
 
@@ -939,7 +939,7 @@ static void drm_test_fb_swab(struct kunit *test)
 		.pitches = { params->pitch, 0, 0 },
 	};
 
-	dst_size = conversion_buf_size(DRM_FORMAT_XRGB8888, result->dst_pitch, &params->clip);
+	dst_size = conversion_buf_size(DRM_FORMAT_XRGB8888, result->dst_pitch, &params->clip, 0);
 
 	KUNIT_ASSERT_GT(test, dst_size, 0);
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 6/6] drm/format-helper: Add KUnit tests for drm_fb_memcpy()
  2023-07-21 18:23 [PATCH 0/6] Increase code coverage on drm_format_helper.c Arthur Grillo
                   ` (4 preceding siblings ...)
  2023-07-21 18:23 ` [PATCH 5/6] drm/format-helper-test: Add multi-plane support to conversion_buf_size() Arthur Grillo
@ 2023-07-21 18:23 ` Arthur Grillo
  2023-07-25 14:14   ` kernel test robot
  2023-08-05 13:26   ` Maira Canal
  5 siblings, 2 replies; 20+ messages in thread
From: Arthur Grillo @ 2023-07-21 18:23 UTC (permalink / raw)
  To: dri-devel
  Cc: tzimmermann, tales.aparecida, javierm, mairacanal, davidgow,
	jose.exposito89, andrealmeid, arthurgrillo

Insert parameterized test for the drm_fb_memcpy() to ensure correctness
and prevent future regressions. The test case can accept different
formats.

Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
---
 .../gpu/drm/tests/drm_format_helper_test.c    | 391 ++++++++++++++++++
 1 file changed, 391 insertions(+)

diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
index 6ecd92898e8e..3db4b95f3a98 100644
--- a/drivers/gpu/drm/tests/drm_format_helper_test.c
+++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
@@ -1189,6 +1189,396 @@ static void drm_test_fb_build_fourcc_list(struct kunit *test)
 	KUNIT_EXPECT_MEMEQ(test, fourccs_out, params->expected, TEST_BUF_SIZE);
 }
 
+struct fb_memcpy_result {
+	unsigned int dst_pitches[DRM_FORMAT_MAX_PLANES];
+	const u32 expected[DRM_FORMAT_MAX_PLANES][TEST_BUF_SIZE];
+};
+
+struct multi_plane_op_case {
+	const char *name;
+	u32 format;
+	struct drm_rect clip;
+	unsigned int src_pitches[DRM_FORMAT_MAX_PLANES];
+	const u32 src[DRM_FORMAT_MAX_PLANES][TEST_BUF_SIZE];
+	struct fb_memcpy_result memcpy_result;
+};
+
+/* The `src` and `expected` buffers are u32 arrays. To deal with planes that
+ * have a cpp != 4 the values are stored together on the same u32 number in a
+ * way so the order in memory is correct in a little-endian machine.
+ *
+ * Because of that, on some occasions, parts of a u32 will not be part of the
+ * test, to make this explicit the 0xFF byte is used on those parts.
+ */
+
+static struct multi_plane_op_case multi_plane_op_cases[] = {
+	{
+		.name = "single_pixel_source_buffer",
+		.format = DRM_FORMAT_XRGB8888,
+		.clip = DRM_RECT_INIT(0, 0, 1, 1),
+		.src_pitches = { 1 * 4 },
+		.src = {{ 0x01020304 }},
+		.memcpy_result = {
+			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
+			.expected = {{ 0x01020304 }},
+		}
+	},
+	{
+		.name = "single_pixel_source_buffer",
+		.format = DRM_FORMAT_XRGB8888_A8,
+		.clip = DRM_RECT_INIT(0, 0, 1, 1),
+		.src_pitches = { 1 * 4, 1 },
+		.src = {
+			{ 0x01020304 },
+			{ 0xFFFFFF01 },
+		},
+		.memcpy_result = {
+			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
+			.expected = {
+				{ 0x01020304 },
+				{ 0x00000001 },
+			},
+		},
+	},
+	{
+		.name = "single_pixel_source_buffer",
+		.format = DRM_FORMAT_YUV444,
+		.clip = DRM_RECT_INIT(0, 0, 1, 1),
+		.src_pitches = { 1, 1, 1 },
+		.src = {
+			{ 0xFFFFFF01 },
+			{ 0xFFFFFF01 },
+			{ 0xFFFFFF01 },
+		},
+		.memcpy_result = {
+			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
+			.expected = {
+				{ 0x00000001 },
+				{ 0x00000001 },
+				{ 0x00000001 },
+			},
+		},
+	},
+	{
+		.name = "single_pixel_clip_rectangle",
+		.format = DRM_FORMAT_XBGR8888,
+		.clip = DRM_RECT_INIT(1, 1, 1, 1),
+		.src_pitches = { 2 * 4 },
+		.src = {
+			{
+				0x00000000, 0x00000000,
+				0x00000000, 0x01020304,
+			},
+		},
+		.memcpy_result = {
+			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
+			.expected = {
+				{ 0x01020304 },
+			},
+		},
+	},
+	{
+		.name = "single_pixel_clip_rectangle",
+		.format = DRM_FORMAT_XRGB8888_A8,
+		.clip = DRM_RECT_INIT(1, 1, 1, 1),
+		.src_pitches = { 2 * 4, 2 * 1 },
+		.src = {
+			{
+				0x00000000, 0x00000000,
+				0x00000000, 0x01020304,
+			},
+			{ 0x01000000 },
+		},
+		.memcpy_result = {
+			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
+			.expected = {
+				{ 0x01020304 },
+				{ 0x00000001 },
+			},
+		},
+	},
+	{
+		.name = "single_pixel_clip_rectangle",
+		.format = DRM_FORMAT_YUV444,
+		.clip = DRM_RECT_INIT(1, 1, 1, 1),
+		.src_pitches = { 2 * 1, 2 * 1, 2 * 1 },
+		.src = {
+			{ 0x01000000 },
+			{ 0x01000000 },
+			{ 0x01000000 },
+		},
+		.memcpy_result = {
+			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
+			.expected = {
+				{ 0x00000001 },
+				{ 0x00000001 },
+				{ 0x00000001 },
+			},
+		},
+	},
+	{
+		.name = "well_known_colors",
+		.format = DRM_FORMAT_XBGR8888,
+		.clip = DRM_RECT_INIT(1, 1, 2, 4),
+		.src_pitches = { 4 * 4 },
+		.src = {
+			{
+				0x00000000, 0x00000000, 0x00000000, 0x00000000,
+				0x00000000, 0x11FFFFFF, 0x22000000, 0x00000000,
+				0x00000000, 0x33FF0000, 0x4400FF00, 0x00000000,
+				0x00000000, 0x550000FF, 0x66FF00FF, 0x00000000,
+				0x00000000, 0x77FFFF00, 0x8800FFFF, 0x00000000,
+			},
+		},
+		.memcpy_result = {
+			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
+			.expected = {
+				{
+					0x11FFFFFF, 0x22000000,
+					0x33FF0000, 0x4400FF00,
+					0x550000FF, 0x66FF00FF,
+					0x77FFFF00, 0x8800FFFF,
+				},
+			},
+		},
+	},
+	{
+		.name = "well_known_colors",
+		.format = DRM_FORMAT_XRGB8888_A8,
+		.clip = DRM_RECT_INIT(1, 1, 2, 4),
+		.src_pitches = { 4 * 4, 4 * 1 },
+		.src = {
+			{
+				0x00000000, 0x00000000, 0x00000000, 0x00000000,
+				0x00000000, 0xFFFFFFFF, 0xFF000000, 0x00000000,
+				0x00000000, 0xFFFF0000, 0xFF00FF00, 0x00000000,
+				0x00000000, 0xFF0000FF, 0xFFFF00FF, 0x00000000,
+				0x00000000, 0xFFFFFF00, 0xFF00FFFF, 0x00000000,
+			},
+			{
+				0x00000000,
+				0x00221100,
+				0x00443300,
+				0x00665500,
+				0x00887700,
+			},
+		},
+		.memcpy_result = {
+			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
+			.expected = {
+				{
+					0xFFFFFFFF, 0xFF000000,
+					0xFFFF0000, 0xFF00FF00,
+					0xFF0000FF, 0xFFFF00FF,
+					0xFFFFFF00, 0xFF00FFFF,
+				},
+				{
+					0x44332211,
+					0x88776655,
+				},
+			},
+		},
+	},
+	{
+		.name = "well_known_colors",
+		.format = DRM_FORMAT_YUV444,
+		.clip = DRM_RECT_INIT(1, 1, 2, 4),
+		.src_pitches = { 4 * 1, 4 * 1, 4 * 1 },
+		.src = {
+			{
+				0x00000000,
+				0x0000FF00,
+				0x00954C00,
+				0x00691D00,
+				0x00B2E100,
+			},
+			{
+				0x00000000,
+				0x00000000,
+				0x00BEDE00,
+				0x00436500,
+				0x00229B00,
+			},
+			{
+				0x00000000,
+				0x00000000,
+				0x007E9C00,
+				0x0083E700,
+				0x00641A00,
+			},
+		},
+		.memcpy_result = {
+			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
+			.expected = {
+				{
+					0x954C00FF,
+					0xB2E1691D,
+				},
+				{
+					0xBEDE0000,
+					0x229B4365,
+				},
+				{
+					0x7E9C0000,
+					0x641A83E7,
+				},
+			},
+		},
+	},
+	{
+		.name = "destination_pitch",
+		.format = DRM_FORMAT_XBGR8888,
+		.clip = DRM_RECT_INIT(0, 0, 3, 3),
+		.src_pitches = { 3 * 4 },
+		.src = {
+			{
+				0xA10E449C, 0xB1114D05, 0xC1A8F303,
+				0xD16CF073, 0xA20E449C, 0xB2114D05,
+				0xC2A80303, 0xD26CF073, 0xA30E449C,
+			},
+		},
+		.memcpy_result = {
+			.dst_pitches = { 5 * 4 },
+			.expected = {
+				{
+					0xA10E449C, 0xB1114D05, 0xC1A8F303, 0x00000000, 0x00000000,
+					0xD16CF073, 0xA20E449C, 0xB2114D05, 0x00000000, 0x00000000,
+					0xC2A80303, 0xD26CF073, 0xA30E449C, 0x00000000, 0x00000000,
+				},
+			},
+		},
+	},
+	{
+		.name = "destination_pitch",
+		.format = DRM_FORMAT_XRGB8888_A8,
+		.clip = DRM_RECT_INIT(0, 0, 3, 3),
+		.src_pitches = { 3 * 4, 3 * 1 },
+		.src = {
+			{
+				0xFF0E449C, 0xFF114D05, 0xFFA8F303,
+				0xFF6CF073, 0xFF0E449C, 0xFF114D05,
+				0xFFA80303, 0xFF6CF073, 0xFF0E449C,
+			},
+			{
+				0xB2C1B1A1,
+				0xD2A3D1A2,
+				0xFFFFFFC2,
+			},
+		},
+		.memcpy_result = {
+			.dst_pitches = { 5 * 4, 5 * 1 },
+			.expected = {
+				{
+					0xFF0E449C, 0xFF114D05, 0xFFA8F303, 0x00000000, 0x00000000,
+					0xFF6CF073, 0xFF0E449C, 0xFF114D05, 0x00000000, 0x00000000,
+					0xFFA80303, 0xFF6CF073, 0xFF0E449C, 0x00000000, 0x00000000,
+				},
+				{
+					0x00C1B1A1,
+					0xD1A2B200,
+					0xD2A30000,
+					0xFF0000C2,
+				},
+			},
+		},
+	},
+	{
+		.name = "destination_pitch",
+		.format = DRM_FORMAT_YUV444,
+		.clip = DRM_RECT_INIT(0, 0, 3, 3),
+		.src_pitches = { 3 * 1, 3 * 1, 3 * 1 },
+		.src = {
+			{
+				0xBAC1323D,
+				0xBA34323D,
+				0xFFFFFF3D,
+			},
+			{
+				0xE1ABEC2A,
+				0xE1EAEC2A,
+				0xFFFFFF2A,
+			},
+			{
+				0xBCEBE4D7,
+				0xBC65E4D7,
+				0xFFFFFFD7,
+			},
+		},
+		.memcpy_result = {
+			.dst_pitches = { 5 * 1, 5 * 1, 5 * 1 },
+			.expected = {
+				{
+					0x00C1323D,
+					0x323DBA00,
+					0xBA340000,
+					0xFF00003D,
+				},
+				{
+					0x00ABEC2A,
+					0xEC2AE100,
+					0xE1EA0000,
+					0xFF00002A,
+				},
+				{
+					0x00EBE4D7,
+					0xE4D7BC00,
+					0xBC650000,
+					0xFF0000D7,
+				},
+			},
+		},
+	},
+};
+
+static void multi_plane_op_case_desc(struct multi_plane_op_case *t, char *desc)
+{
+	snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s: %p4cc", t->name, &t->format);
+}
+
+KUNIT_ARRAY_PARAM(multi_plane_op, multi_plane_op_cases, multi_plane_op_case_desc);
+
+static void drm_test_fb_memcpy(struct kunit *test)
+{
+	const struct multi_plane_op_case *params = test->param_value;
+	const struct fb_memcpy_result *result = &params->memcpy_result;
+	size_t dst_size[DRM_FORMAT_MAX_PLANES] = { 0 };
+	u32 *buf[DRM_FORMAT_MAX_PLANES] = { 0 };
+	u32 *src_cp[DRM_FORMAT_MAX_PLANES] = { 0 };
+	u32 *expected[DRM_FORMAT_MAX_PLANES] = { 0 };
+	struct iosys_map dst[DRM_FORMAT_MAX_PLANES];
+	struct iosys_map src[DRM_FORMAT_MAX_PLANES];
+
+	struct drm_framebuffer fb = {
+		.format = drm_format_info(params->format),
+	};
+
+	memcpy(fb.pitches, params->src_pitches, DRM_FORMAT_MAX_PLANES * sizeof(int));
+
+	for (size_t i = 0; i < fb.format->num_planes; i++) {
+		dst_size[i] = conversion_buf_size(params->format, result->dst_pitches[i],
+						  &params->clip, i);
+		KUNIT_ASSERT_GT(test, dst_size[i], 0);
+
+		buf[i] = kunit_kzalloc(test, dst_size[i], GFP_KERNEL);
+		KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf[i]);
+		iosys_map_set_vaddr(&dst[i], buf[i]);
+
+		src_cp[i] = cpubuf_to_le32(test, params->src[i], TEST_BUF_SIZE);
+		iosys_map_set_vaddr(&src[i], src_cp[i]);
+	}
+
+	if (result->dst_pitches[0] == TEST_USE_DEFAULT_PITCH)
+		drm_fb_memcpy(dst, NULL, src, &fb, &params->clip);
+	else
+		drm_fb_memcpy(dst, result->dst_pitches, src, &fb, &params->clip);
+
+	for (size_t i = 0; i < fb.format->num_planes; i++) {
+		expected[i] = cpubuf_to_le32(test, result->expected[i], TEST_BUF_SIZE);
+		KUNIT_EXPECT_MEMEQ_MSG(test, buf[i], expected[i], dst_size[i],
+				       "Failed expectation on plane %zu", i);
+	}
+}
+
 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),
@@ -1204,6 +1594,7 @@ static struct kunit_case drm_format_helper_test_cases[] = {
 	KUNIT_CASE_PARAM(drm_test_fb_swab, convert_xrgb8888_gen_params),
 	KUNIT_CASE_PARAM(drm_test_fb_clip_offset, clip_offset_gen_params),
 	KUNIT_CASE_PARAM(drm_test_fb_build_fourcc_list, fb_build_fourcc_list_gen_params),
+	KUNIT_CASE_PARAM(drm_test_fb_memcpy, multi_plane_op_gen_params),
 	{}
 };
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH 6/6] drm/format-helper: Add KUnit tests for drm_fb_memcpy()
  2023-07-21 18:23 ` [PATCH 6/6] drm/format-helper: Add KUnit tests for drm_fb_memcpy() Arthur Grillo
@ 2023-07-25 14:14   ` kernel test robot
  2023-08-05 13:26   ` Maira Canal
  1 sibling, 0 replies; 20+ messages in thread
From: kernel test robot @ 2023-07-25 14:14 UTC (permalink / raw)
  To: Arthur Grillo, dri-devel
  Cc: tzimmermann, tales.aparecida, javierm, mairacanal, davidgow,
	oe-kbuild-all, jose.exposito89, andrealmeid, arthurgrillo

Hi Arthur,

kernel test robot noticed the following build warnings:

[auto build test WARNING on drm-misc/drm-misc-next]
[also build test WARNING on drm/drm-next drm-exynos/exynos-drm-next drm-intel/for-linux-next drm-intel/for-linux-next-fixes drm-tip/drm-tip linus/master v6.5-rc3 next-20230725]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Arthur-Grillo/drm-format-helper-Test-default-pitch-fallback/20230722-022649
base:   git://anongit.freedesktop.org/drm/drm-misc drm-misc-next
patch link:    https://lore.kernel.org/r/20230721182316.560649-7-arthurgrillo%40riseup.net
patch subject: [PATCH 6/6] drm/format-helper: Add KUnit tests for drm_fb_memcpy()
config: nios2-randconfig-r093-20230723 (https://download.01.org/0day-ci/archive/20230725/202307252148.wr2nafKj-lkp@intel.com/config)
compiler: nios2-linux-gcc (GCC) 12.3.0
reproduce: (https://download.01.org/0day-ci/archive/20230725/202307252148.wr2nafKj-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202307252148.wr2nafKj-lkp@intel.com/

sparse warnings: (new ones prefixed by >>)
   drivers/gpu/drm/tests/drm_format_helper_test.c:856:36: sparse: sparse: incorrect type in argument 2 (different base types) @@     expected restricted __le32 const [usertype] *buf @@     got unsigned int [usertype] *[assigned] buf @@
   drivers/gpu/drm/tests/drm_format_helper_test.c:856:36: sparse:     expected restricted __le32 const [usertype] *buf
   drivers/gpu/drm/tests/drm_format_helper_test.c:856:36: sparse:     got unsigned int [usertype] *[assigned] buf
   drivers/gpu/drm/tests/drm_format_helper_test.c:1058:34: sparse: sparse: symbol 'fb_build_fourcc_list_cases' was not declared. Should it be static?
>> drivers/gpu/drm/tests/drm_format_helper_test.c:1566:27: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned int [usertype] * @@     got restricted __le32 [usertype] * @@
   drivers/gpu/drm/tests/drm_format_helper_test.c:1566:27: sparse:     expected unsigned int [usertype] *
   drivers/gpu/drm/tests/drm_format_helper_test.c:1566:27: sparse:     got restricted __le32 [usertype] *
   drivers/gpu/drm/tests/drm_format_helper_test.c:1576:29: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned int [usertype] * @@     got restricted __le32 [usertype] * @@
   drivers/gpu/drm/tests/drm_format_helper_test.c:1576:29: sparse:     expected unsigned int [usertype] *
   drivers/gpu/drm/tests/drm_format_helper_test.c:1576:29: sparse:     got restricted __le32 [usertype] *

vim +1566 drivers/gpu/drm/tests/drm_format_helper_test.c

  1539	
  1540	static void drm_test_fb_memcpy(struct kunit *test)
  1541	{
  1542		const struct multi_plane_op_case *params = test->param_value;
  1543		const struct fb_memcpy_result *result = &params->memcpy_result;
  1544		size_t dst_size[DRM_FORMAT_MAX_PLANES] = { 0 };
  1545		u32 *buf[DRM_FORMAT_MAX_PLANES] = { 0 };
  1546		u32 *src_cp[DRM_FORMAT_MAX_PLANES] = { 0 };
  1547		u32 *expected[DRM_FORMAT_MAX_PLANES] = { 0 };
  1548		struct iosys_map dst[DRM_FORMAT_MAX_PLANES];
  1549		struct iosys_map src[DRM_FORMAT_MAX_PLANES];
  1550	
  1551		struct drm_framebuffer fb = {
  1552			.format = drm_format_info(params->format),
  1553		};
  1554	
  1555		memcpy(fb.pitches, params->src_pitches, DRM_FORMAT_MAX_PLANES * sizeof(int));
  1556	
  1557		for (size_t i = 0; i < fb.format->num_planes; i++) {
  1558			dst_size[i] = conversion_buf_size(params->format, result->dst_pitches[i],
  1559							  &params->clip, i);
  1560			KUNIT_ASSERT_GT(test, dst_size[i], 0);
  1561	
  1562			buf[i] = kunit_kzalloc(test, dst_size[i], GFP_KERNEL);
  1563			KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf[i]);
  1564			iosys_map_set_vaddr(&dst[i], buf[i]);
  1565	
> 1566			src_cp[i] = cpubuf_to_le32(test, params->src[i], TEST_BUF_SIZE);
  1567			iosys_map_set_vaddr(&src[i], src_cp[i]);
  1568		}
  1569	
  1570		if (result->dst_pitches[0] == TEST_USE_DEFAULT_PITCH)
  1571			drm_fb_memcpy(dst, NULL, src, &fb, &params->clip);
  1572		else
  1573			drm_fb_memcpy(dst, result->dst_pitches, src, &fb, &params->clip);
  1574	
  1575		for (size_t i = 0; i < fb.format->num_planes; i++) {
  1576			expected[i] = cpubuf_to_le32(test, result->expected[i], TEST_BUF_SIZE);
  1577			KUNIT_EXPECT_MEMEQ_MSG(test, buf[i], expected[i], dst_size[i],
  1578					       "Failed expectation on plane %zu", i);
  1579		}
  1580	}
  1581	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/6] drm/format-helper: Test default pitch fallback
  2023-07-21 18:23 ` [PATCH 1/6] drm/format-helper: Test default pitch fallback Arthur Grillo
@ 2023-08-05 12:56   ` Maira Canal
  2023-08-09 14:54   ` André Almeida
  1 sibling, 0 replies; 20+ messages in thread
From: Maira Canal @ 2023-08-05 12:56 UTC (permalink / raw)
  To: Arthur Grillo, dri-devel
  Cc: tales.aparecida, javierm, tzimmermann, davidgow, jose.exposito89,
	andrealmeid

Hi Arthur,

Just nitpicking, but...

On 7/21/23 15:23, Arthur Grillo wrote:
> Test the default pitch fallback when NULL is passed as the dst_pitch on
> the conversion procedures.
> 
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
> ---
>   .../gpu/drm/tests/drm_format_helper_test.c    | 132 ++++++++++++------
>   1 file changed, 87 insertions(+), 45 deletions(-)
> 

[...]

> @@ -530,7 +532,10 @@ static void drm_test_fb_xrgb8888_to_gray8(struct kunit *test)
>   	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
>   	iosys_map_set_vaddr(&src, xrgb8888);
>   
> -	drm_fb_xrgb8888_to_gray8(&dst, &result->dst_pitch, &src, &fb, &params->clip);
> +	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
> +		drm_fb_xrgb8888_to_gray8(&dst, NULL, &src, &fb, &params->clip);
> +	else
> +		drm_fb_xrgb8888_to_gray8(&dst, &result->dst_pitch, &src, &fb, &params->clip);

Couldn't we do something like:

unsigned int *dst_pitch = (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
	? NULL : &result->dst_pitch;

[...]

drm_fb_xrgb8888_to_gray8(&dst, dst_pitch, &src, &fb, &params->clip);

I believe the code would be cleaner.

Best Regards,
- Maíra

>   	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
>   }
>   
> @@ -560,7 +565,10 @@ static void drm_test_fb_xrgb8888_to_rgb332(struct kunit *test)
>   	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
>   	iosys_map_set_vaddr(&src, xrgb8888);
>   
> -	drm_fb_xrgb8888_to_rgb332(&dst, &result->dst_pitch, &src, &fb, &params->clip);
> +	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
> +		drm_fb_xrgb8888_to_rgb332(&dst, NULL, &src, &fb, &params->clip);
> +	else
> +		drm_fb_xrgb8888_to_rgb332(&dst, &result->dst_pitch, &src, &fb, &params->clip);
>   	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
>   }
>   
> @@ -590,12 +598,19 @@ static void drm_test_fb_xrgb8888_to_rgb565(struct kunit *test)
>   	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);
> +	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
> +		drm_fb_xrgb8888_to_rgb565(&dst, NULL, &src, &fb, &params->clip, false);
> +	else
> +		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);
> +	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
> +		drm_fb_xrgb8888_to_rgb565(&dst, NULL, &src, &fb, &params->clip, true);
> +	else
> +		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);
>   }
> @@ -626,7 +641,10 @@ static void drm_test_fb_xrgb8888_to_xrgb1555(struct kunit *test)
>   	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);
> +	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
> +		drm_fb_xrgb8888_to_xrgb1555(&dst, NULL, &src, &fb, &params->clip);
> +	else
> +		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_MEMEQ(test, buf, result->expected, dst_size);
>   }
> @@ -657,7 +675,10 @@ static void drm_test_fb_xrgb8888_to_argb1555(struct kunit *test)
>   	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);
> +	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
> +		drm_fb_xrgb8888_to_argb1555(&dst, NULL, &src, &fb, &params->clip);
> +	else
> +		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_MEMEQ(test, buf, result->expected, dst_size);
>   }
> @@ -688,7 +709,10 @@ static void drm_test_fb_xrgb8888_to_rgba5551(struct kunit *test)
>   	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);
> +	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
> +		drm_fb_xrgb8888_to_rgba5551(&dst, &result->dst_pitch, &src, &fb, &params->clip);
> +	else
> +		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_MEMEQ(test, buf, result->expected, dst_size);
>   }
> @@ -723,7 +747,11 @@ static void drm_test_fb_xrgb8888_to_rgb888(struct kunit *test)
>   	 * 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);
> +	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
> +		drm_fb_xrgb8888_to_rgb888(&dst, NULL, &src, &fb, &params->clip);
> +	else
> +		drm_fb_xrgb8888_to_rgb888(&dst, &result->dst_pitch, &src, &fb, &params->clip);
> +
>   	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
>   }
>   
> @@ -753,7 +781,11 @@ static void drm_test_fb_xrgb8888_to_argb8888(struct kunit *test)
>   	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);
> +	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
> +		drm_fb_xrgb8888_to_argb8888(&dst, NULL, &src, &fb, &params->clip);
> +	else
> +		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_MEMEQ(test, buf, result->expected, dst_size);
>   }
> @@ -784,7 +816,10 @@ static void drm_test_fb_xrgb8888_to_xrgb2101010(struct kunit *test)
>   	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
>   	iosys_map_set_vaddr(&src, xrgb8888);
>   
> -	drm_fb_xrgb8888_to_xrgb2101010(&dst, &result->dst_pitch, &src, &fb, &params->clip);
> +	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
> +		drm_fb_xrgb8888_to_xrgb2101010(&dst, NULL, &src, &fb, &params->clip);
> +	else
> +		drm_fb_xrgb8888_to_xrgb2101010(&dst, &result->dst_pitch, &src, &fb, &params->clip);
>   	buf = le32buf_to_cpu(test, buf, dst_size / sizeof(u32));
>   	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
>   }
> @@ -815,7 +850,11 @@ static void drm_test_fb_xrgb8888_to_argb2101010(struct kunit *test)
>   	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);
> +	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
> +		drm_fb_xrgb8888_to_argb2101010(&dst, NULL, &src, &fb, &params->clip);
> +	else
> +		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_MEMEQ(test, buf, result->expected, dst_size);
>   }
> @@ -846,7 +885,10 @@ static void drm_test_fb_xrgb8888_to_mono(struct kunit *test)
>   	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xrgb8888);
>   	iosys_map_set_vaddr(&src, xrgb8888);
>   
> -	drm_fb_xrgb8888_to_mono(&dst, &result->dst_pitch, &src, &fb, &params->clip);
> +	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
> +		drm_fb_xrgb8888_to_mono(&dst, NULL, &src, &fb, &params->clip);
> +	else
> +		drm_fb_xrgb8888_to_mono(&dst, &result->dst_pitch, &src, &fb, &params->clip);
>   	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
>   }
>   

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/6] drm/format-helper: Add KUnit tests for drm_fb_swab()
  2023-07-21 18:23 ` [PATCH 2/6] drm/format-helper: Add KUnit tests for drm_fb_swab() Arthur Grillo
@ 2023-08-05 13:02   ` Maira Canal
  2023-08-09 14:57   ` André Almeida
  1 sibling, 0 replies; 20+ messages in thread
From: Maira Canal @ 2023-08-05 13:02 UTC (permalink / raw)
  To: Arthur Grillo, dri-devel
  Cc: tales.aparecida, javierm, tzimmermann, davidgow, jose.exposito89,
	andrealmeid

On 7/21/23 15:23, Arthur Grillo wrote:
> Insert parameterized test for the drm_fb_swab() to ensure correctness
> and prevent future regressions.
> 
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>

With the nit I pointed in patch #1 addressed,

Reviewed-by: Maíra Canal <mairacanal@riseup.net>

Best Regards,
- Maíra

> ---
>   .../gpu/drm/tests/drm_format_helper_test.c    | 66 +++++++++++++++++++
>   1 file changed, 66 insertions(+)
> 
> diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
> index bc6894f0a202..abeda642d84a 100644
> --- a/drivers/gpu/drm/tests/drm_format_helper_test.c
> +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
> @@ -74,6 +74,11 @@ struct convert_to_mono_result {
>   	const u8 expected[TEST_BUF_SIZE];
>   };
>   
> +struct fb_swab_result {
> +	unsigned int dst_pitch;
> +	const u32 expected[TEST_BUF_SIZE];
> +};
> +
>   struct convert_xrgb8888_case {
>   	const char *name;
>   	unsigned int pitch;
> @@ -90,6 +95,7 @@ struct convert_xrgb8888_case {
>   	struct convert_to_xrgb2101010_result xrgb2101010_result;
>   	struct convert_to_argb2101010_result argb2101010_result;
>   	struct convert_to_mono_result mono_result;
> +	struct fb_swab_result swab_result;
>   };
>   
>   static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
> @@ -143,6 +149,10 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
>   			.dst_pitch =  TEST_USE_DEFAULT_PITCH,
>   			.expected = { 0b0 },
>   		},
> +		.swab_result = {
> +			.dst_pitch =  TEST_USE_DEFAULT_PITCH,
> +			.expected = { 0x0000FF01 },
> +		},
>   	},
>   	{
>   		.name = "single_pixel_clip_rectangle",
> @@ -197,6 +207,10 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
>   			.dst_pitch = TEST_USE_DEFAULT_PITCH,
>   			.expected = { 0b0 },
>   		},
> +		.swab_result = {
> +			.dst_pitch =  TEST_USE_DEFAULT_PITCH,
> +			.expected = { 0x0000FF10 },
> +		},
>   	},
>   	{
>   		/* Well known colors: White, black, red, green, blue, magenta,
> @@ -318,6 +332,15 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
>   				0b11,
>   			},
>   		},
> +		.swab_result = {
> +			.dst_pitch =  TEST_USE_DEFAULT_PITCH,
> +			.expected = {
> +				0xFFFFFF11, 0x00000022,
> +				0x0000FF33, 0x00FF0044,
> +				0xFF000055, 0xFF00FF66,
> +				0x00FFFF77, 0xFFFF0088,
> +			},
> +		},
>   	},
>   	{
>   		/* Randomly picked colors. Full buffer within the clip area. */
> @@ -425,6 +448,14 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
>   				0b010, 0b000,
>   			},
>   		},
> +		.swab_result = {
> +			.dst_pitch =  20,
> +			.expected = {
> +				0x9C440EA1, 0x054D11B1, 0x03F3A8C1, 0x00000000, 0x00000000,
> +				0x73F06CD1, 0x9C440EA2, 0x054D11B2, 0x00000000, 0x00000000,
> +				0x0303A8C2, 0x73F06CD2, 0x9C440EA3, 0x00000000, 0x00000000,
> +			},
> +		},
>   	},
>   };
>   
> @@ -892,6 +923,40 @@ static void drm_test_fb_xrgb8888_to_mono(struct kunit *test)
>   	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
>   }
>   
> +static void drm_test_fb_swab(struct kunit *test)
> +{
> +	const struct convert_xrgb8888_case *params = test->param_value;
> +	const struct fb_swab_result *result = &params->swab_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_XRGB8888, 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);
> +
> +	if (result->dst_pitch == TEST_USE_DEFAULT_PITCH)
> +		drm_fb_swab(&dst, NULL, &src, &fb, &params->clip, false);
> +	else
> +		drm_fb_swab(&dst, &result->dst_pitch, &src, &fb, &params->clip, false);
> +	buf = le32buf_to_cpu(test, (__force const __le32 *)buf, dst_size / sizeof(u32));
> +	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
> +}
> +
>   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),
> @@ -904,6 +969,7 @@ static struct kunit_case drm_format_helper_test_cases[] = {
>   	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),
>   	KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_mono, convert_xrgb8888_gen_params),
> +	KUNIT_CASE_PARAM(drm_test_fb_swab, convert_xrgb8888_gen_params),
>   	{}
>   };
>   

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/6] drm/format-helper: Add KUnit tests for drm_fb_clip_offset()
  2023-07-21 18:23 ` [PATCH 3/6] drm/format-helper: Add KUnit tests for drm_fb_clip_offset() Arthur Grillo
@ 2023-08-05 13:16   ` Maira Canal
  2023-08-09 15:28   ` André Almeida
  1 sibling, 0 replies; 20+ messages in thread
From: Maira Canal @ 2023-08-05 13:16 UTC (permalink / raw)
  To: Arthur Grillo, dri-devel
  Cc: tales.aparecida, javierm, tzimmermann, davidgow, jose.exposito89,
	andrealmeid

On 7/21/23 15:23, Arthur Grillo wrote:
> Insert parameterized test for the drm_fb_clip_offset() to ensure
> correctness and prevent future regressions.
> 
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>

Could you please use the prefix drm/tests in the commit message for all
patches? Besides that:

Reviewed-by: Maíra Canal <mairacanal@riseup.net>

Best Regards,
- Maíra

> ---
>   .../gpu/drm/tests/drm_format_helper_test.c    | 91 +++++++++++++++++++
>   1 file changed, 91 insertions(+)
> 
> diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
> index abeda642d84a..2e1c5463f063 100644
> --- a/drivers/gpu/drm/tests/drm_format_helper_test.c
> +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
> @@ -957,6 +957,96 @@ static void drm_test_fb_swab(struct kunit *test)
>   	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
>   }
>   
> +struct clip_offset_case {
> +	const char *name;
> +	unsigned int pitch;
> +	u32 format;
> +	struct drm_rect clip;
> +	unsigned int expected_offset;
> +};
> +
> +static struct clip_offset_case clip_offset_cases[] = {
> +	{
> +		.name = "pass through",
> +		.pitch = TEST_USE_DEFAULT_PITCH,
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(0, 0, 3, 3),
> +		.expected_offset = 0
> +	},
> +	{
> +		.name = "horizontal offset",
> +		.pitch = TEST_USE_DEFAULT_PITCH,
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(1, 0, 3, 3),
> +		.expected_offset = 4,
> +	},
> +	{
> +		.name = "vertical offset",
> +		.pitch = TEST_USE_DEFAULT_PITCH,
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(0, 1, 3, 3),
> +		.expected_offset = 12,
> +	},
> +	{
> +		.name = "horizontal and vertical offset",
> +		.pitch = TEST_USE_DEFAULT_PITCH,
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(1, 1, 3, 3),
> +		.expected_offset = 16,
> +	},
> +	{
> +		.name = "horizontal offset (custom pitch)",
> +		.pitch = 20,
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(1, 0, 3, 3),
> +		.expected_offset = 4,
> +	},
> +	{
> +		.name = "vertical offset (custom pitch)",
> +		.pitch = 20,
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(0, 1, 3, 3),
> +		.expected_offset = 20,
> +	},
> +	{
> +		.name = "horizontal and vertical offset (custom pitch)",
> +		.pitch = 20,
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(1, 1, 3, 3),
> +		.expected_offset = 24,
> +	},
> +};
> +
> +static void clip_offset_case_desc(struct clip_offset_case *t, char *desc)
> +{
> +	strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);
> +}
> +
> +KUNIT_ARRAY_PARAM(clip_offset, clip_offset_cases, clip_offset_case_desc);
> +
> +static void drm_test_fb_clip_offset(struct kunit *test)
> +{
> +	const struct clip_offset_case *params = test->param_value;
> +	const struct drm_format_info *format_info = drm_format_info(params->format);
> +
> +	unsigned int offset = -1;
> +
> +	unsigned int pitch = params->pitch;
> +
> +	if (pitch == TEST_USE_DEFAULT_PITCH)
> +		pitch = drm_format_info_min_pitch(format_info, 0,
> +						  drm_rect_width(&params->clip));
> +
> +	/* Assure that the pitch is not zero, because this will inevitable cause the
> +	 * wrong expected result
> +	 */
> +	KUNIT_ASSERT_NE(test, pitch, 0);
> +
> +	offset = drm_fb_clip_offset(pitch, format_info, &params->clip);
> +
> +	KUNIT_EXPECT_EQ(test, offset, params->expected_offset);
> +}
> +
>   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),
> @@ -970,6 +1060,7 @@ static struct kunit_case drm_format_helper_test_cases[] = {
>   	KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_argb2101010, convert_xrgb8888_gen_params),
>   	KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_mono, convert_xrgb8888_gen_params),
>   	KUNIT_CASE_PARAM(drm_test_fb_swab, convert_xrgb8888_gen_params),
> +	KUNIT_CASE_PARAM(drm_test_fb_clip_offset, clip_offset_gen_params),
>   	{}
>   };
>   

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 4/6] drm/format-helper: Add KUnit tests for drm_fb_build_fourcc_list()
  2023-07-21 18:23 ` [PATCH 4/6] drm/format-helper: Add KUnit tests for drm_fb_build_fourcc_list() Arthur Grillo
@ 2023-08-05 13:21   ` Maira Canal
  2023-08-09 15:54   ` André Almeida
  1 sibling, 0 replies; 20+ messages in thread
From: Maira Canal @ 2023-08-05 13:21 UTC (permalink / raw)
  To: Arthur Grillo, dri-devel
  Cc: tales.aparecida, javierm, mairacanal, tzimmermann, davidgow,
	jose.exposito89, andrealmeid

On 7/21/23 15:23, Arthur Grillo wrote:> Insert parameterized test for 
the drm_fb_build_fourcc_list() to ensure
> correctness and prevent future regressions.
> 
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
> ---
>   .../gpu/drm/tests/drm_format_helper_test.c    | 143 ++++++++++++++++++
>   1 file changed, 143 insertions(+)
> 
> diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
> index 2e1c5463f063..de4677868647 100644
> --- a/drivers/gpu/drm/tests/drm_format_helper_test.c
> +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
> @@ -3,6 +3,7 @@
>   #include <kunit/test.h>
>   
>   #include <drm/drm_device.h>
> +#include <drm/drm_drv.h>
>   #include <drm/drm_file.h>
>   #include <drm/drm_format_helper.h>
>   #include <drm/drm_fourcc.h>
> @@ -11,6 +12,7 @@
>   #include <drm/drm_mode.h>
>   #include <drm/drm_print.h>
>   #include <drm/drm_rect.h>
> +#include <drm/drm_kunit_helpers.h>
>   
>   #include "../drm_crtc_internal.h"
>   
> @@ -1047,6 +1049,146 @@ static void drm_test_fb_clip_offset(struct kunit *test)
>   	KUNIT_EXPECT_EQ(test, offset, params->expected_offset);
>   }
>   
> +struct fb_build_fourcc_list_case {
> +	const char *name;
> +	u32 native_fourccs[TEST_BUF_SIZE];
> +	u32 expected[TEST_BUF_SIZE];
> +};
> +
> +struct fb_build_fourcc_list_case fb_build_fourcc_list_cases[] = {
> +	{
> +		.name = "no native formats",
> +		.native_fourccs = { },
> +		.expected = { DRM_FORMAT_XRGB8888 },
> +	},
> +	{
> +		.name = "XRGB8888 as native format",
> +		.native_fourccs = { DRM_FORMAT_XRGB8888 },
> +		.expected = { DRM_FORMAT_XRGB8888 },
> +	},
> +	{
> +		.name = "remove duplicates",
> +		.native_fourccs = {
> +			DRM_FORMAT_XRGB8888,
> +			DRM_FORMAT_XRGB8888,
> +			DRM_FORMAT_RGB888,
> +			DRM_FORMAT_RGB888,
> +			DRM_FORMAT_RGB888,
> +			DRM_FORMAT_XRGB8888,
> +			DRM_FORMAT_RGB888,
> +			DRM_FORMAT_RGB565,
> +			DRM_FORMAT_RGB888,
> +			DRM_FORMAT_XRGB8888,
> +			DRM_FORMAT_RGB565,
> +			DRM_FORMAT_RGB565,
> +			DRM_FORMAT_XRGB8888,
> +		},
> +		.expected = {
> +			DRM_FORMAT_XRGB8888,
> +			DRM_FORMAT_RGB888,
> +			DRM_FORMAT_RGB565,
> +		},
> +	},
> +	{
> +		.name = "convert alpha formats",
> +		.native_fourccs = {
> +			DRM_FORMAT_ARGB1555,
> +			DRM_FORMAT_ABGR1555,
> +			DRM_FORMAT_RGBA5551,
> +			DRM_FORMAT_BGRA5551,
> +			DRM_FORMAT_ARGB8888,
> +			DRM_FORMAT_ABGR8888,
> +			DRM_FORMAT_RGBA8888,
> +			DRM_FORMAT_BGRA8888,
> +			DRM_FORMAT_ARGB2101010,
> +			DRM_FORMAT_ABGR2101010,
> +			DRM_FORMAT_RGBA1010102,
> +			DRM_FORMAT_BGRA1010102,
> +		},
> +		.expected = {
> +			DRM_FORMAT_XRGB1555,
> +			DRM_FORMAT_XBGR1555,
> +			DRM_FORMAT_RGBX5551,
> +			DRM_FORMAT_BGRX5551,
> +			DRM_FORMAT_XRGB8888,
> +			DRM_FORMAT_XBGR8888,
> +			DRM_FORMAT_RGBX8888,
> +			DRM_FORMAT_BGRX8888,
> +			DRM_FORMAT_XRGB2101010,
> +			DRM_FORMAT_XBGR2101010,
> +			DRM_FORMAT_RGBX1010102,
> +			DRM_FORMAT_BGRX1010102,
> +		},
> +	},
> +	{
> +		.name = "random formats",
> +		.native_fourccs = {
> +			DRM_FORMAT_Y212,
> +			DRM_FORMAT_ARGB1555,
> +			DRM_FORMAT_ABGR16161616F,
> +			DRM_FORMAT_C8,
> +			DRM_FORMAT_BGR888,
> +			DRM_FORMAT_XRGB1555,
> +			DRM_FORMAT_RGBA5551,
> +			DRM_FORMAT_BGR565_A8,
> +			DRM_FORMAT_R10,
> +			DRM_FORMAT_XYUV8888,
> +		},
> +		.expected = {
> +			DRM_FORMAT_Y212,
> +			DRM_FORMAT_XRGB1555,
> +			DRM_FORMAT_ABGR16161616F,
> +			DRM_FORMAT_C8,
> +			DRM_FORMAT_BGR888,
> +			DRM_FORMAT_RGBX5551,
> +			DRM_FORMAT_BGR565_A8,
> +			DRM_FORMAT_R10,
> +			DRM_FORMAT_XYUV8888,
> +			DRM_FORMAT_XRGB8888,
> +		},
> +	},
> +};
> +
> +static void fb_build_fourcc_list_case_desc(struct fb_build_fourcc_list_case *t, char *desc)
> +{
> +	strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);
> +}
> +
> +KUNIT_ARRAY_PARAM(fb_build_fourcc_list, fb_build_fourcc_list_cases, fb_build_fourcc_list_case_desc);
> +
> +static size_t get_nfourccs(const u32 *fourccs)
> +{
> +	size_t i;
> +
> +	for (i = 0; i < TEST_BUF_SIZE && fourccs[i]; ++i)
> +		;
> +
> +	return i;
> +}
> +
> +static void drm_test_fb_build_fourcc_list(struct kunit *test)
> +{
> +	const struct fb_build_fourcc_list_case *params = test->param_value;
> +	u32 fourccs_out[TEST_BUF_SIZE];
> +	size_t nfourccs_out;
> +	struct drm_device *drm;
> +	struct device *dev;
> +
> +	dev = drm_kunit_helper_alloc_device(test);
> +	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
> +
> +	drm = __drm_kunit_helper_alloc_drm_device(test, dev, sizeof(*drm), 0, DRIVER_MODESET);
> +	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, drm);
> +
> +	nfourccs_out = drm_fb_build_fourcc_list(drm, params->native_fourccs,
> +						get_nfourccs(params->native_fourccs),
> +						fourccs_out, TEST_BUF_SIZE);
> +
> +	drm_kunit_helper_free_device(test, dev);

I believe that this function is no longer needed after Maxime's patches.

> +	KUNIT_EXPECT_EQ(test, nfourccs_out, get_nfourccs(params->expected));

Instead of using this get_fourccs() functions, wouldn't it be better to
hardcode the number of expected fourccs in the cases?

Best Regards,
- Maíra

> +	KUNIT_EXPECT_MEMEQ(test, fourccs_out, params->expected, TEST_BUF_SIZE);
> +}
> +
>   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),
> @@ -1061,6 +1203,7 @@ static struct kunit_case drm_format_helper_test_cases[] = {
>   	KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_mono, convert_xrgb8888_gen_params),
>   	KUNIT_CASE_PARAM(drm_test_fb_swab, convert_xrgb8888_gen_params),
>   	KUNIT_CASE_PARAM(drm_test_fb_clip_offset, clip_offset_gen_params),
> +	KUNIT_CASE_PARAM(drm_test_fb_build_fourcc_list, fb_build_fourcc_list_gen_params),
>   	{}
>   };
>   

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/6] drm/format-helper-test: Add multi-plane support to conversion_buf_size()
  2023-07-21 18:23 ` [PATCH 5/6] drm/format-helper-test: Add multi-plane support to conversion_buf_size() Arthur Grillo
@ 2023-08-05 13:22   ` Maira Canal
  2023-08-09 16:16   ` André Almeida
  1 sibling, 0 replies; 20+ messages in thread
From: Maira Canal @ 2023-08-05 13:22 UTC (permalink / raw)
  To: Arthur Grillo, dri-devel
  Cc: tales.aparecida, javierm, tzimmermann, davidgow, jose.exposito89,
	andrealmeid

On 7/21/23 15:23, Arthur Grillo wrote:
> The drm_fb_memcpy() supports multi-plane formats. To fully test it in
> the future, add multi-plane support to the conversion_buf_size() helper.
> 
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>

Reviewed-by: Maíra Canal <mairacanal@riseup.net>

Best Regards,
- Maíra

> ---
>   .../gpu/drm/tests/drm_format_helper_test.c    | 28 +++++++++----------
>   1 file changed, 14 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
> index de4677868647..6ecd92898e8e 100644
> --- a/drivers/gpu/drm/tests/drm_format_helper_test.c
> +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
> @@ -472,7 +472,7 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
>    * The size of the destination buffer or negative value on error.
>    */
>   static size_t conversion_buf_size(u32 dst_format, unsigned int dst_pitch,
> -				  const struct drm_rect *clip)
> +				  const struct drm_rect *clip, int plane)
>   {
>   	const struct drm_format_info *dst_fi = drm_format_info(dst_format);
>   
> @@ -480,7 +480,7 @@ static size_t conversion_buf_size(u32 dst_format, unsigned int dst_pitch,
>   		return -EINVAL;
>   
>   	if (!dst_pitch)
> -		dst_pitch = drm_format_info_min_pitch(dst_fi, 0, drm_rect_width(clip));
> +		dst_pitch = drm_format_info_min_pitch(dst_fi, plane, drm_rect_width(clip));
>   
>   	return dst_pitch * drm_rect_height(clip);
>   }
> @@ -554,7 +554,7 @@ static void drm_test_fb_xrgb8888_to_gray8(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_R8, result->dst_pitch,
> -				       &params->clip);
> +				       &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -587,7 +587,7 @@ static void drm_test_fb_xrgb8888_to_rgb332(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_RGB332, result->dst_pitch,
> -				       &params->clip);
> +				       &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -620,7 +620,7 @@ static void drm_test_fb_xrgb8888_to_rgb565(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_RGB565, result->dst_pitch,
> -				       &params->clip);
> +				       &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -663,7 +663,7 @@ static void drm_test_fb_xrgb8888_to_xrgb1555(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_XRGB1555, result->dst_pitch,
> -				       &params->clip);
> +				       &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -697,7 +697,7 @@ static void drm_test_fb_xrgb8888_to_argb1555(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_ARGB1555, result->dst_pitch,
> -				       &params->clip);
> +				       &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -731,7 +731,7 @@ static void drm_test_fb_xrgb8888_to_rgba5551(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_RGBA5551, result->dst_pitch,
> -				       &params->clip);
> +				       &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -765,7 +765,7 @@ static void drm_test_fb_xrgb8888_to_rgb888(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_RGB888, result->dst_pitch,
> -				       &params->clip);
> +				       &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -803,7 +803,7 @@ static void drm_test_fb_xrgb8888_to_argb8888(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_ARGB8888,
> -				       result->dst_pitch, &params->clip);
> +				       result->dst_pitch, &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -838,7 +838,7 @@ static void drm_test_fb_xrgb8888_to_xrgb2101010(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_XRGB2101010,
> -				       result->dst_pitch, &params->clip);
> +				       result->dst_pitch, &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -872,7 +872,7 @@ static void drm_test_fb_xrgb8888_to_argb2101010(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_ARGB2101010,
> -				       result->dst_pitch, &params->clip);
> +				       result->dst_pitch, &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -906,7 +906,7 @@ static void drm_test_fb_xrgb8888_to_mono(struct kunit *test)
>   		.pitches = { params->pitch, 0, 0 },
>   	};
>   
> -	dst_size = conversion_buf_size(DRM_FORMAT_C1, result->dst_pitch, &params->clip);
> +	dst_size = conversion_buf_size(DRM_FORMAT_C1, result->dst_pitch, &params->clip, 0);
>   
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
> @@ -939,7 +939,7 @@ static void drm_test_fb_swab(struct kunit *test)
>   		.pitches = { params->pitch, 0, 0 },
>   	};
>   
> -	dst_size = conversion_buf_size(DRM_FORMAT_XRGB8888, result->dst_pitch, &params->clip);
> +	dst_size = conversion_buf_size(DRM_FORMAT_XRGB8888, result->dst_pitch, &params->clip, 0);
>   
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 6/6] drm/format-helper: Add KUnit tests for drm_fb_memcpy()
  2023-07-21 18:23 ` [PATCH 6/6] drm/format-helper: Add KUnit tests for drm_fb_memcpy() Arthur Grillo
  2023-07-25 14:14   ` kernel test robot
@ 2023-08-05 13:26   ` Maira Canal
  2023-08-09 20:01     ` Arthur Grillo
  1 sibling, 1 reply; 20+ messages in thread
From: Maira Canal @ 2023-08-05 13:26 UTC (permalink / raw)
  To: Arthur Grillo, dri-devel
  Cc: tales.aparecida, javierm, mairacanal, tzimmermann, davidgow,
	jose.exposito89, andrealmeid

On 7/21/23 15:23, Arthur Grillo wrote:
> Insert parameterized test for the drm_fb_memcpy() to ensure correctness
> and prevent future regressions. The test case can accept different
> formats.
> 
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
> ---
>   .../gpu/drm/tests/drm_format_helper_test.c    | 391 ++++++++++++++++++
>   1 file changed, 391 insertions(+)
> 
> diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
> index 6ecd92898e8e..3db4b95f3a98 100644
> --- a/drivers/gpu/drm/tests/drm_format_helper_test.c
> +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
> @@ -1189,6 +1189,396 @@ static void drm_test_fb_build_fourcc_list(struct kunit *test)
>   	KUNIT_EXPECT_MEMEQ(test, fourccs_out, params->expected, TEST_BUF_SIZE);
>   }
>   
> +struct fb_memcpy_result {
> +	unsigned int dst_pitches[DRM_FORMAT_MAX_PLANES];
> +	const u32 expected[DRM_FORMAT_MAX_PLANES][TEST_BUF_SIZE];
> +};
> +
> +struct multi_plane_op_case {
> +	const char *name;
> +	u32 format;
> +	struct drm_rect clip;
> +	unsigned int src_pitches[DRM_FORMAT_MAX_PLANES];
> +	const u32 src[DRM_FORMAT_MAX_PLANES][TEST_BUF_SIZE];
> +	struct fb_memcpy_result memcpy_result;
> +};
> +
> +/* The `src` and `expected` buffers are u32 arrays. To deal with planes that
> + * have a cpp != 4 the values are stored together on the same u32 number in a
> + * way so the order in memory is correct in a little-endian machine.
> + *
> + * Because of that, on some occasions, parts of a u32 will not be part of the
> + * test, to make this explicit the 0xFF byte is used on those parts.
> + */
> +
> +static struct multi_plane_op_case multi_plane_op_cases[] = {
> +	{
> +		.name = "single_pixel_source_buffer",
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(0, 0, 1, 1),
> +		.src_pitches = { 1 * 4 },
> +		.src = {{ 0x01020304 }},
> +		.memcpy_result = {
> +			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
> +			.expected = {{ 0x01020304 }},
> +		}
> +	},
> +	{
> +		.name = "single_pixel_source_buffer",
> +		.format = DRM_FORMAT_XRGB8888_A8,
> +		.clip = DRM_RECT_INIT(0, 0, 1, 1),
> +		.src_pitches = { 1 * 4, 1 },
> +		.src = {
> +			{ 0x01020304 },
> +			{ 0xFFFFFF01 },
> +		},
> +		.memcpy_result = {
> +			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
> +			.expected = {
> +				{ 0x01020304 },
> +				{ 0x00000001 },
> +			},
> +		},
> +	},

Some tests have the same description name. Could you distinct them with
different names?

Best Regards,
- Maíra

> +	{
> +		.name = "single_pixel_source_buffer",
> +		.format = DRM_FORMAT_YUV444,
> +		.clip = DRM_RECT_INIT(0, 0, 1, 1),
> +		.src_pitches = { 1, 1, 1 },
> +		.src = {
> +			{ 0xFFFFFF01 },
> +			{ 0xFFFFFF01 },
> +			{ 0xFFFFFF01 },
> +		},
> +		.memcpy_result = {
> +			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
> +			.expected = {
> +				{ 0x00000001 },
> +				{ 0x00000001 },
> +				{ 0x00000001 },
> +			},
> +		},
> +	},
> +	{
> +		.name = "single_pixel_clip_rectangle",
> +		.format = DRM_FORMAT_XBGR8888,
> +		.clip = DRM_RECT_INIT(1, 1, 1, 1),
> +		.src_pitches = { 2 * 4 },
> +		.src = {
> +			{
> +				0x00000000, 0x00000000,
> +				0x00000000, 0x01020304,
> +			},
> +		},
> +		.memcpy_result = {
> +			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
> +			.expected = {
> +				{ 0x01020304 },
> +			},
> +		},
> +	},
> +	{
> +		.name = "single_pixel_clip_rectangle",
> +		.format = DRM_FORMAT_XRGB8888_A8,
> +		.clip = DRM_RECT_INIT(1, 1, 1, 1),
> +		.src_pitches = { 2 * 4, 2 * 1 },
> +		.src = {
> +			{
> +				0x00000000, 0x00000000,
> +				0x00000000, 0x01020304,
> +			},
> +			{ 0x01000000 },
> +		},
> +		.memcpy_result = {
> +			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
> +			.expected = {
> +				{ 0x01020304 },
> +				{ 0x00000001 },
> +			},
> +		},
> +	},
> +	{
> +		.name = "single_pixel_clip_rectangle",
> +		.format = DRM_FORMAT_YUV444,
> +		.clip = DRM_RECT_INIT(1, 1, 1, 1),
> +		.src_pitches = { 2 * 1, 2 * 1, 2 * 1 },
> +		.src = {
> +			{ 0x01000000 },
> +			{ 0x01000000 },
> +			{ 0x01000000 },
> +		},
> +		.memcpy_result = {
> +			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
> +			.expected = {
> +				{ 0x00000001 },
> +				{ 0x00000001 },
> +				{ 0x00000001 },
> +			},
> +		},
> +	},
> +	{
> +		.name = "well_known_colors",
> +		.format = DRM_FORMAT_XBGR8888,
> +		.clip = DRM_RECT_INIT(1, 1, 2, 4),
> +		.src_pitches = { 4 * 4 },
> +		.src = {
> +			{
> +				0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +				0x00000000, 0x11FFFFFF, 0x22000000, 0x00000000,
> +				0x00000000, 0x33FF0000, 0x4400FF00, 0x00000000,
> +				0x00000000, 0x550000FF, 0x66FF00FF, 0x00000000,
> +				0x00000000, 0x77FFFF00, 0x8800FFFF, 0x00000000,
> +			},
> +		},
> +		.memcpy_result = {
> +			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
> +			.expected = {
> +				{
> +					0x11FFFFFF, 0x22000000,
> +					0x33FF0000, 0x4400FF00,
> +					0x550000FF, 0x66FF00FF,
> +					0x77FFFF00, 0x8800FFFF,
> +				},
> +			},
> +		},
> +	},
> +	{
> +		.name = "well_known_colors",
> +		.format = DRM_FORMAT_XRGB8888_A8,
> +		.clip = DRM_RECT_INIT(1, 1, 2, 4),
> +		.src_pitches = { 4 * 4, 4 * 1 },
> +		.src = {
> +			{
> +				0x00000000, 0x00000000, 0x00000000, 0x00000000,
> +				0x00000000, 0xFFFFFFFF, 0xFF000000, 0x00000000,
> +				0x00000000, 0xFFFF0000, 0xFF00FF00, 0x00000000,
> +				0x00000000, 0xFF0000FF, 0xFFFF00FF, 0x00000000,
> +				0x00000000, 0xFFFFFF00, 0xFF00FFFF, 0x00000000,
> +			},
> +			{
> +				0x00000000,
> +				0x00221100,
> +				0x00443300,
> +				0x00665500,
> +				0x00887700,
> +			},
> +		},
> +		.memcpy_result = {
> +			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
> +			.expected = {
> +				{
> +					0xFFFFFFFF, 0xFF000000,
> +					0xFFFF0000, 0xFF00FF00,
> +					0xFF0000FF, 0xFFFF00FF,
> +					0xFFFFFF00, 0xFF00FFFF,
> +				},
> +				{
> +					0x44332211,
> +					0x88776655,
> +				},
> +			},
> +		},
> +	},
> +	{
> +		.name = "well_known_colors",
> +		.format = DRM_FORMAT_YUV444,
> +		.clip = DRM_RECT_INIT(1, 1, 2, 4),
> +		.src_pitches = { 4 * 1, 4 * 1, 4 * 1 },
> +		.src = {
> +			{
> +				0x00000000,
> +				0x0000FF00,
> +				0x00954C00,
> +				0x00691D00,
> +				0x00B2E100,
> +			},
> +			{
> +				0x00000000,
> +				0x00000000,
> +				0x00BEDE00,
> +				0x00436500,
> +				0x00229B00,
> +			},
> +			{
> +				0x00000000,
> +				0x00000000,
> +				0x007E9C00,
> +				0x0083E700,
> +				0x00641A00,
> +			},
> +		},
> +		.memcpy_result = {
> +			.dst_pitches = { TEST_USE_DEFAULT_PITCH },
> +			.expected = {
> +				{
> +					0x954C00FF,
> +					0xB2E1691D,
> +				},
> +				{
> +					0xBEDE0000,
> +					0x229B4365,
> +				},
> +				{
> +					0x7E9C0000,
> +					0x641A83E7,
> +				},
> +			},
> +		},
> +	},
> +	{
> +		.name = "destination_pitch",
> +		.format = DRM_FORMAT_XBGR8888,
> +		.clip = DRM_RECT_INIT(0, 0, 3, 3),
> +		.src_pitches = { 3 * 4 },
> +		.src = {
> +			{
> +				0xA10E449C, 0xB1114D05, 0xC1A8F303,
> +				0xD16CF073, 0xA20E449C, 0xB2114D05,
> +				0xC2A80303, 0xD26CF073, 0xA30E449C,
> +			},
> +		},
> +		.memcpy_result = {
> +			.dst_pitches = { 5 * 4 },
> +			.expected = {
> +				{
> +					0xA10E449C, 0xB1114D05, 0xC1A8F303, 0x00000000, 0x00000000,
> +					0xD16CF073, 0xA20E449C, 0xB2114D05, 0x00000000, 0x00000000,
> +					0xC2A80303, 0xD26CF073, 0xA30E449C, 0x00000000, 0x00000000,
> +				},
> +			},
> +		},
> +	},
> +	{
> +		.name = "destination_pitch",
> +		.format = DRM_FORMAT_XRGB8888_A8,
> +		.clip = DRM_RECT_INIT(0, 0, 3, 3),
> +		.src_pitches = { 3 * 4, 3 * 1 },
> +		.src = {
> +			{
> +				0xFF0E449C, 0xFF114D05, 0xFFA8F303,
> +				0xFF6CF073, 0xFF0E449C, 0xFF114D05,
> +				0xFFA80303, 0xFF6CF073, 0xFF0E449C,
> +			},
> +			{
> +				0xB2C1B1A1,
> +				0xD2A3D1A2,
> +				0xFFFFFFC2,
> +			},
> +		},
> +		.memcpy_result = {
> +			.dst_pitches = { 5 * 4, 5 * 1 },
> +			.expected = {
> +				{
> +					0xFF0E449C, 0xFF114D05, 0xFFA8F303, 0x00000000, 0x00000000,
> +					0xFF6CF073, 0xFF0E449C, 0xFF114D05, 0x00000000, 0x00000000,
> +					0xFFA80303, 0xFF6CF073, 0xFF0E449C, 0x00000000, 0x00000000,
> +				},
> +				{
> +					0x00C1B1A1,
> +					0xD1A2B200,
> +					0xD2A30000,
> +					0xFF0000C2,
> +				},
> +			},
> +		},
> +	},
> +	{
> +		.name = "destination_pitch",
> +		.format = DRM_FORMAT_YUV444,
> +		.clip = DRM_RECT_INIT(0, 0, 3, 3),
> +		.src_pitches = { 3 * 1, 3 * 1, 3 * 1 },
> +		.src = {
> +			{
> +				0xBAC1323D,
> +				0xBA34323D,
> +				0xFFFFFF3D,
> +			},
> +			{
> +				0xE1ABEC2A,
> +				0xE1EAEC2A,
> +				0xFFFFFF2A,
> +			},
> +			{
> +				0xBCEBE4D7,
> +				0xBC65E4D7,
> +				0xFFFFFFD7,
> +			},
> +		},
> +		.memcpy_result = {
> +			.dst_pitches = { 5 * 1, 5 * 1, 5 * 1 },
> +			.expected = {
> +				{
> +					0x00C1323D,
> +					0x323DBA00,
> +					0xBA340000,
> +					0xFF00003D,
> +				},
> +				{
> +					0x00ABEC2A,
> +					0xEC2AE100,
> +					0xE1EA0000,
> +					0xFF00002A,
> +				},
> +				{
> +					0x00EBE4D7,
> +					0xE4D7BC00,
> +					0xBC650000,
> +					0xFF0000D7,
> +				},
> +			},
> +		},
> +	},
> +};
> +
> +static void multi_plane_op_case_desc(struct multi_plane_op_case *t, char *desc)
> +{
> +	snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s: %p4cc", t->name, &t->format);
> +}
> +
> +KUNIT_ARRAY_PARAM(multi_plane_op, multi_plane_op_cases, multi_plane_op_case_desc);
> +
> +static void drm_test_fb_memcpy(struct kunit *test)
> +{
> +	const struct multi_plane_op_case *params = test->param_value;
> +	const struct fb_memcpy_result *result = &params->memcpy_result;
> +	size_t dst_size[DRM_FORMAT_MAX_PLANES] = { 0 };
> +	u32 *buf[DRM_FORMAT_MAX_PLANES] = { 0 };
> +	u32 *src_cp[DRM_FORMAT_MAX_PLANES] = { 0 };
> +	u32 *expected[DRM_FORMAT_MAX_PLANES] = { 0 };
> +	struct iosys_map dst[DRM_FORMAT_MAX_PLANES];
> +	struct iosys_map src[DRM_FORMAT_MAX_PLANES];
> +
> +	struct drm_framebuffer fb = {
> +		.format = drm_format_info(params->format),
> +	};
> +
> +	memcpy(fb.pitches, params->src_pitches, DRM_FORMAT_MAX_PLANES * sizeof(int));
> +
> +	for (size_t i = 0; i < fb.format->num_planes; i++) {
> +		dst_size[i] = conversion_buf_size(params->format, result->dst_pitches[i],
> +						  &params->clip, i);
> +		KUNIT_ASSERT_GT(test, dst_size[i], 0);
> +
> +		buf[i] = kunit_kzalloc(test, dst_size[i], GFP_KERNEL);
> +		KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf[i]);
> +		iosys_map_set_vaddr(&dst[i], buf[i]);
> +
> +		src_cp[i] = cpubuf_to_le32(test, params->src[i], TEST_BUF_SIZE);
> +		iosys_map_set_vaddr(&src[i], src_cp[i]);
> +	}
> +
> +	if (result->dst_pitches[0] == TEST_USE_DEFAULT_PITCH)
> +		drm_fb_memcpy(dst, NULL, src, &fb, &params->clip);
> +	else
> +		drm_fb_memcpy(dst, result->dst_pitches, src, &fb, &params->clip);
> +
> +	for (size_t i = 0; i < fb.format->num_planes; i++) {
> +		expected[i] = cpubuf_to_le32(test, result->expected[i], TEST_BUF_SIZE);
> +		KUNIT_EXPECT_MEMEQ_MSG(test, buf[i], expected[i], dst_size[i],
> +				       "Failed expectation on plane %zu", i);
> +	}
> +}
> +
>   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),
> @@ -1204,6 +1594,7 @@ static struct kunit_case drm_format_helper_test_cases[] = {
>   	KUNIT_CASE_PARAM(drm_test_fb_swab, convert_xrgb8888_gen_params),
>   	KUNIT_CASE_PARAM(drm_test_fb_clip_offset, clip_offset_gen_params),
>   	KUNIT_CASE_PARAM(drm_test_fb_build_fourcc_list, fb_build_fourcc_list_gen_params),
> +	KUNIT_CASE_PARAM(drm_test_fb_memcpy, multi_plane_op_gen_params),
>   	{}
>   };
>   

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/6] drm/format-helper: Test default pitch fallback
  2023-07-21 18:23 ` [PATCH 1/6] drm/format-helper: Test default pitch fallback Arthur Grillo
  2023-08-05 12:56   ` Maira Canal
@ 2023-08-09 14:54   ` André Almeida
  1 sibling, 0 replies; 20+ messages in thread
From: André Almeida @ 2023-08-09 14:54 UTC (permalink / raw)
  To: Arthur Grillo
  Cc: tzimmermann, tales.aparecida, javierm, dri-devel, mairacanal,
	davidgow, jose.exposito89

Hi,

Em 21/07/2023 15:23, Arthur Grillo escreveu:
> Test the default pitch fallback when NULL is passed as the dst_pitch on
> the conversion procedures.
> 
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
> ---

With Maíra's comment about the duplicated drm_fb_xrgb8888_to_rgb565() 
addressed:

Reviewed-by: André Almeida <andrealmeid@igalia.com>

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/6] drm/format-helper: Add KUnit tests for drm_fb_swab()
  2023-07-21 18:23 ` [PATCH 2/6] drm/format-helper: Add KUnit tests for drm_fb_swab() Arthur Grillo
  2023-08-05 13:02   ` Maira Canal
@ 2023-08-09 14:57   ` André Almeida
  1 sibling, 0 replies; 20+ messages in thread
From: André Almeida @ 2023-08-09 14:57 UTC (permalink / raw)
  To: Arthur Grillo
  Cc: tales.aparecida, javierm, dri-devel, mairacanal, tzimmermann,
	davidgow, jose.exposito89

Em 21/07/2023 15:23, Arthur Grillo escreveu:
> Insert parameterized test for the drm_fb_swab() to ensure correctness
> and prevent future regressions.
> 
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
> ---

[...]

> +			.dst_pitch =  TEST_USE_DEFAULT_PITCH,
> +			.expected = {
> +				0xFFFFFF11, 0x00000022,
> +				0x0000FF33, 0x00FF0044,
> +				0xFF000055, 0xFF00FF66,
> +				0x00FFFF77, 0xFFFF0088,
> +			},
> +		},
>   	},
>   	{
>   		/* Randomly picked colors. Full buffer within the clip area. */
> @@ -425,6 +448,14 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
>   				0b010, 0b000,
>   			},
>   		},
> +		.swab_result = {
> +			.dst_pitch =  20,
> +			.expected = {
> +				0x9C440EA1, 0x054D11B1, 0x03F3A8C1, 0x00000000, 0x00000000,
> +				0x73F06CD1, 0x9C440EA2, 0x054D11B2, 0x00000000, 0x00000000,
> +				0x0303A8C2, 0x73F06CD2, 0x9C440EA3, 0x00000000, 0x00000000,

I would appreciated to have some information about those numbers in the 
commit message.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 3/6] drm/format-helper: Add KUnit tests for drm_fb_clip_offset()
  2023-07-21 18:23 ` [PATCH 3/6] drm/format-helper: Add KUnit tests for drm_fb_clip_offset() Arthur Grillo
  2023-08-05 13:16   ` Maira Canal
@ 2023-08-09 15:28   ` André Almeida
  1 sibling, 0 replies; 20+ messages in thread
From: André Almeida @ 2023-08-09 15:28 UTC (permalink / raw)
  To: Arthur Grillo
  Cc: tzimmermann, tales.aparecida, javierm, dri-devel, mairacanal,
	davidgow, jose.exposito89

Em 21/07/2023 15:23, Arthur Grillo escreveu:
> Insert parameterized test for the drm_fb_clip_offset() to ensure
> correctness and prevent future regressions.
> 
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
> ---
>   .../gpu/drm/tests/drm_format_helper_test.c    | 91 +++++++++++++++++++
>   1 file changed, 91 insertions(+)
> 
> diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
> index abeda642d84a..2e1c5463f063 100644
> --- a/drivers/gpu/drm/tests/drm_format_helper_test.c
> +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
> @@ -957,6 +957,96 @@ static void drm_test_fb_swab(struct kunit *test)
>   	KUNIT_EXPECT_MEMEQ(test, buf, result->expected, dst_size);
>   }
>   
> +struct clip_offset_case {
> +	const char *name;
> +	unsigned int pitch;
> +	u32 format;
> +	struct drm_rect clip;
> +	unsigned int expected_offset;
> +};
> +
> +static struct clip_offset_case clip_offset_cases[] = {
> +	{
> +		.name = "pass through",
> +		.pitch = TEST_USE_DEFAULT_PITCH,
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(0, 0, 3, 3),
> +		.expected_offset = 0
> +	},
> +	{
> +		.name = "horizontal offset",
> +		.pitch = TEST_USE_DEFAULT_PITCH,
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(1, 0, 3, 3),
> +		.expected_offset = 4,
> +	},
> +	{
> +		.name = "vertical offset",
> +		.pitch = TEST_USE_DEFAULT_PITCH,
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(0, 1, 3, 3),
> +		.expected_offset = 12,
> +	},
> +	{
> +		.name = "horizontal and vertical offset",
> +		.pitch = TEST_USE_DEFAULT_PITCH,
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(1, 1, 3, 3),
> +		.expected_offset = 16,
> +	},
> +	{
> +		.name = "horizontal offset (custom pitch)",
> +		.pitch = 20,
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(1, 0, 3, 3),
> +		.expected_offset = 4,
> +	},
> +	{
> +		.name = "vertical offset (custom pitch)",
> +		.pitch = 20,
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(0, 1, 3, 3),
> +		.expected_offset = 20,
> +	},
> +	{
> +		.name = "horizontal and vertical offset (custom pitch)",
> +		.pitch = 20,
> +		.format = DRM_FORMAT_XRGB8888,
> +		.clip = DRM_RECT_INIT(1, 1, 3, 3),
> +		.expected_offset = 24,
> +	},
> +};
> +
> +static void clip_offset_case_desc(struct clip_offset_case *t, char *desc)
> +{
> +	strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);
> +}
> +
> +KUNIT_ARRAY_PARAM(clip_offset, clip_offset_cases, clip_offset_case_desc);
> +
> +static void drm_test_fb_clip_offset(struct kunit *test)
> +{
> +	const struct clip_offset_case *params = test->param_value;
> +	const struct drm_format_info *format_info = drm_format_info(params->format);
> +
> +	unsigned int offset = -1;

why?

> +
> +	unsigned int pitch = params->pitch;
> +
> +	if (pitch == TEST_USE_DEFAULT_PITCH)
> +		pitch = drm_format_info_min_pitch(format_info, 0,
> +						  drm_rect_width(&params->clip));
> +
> +	/* Assure that the pitch is not zero, because this will inevitable cause the
> +	 * wrong expected result
> +	 */

Multiline comments should be like this:

/*
  * Assure that...
  */

> +	KUNIT_ASSERT_NE(test, pitch, 0);
> +
> +	offset = drm_fb_clip_offset(pitch, format_info, &params->clip);
> +
> +	KUNIT_EXPECT_EQ(test, offset, params->expected_offset);
> +}
> +
>   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),
> @@ -970,6 +1060,7 @@ static struct kunit_case drm_format_helper_test_cases[] = {
>   	KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_argb2101010, convert_xrgb8888_gen_params),
>   	KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_mono, convert_xrgb8888_gen_params),
>   	KUNIT_CASE_PARAM(drm_test_fb_swab, convert_xrgb8888_gen_params),
> +	KUNIT_CASE_PARAM(drm_test_fb_clip_offset, clip_offset_gen_params),
>   	{}
>   };
>   

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 4/6] drm/format-helper: Add KUnit tests for drm_fb_build_fourcc_list()
  2023-07-21 18:23 ` [PATCH 4/6] drm/format-helper: Add KUnit tests for drm_fb_build_fourcc_list() Arthur Grillo
  2023-08-05 13:21   ` Maira Canal
@ 2023-08-09 15:54   ` André Almeida
  1 sibling, 0 replies; 20+ messages in thread
From: André Almeida @ 2023-08-09 15:54 UTC (permalink / raw)
  To: Arthur Grillo
  Cc: tales.aparecida, javierm, dri-devel, mairacanal, tzimmermann,
	davidgow, jose.exposito89

Em 21/07/2023 15:23, Arthur Grillo escreveu:
> Insert parameterized test for the drm_fb_build_fourcc_list() to ensure
> correctness and prevent future regressions.
> 
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
> ---
>   .../gpu/drm/tests/drm_format_helper_test.c    | 143 ++++++++++++++++++
>   1 file changed, 143 insertions(+)
> 
> diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
> index 2e1c5463f063..de4677868647 100644
> --- a/drivers/gpu/drm/tests/drm_format_helper_test.c
> +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
> @@ -3,6 +3,7 @@
>   #include <kunit/test.h>
>   
>   #include <drm/drm_device.h>
> +#include <drm/drm_drv.h>
>   #include <drm/drm_file.h>
>   #include <drm/drm_format_helper.h>
>   #include <drm/drm_fourcc.h>
> @@ -11,6 +12,7 @@
>   #include <drm/drm_mode.h>
>   #include <drm/drm_print.h>
>   #include <drm/drm_rect.h>
> +#include <drm/drm_kunit_helpers.h>

Keep the includes sorted please

>   
>   #include "../drm_crtc_internal.h"
>   
> @@ -1047,6 +1049,146 @@ static void drm_test_fb_clip_offset(struct kunit *test)
>   	KUNIT_EXPECT_EQ(test, offset, params->expected_offset);
>   }
>   
> +struct fb_build_fourcc_list_case {
> +	const char *name;
> +	u32 native_fourccs[TEST_BUF_SIZE];
> +	u32 expected[TEST_BUF_SIZE];
> +};
> +
> +struct fb_build_fourcc_list_case fb_build_fourcc_list_cases[] = {
> +	{
> +		.name = "no native formats",
> +		.native_fourccs = { },
> +		.expected = { DRM_FORMAT_XRGB8888 },
> +	},
> +	{
> +		.name = "XRGB8888 as native format",
> +		.native_fourccs = { DRM_FORMAT_XRGB8888 },
> +		.expected = { DRM_FORMAT_XRGB8888 },
> +	},
> +	{
> +		.name = "remove duplicates",
> +		.native_fourccs = {
> +			DRM_FORMAT_XRGB8888,
> +			DRM_FORMAT_XRGB8888,
> +			DRM_FORMAT_RGB888,
> +			DRM_FORMAT_RGB888,
> +			DRM_FORMAT_RGB888,
> +			DRM_FORMAT_XRGB8888,
> +			DRM_FORMAT_RGB888,
> +			DRM_FORMAT_RGB565,
> +			DRM_FORMAT_RGB888,
> +			DRM_FORMAT_XRGB8888,
> +			DRM_FORMAT_RGB565,
> +			DRM_FORMAT_RGB565,
> +			DRM_FORMAT_XRGB8888,
> +		},
> +		.expected = {
> +			DRM_FORMAT_XRGB8888,
> +			DRM_FORMAT_RGB888,
> +			DRM_FORMAT_RGB565,
> +		},
> +	},
> +	{
> +		.name = "convert alpha formats",
> +		.native_fourccs = {
> +			DRM_FORMAT_ARGB1555,
> +			DRM_FORMAT_ABGR1555,
> +			DRM_FORMAT_RGBA5551,
> +			DRM_FORMAT_BGRA5551,
> +			DRM_FORMAT_ARGB8888,
> +			DRM_FORMAT_ABGR8888,
> +			DRM_FORMAT_RGBA8888,
> +			DRM_FORMAT_BGRA8888,
> +			DRM_FORMAT_ARGB2101010,
> +			DRM_FORMAT_ABGR2101010,
> +			DRM_FORMAT_RGBA1010102,
> +			DRM_FORMAT_BGRA1010102,
> +		},
> +		.expected = {
> +			DRM_FORMAT_XRGB1555,
> +			DRM_FORMAT_XBGR1555,
> +			DRM_FORMAT_RGBX5551,
> +			DRM_FORMAT_BGRX5551,
> +			DRM_FORMAT_XRGB8888,
> +			DRM_FORMAT_XBGR8888,
> +			DRM_FORMAT_RGBX8888,
> +			DRM_FORMAT_BGRX8888,
> +			DRM_FORMAT_XRGB2101010,
> +			DRM_FORMAT_XBGR2101010,
> +			DRM_FORMAT_RGBX1010102,
> +			DRM_FORMAT_BGRX1010102,
> +		},
> +	},
> +	{
> +		.name = "random formats",
> +		.native_fourccs = {
> +			DRM_FORMAT_Y212,
> +			DRM_FORMAT_ARGB1555,
> +			DRM_FORMAT_ABGR16161616F,
> +			DRM_FORMAT_C8,
> +			DRM_FORMAT_BGR888,
> +			DRM_FORMAT_XRGB1555,
> +			DRM_FORMAT_RGBA5551,
> +			DRM_FORMAT_BGR565_A8,
> +			DRM_FORMAT_R10,
> +			DRM_FORMAT_XYUV8888,
> +		},
> +		.expected = {
> +			DRM_FORMAT_Y212,
> +			DRM_FORMAT_XRGB1555,
> +			DRM_FORMAT_ABGR16161616F,
> +			DRM_FORMAT_C8,
> +			DRM_FORMAT_BGR888,
> +			DRM_FORMAT_RGBX5551,
> +			DRM_FORMAT_BGR565_A8,
> +			DRM_FORMAT_R10,
> +			DRM_FORMAT_XYUV8888,
> +			DRM_FORMAT_XRGB8888,
> +		},
> +	},
> +};
> +
> +static void fb_build_fourcc_list_case_desc(struct fb_build_fourcc_list_case *t, char *desc)
> +{
> +	strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);
> +}
> +
> +KUNIT_ARRAY_PARAM(fb_build_fourcc_list, fb_build_fourcc_list_cases, fb_build_fourcc_list_case_desc);
> +
> +static size_t get_nfourccs(const u32 *fourccs)
> +{
> +	size_t i;
> +
> +	for (i = 0; i < TEST_BUF_SIZE && fourccs[i]; ++i)
> +		;
> +
> +	return i;
> +}

I agree with Maira here, maybe a .fourccs_size struct member would be 
better

> +
> +static void drm_test_fb_build_fourcc_list(struct kunit *test)
> +{
> +	const struct fb_build_fourcc_list_case *params = test->param_value;
> +	u32 fourccs_out[TEST_BUF_SIZE];
> +	size_t nfourccs_out;
> +	struct drm_device *drm;
> +	struct device *dev;
> +
> +	dev = drm_kunit_helper_alloc_device(test);
> +	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
> +
> +	drm = __drm_kunit_helper_alloc_drm_device(test, dev, sizeof(*drm), 0, DRIVER_MODESET);
> +	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, drm);
> +
> +	nfourccs_out = drm_fb_build_fourcc_list(drm, params->native_fourccs,
> +						get_nfourccs(params->native_fourccs),
> +						fourccs_out, TEST_BUF_SIZE);
> +
> +	drm_kunit_helper_free_device(test, dev);
> +	KUNIT_EXPECT_EQ(test, nfourccs_out, get_nfourccs(params->expected));
> +	KUNIT_EXPECT_MEMEQ(test, fourccs_out, params->expected, TEST_BUF_SIZE);
> +}
> +
>   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),
> @@ -1061,6 +1203,7 @@ static struct kunit_case drm_format_helper_test_cases[] = {
>   	KUNIT_CASE_PARAM(drm_test_fb_xrgb8888_to_mono, convert_xrgb8888_gen_params),
>   	KUNIT_CASE_PARAM(drm_test_fb_swab, convert_xrgb8888_gen_params),
>   	KUNIT_CASE_PARAM(drm_test_fb_clip_offset, clip_offset_gen_params),
> +	KUNIT_CASE_PARAM(drm_test_fb_build_fourcc_list, fb_build_fourcc_list_gen_params),
>   	{}
>   };
>   

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/6] drm/format-helper-test: Add multi-plane support to conversion_buf_size()
  2023-07-21 18:23 ` [PATCH 5/6] drm/format-helper-test: Add multi-plane support to conversion_buf_size() Arthur Grillo
  2023-08-05 13:22   ` Maira Canal
@ 2023-08-09 16:16   ` André Almeida
  1 sibling, 0 replies; 20+ messages in thread
From: André Almeida @ 2023-08-09 16:16 UTC (permalink / raw)
  To: Arthur Grillo
  Cc: tzimmermann, tales.aparecida, javierm, dri-devel, mairacanal,
	davidgow, jose.exposito89



Em 21/07/2023 15:23, Arthur Grillo escreveu:
> The drm_fb_memcpy() supports multi-plane formats. To fully test it in
> the future, add multi-plane support to the conversion_buf_size() helper.
> 
> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
> ---

I think this would be a more concrect improvement if the plane parameter 
was really used. Anyway,

Reviewed-by: André Almeida <andrealmeid@igalia.com>

>   .../gpu/drm/tests/drm_format_helper_test.c    | 28 +++++++++----------
>   1 file changed, 14 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
> index de4677868647..6ecd92898e8e 100644
> --- a/drivers/gpu/drm/tests/drm_format_helper_test.c
> +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
> @@ -472,7 +472,7 @@ static struct convert_xrgb8888_case convert_xrgb8888_cases[] = {
>    * The size of the destination buffer or negative value on error.
>    */
>   static size_t conversion_buf_size(u32 dst_format, unsigned int dst_pitch,
> -				  const struct drm_rect *clip)
> +				  const struct drm_rect *clip, int plane)
>   {
>   	const struct drm_format_info *dst_fi = drm_format_info(dst_format);
>   
> @@ -480,7 +480,7 @@ static size_t conversion_buf_size(u32 dst_format, unsigned int dst_pitch,
>   		return -EINVAL;
>   
>   	if (!dst_pitch)
> -		dst_pitch = drm_format_info_min_pitch(dst_fi, 0, drm_rect_width(clip));
> +		dst_pitch = drm_format_info_min_pitch(dst_fi, plane, drm_rect_width(clip));
>   
>   	return dst_pitch * drm_rect_height(clip);
>   }
> @@ -554,7 +554,7 @@ static void drm_test_fb_xrgb8888_to_gray8(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_R8, result->dst_pitch,
> -				       &params->clip);
> +				       &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -587,7 +587,7 @@ static void drm_test_fb_xrgb8888_to_rgb332(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_RGB332, result->dst_pitch,
> -				       &params->clip);
> +				       &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -620,7 +620,7 @@ static void drm_test_fb_xrgb8888_to_rgb565(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_RGB565, result->dst_pitch,
> -				       &params->clip);
> +				       &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -663,7 +663,7 @@ static void drm_test_fb_xrgb8888_to_xrgb1555(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_XRGB1555, result->dst_pitch,
> -				       &params->clip);
> +				       &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -697,7 +697,7 @@ static void drm_test_fb_xrgb8888_to_argb1555(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_ARGB1555, result->dst_pitch,
> -				       &params->clip);
> +				       &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -731,7 +731,7 @@ static void drm_test_fb_xrgb8888_to_rgba5551(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_RGBA5551, result->dst_pitch,
> -				       &params->clip);
> +				       &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -765,7 +765,7 @@ static void drm_test_fb_xrgb8888_to_rgb888(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_RGB888, result->dst_pitch,
> -				       &params->clip);
> +				       &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -803,7 +803,7 @@ static void drm_test_fb_xrgb8888_to_argb8888(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_ARGB8888,
> -				       result->dst_pitch, &params->clip);
> +				       result->dst_pitch, &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -838,7 +838,7 @@ static void drm_test_fb_xrgb8888_to_xrgb2101010(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_XRGB2101010,
> -				       result->dst_pitch, &params->clip);
> +				       result->dst_pitch, &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -872,7 +872,7 @@ static void drm_test_fb_xrgb8888_to_argb2101010(struct kunit *test)
>   	};
>   
>   	dst_size = conversion_buf_size(DRM_FORMAT_ARGB2101010,
> -				       result->dst_pitch, &params->clip);
> +				       result->dst_pitch, &params->clip, 0);
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
>   	buf = kunit_kzalloc(test, dst_size, GFP_KERNEL);
> @@ -906,7 +906,7 @@ static void drm_test_fb_xrgb8888_to_mono(struct kunit *test)
>   		.pitches = { params->pitch, 0, 0 },
>   	};
>   
> -	dst_size = conversion_buf_size(DRM_FORMAT_C1, result->dst_pitch, &params->clip);
> +	dst_size = conversion_buf_size(DRM_FORMAT_C1, result->dst_pitch, &params->clip, 0);
>   
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   
> @@ -939,7 +939,7 @@ static void drm_test_fb_swab(struct kunit *test)
>   		.pitches = { params->pitch, 0, 0 },
>   	};
>   
> -	dst_size = conversion_buf_size(DRM_FORMAT_XRGB8888, result->dst_pitch, &params->clip);
> +	dst_size = conversion_buf_size(DRM_FORMAT_XRGB8888, result->dst_pitch, &params->clip, 0);
>   
>   	KUNIT_ASSERT_GT(test, dst_size, 0);
>   

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 6/6] drm/format-helper: Add KUnit tests for drm_fb_memcpy()
  2023-08-05 13:26   ` Maira Canal
@ 2023-08-09 20:01     ` Arthur Grillo
  0 siblings, 0 replies; 20+ messages in thread
From: Arthur Grillo @ 2023-08-09 20:01 UTC (permalink / raw)
  To: Maira Canal, dri-devel
  Cc: tales.aparecida, javierm, tzimmermann, davidgow, jose.exposito89,
	andrealmeid



On 05/08/23 10:26, Maira Canal wrote:
> On 7/21/23 15:23, Arthur Grillo wrote:
>> Insert parameterized test for the drm_fb_memcpy() to ensure correctness
>> and prevent future regressions. The test case can accept different
>> formats.
>>
>> Signed-off-by: Arthur Grillo <arthurgrillo@riseup.net>
>> ---
>>   .../gpu/drm/tests/drm_format_helper_test.c    | 391 ++++++++++++++++++
>>   1 file changed, 391 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/tests/drm_format_helper_test.c b/drivers/gpu/drm/tests/drm_format_helper_test.c
>> index 6ecd92898e8e..3db4b95f3a98 100644
>> --- a/drivers/gpu/drm/tests/drm_format_helper_test.c
>> +++ b/drivers/gpu/drm/tests/drm_format_helper_test.c
>> @@ -1189,6 +1189,396 @@ static void drm_test_fb_build_fourcc_list(struct kunit *test)
>>       KUNIT_EXPECT_MEMEQ(test, fourccs_out, params->expected, TEST_BUF_SIZE);
>>   }
>>   +struct fb_memcpy_result {
>> +    unsigned int dst_pitches[DRM_FORMAT_MAX_PLANES];
>> +    const u32 expected[DRM_FORMAT_MAX_PLANES][TEST_BUF_SIZE];
>> +};
>> +
>> +struct multi_plane_op_case {
>> +    const char *name;
>> +    u32 format;
>> +    struct drm_rect clip;
>> +    unsigned int src_pitches[DRM_FORMAT_MAX_PLANES];
>> +    const u32 src[DRM_FORMAT_MAX_PLANES][TEST_BUF_SIZE];
>> +    struct fb_memcpy_result memcpy_result;
>> +};
>> +
>> +/* The `src` and `expected` buffers are u32 arrays. To deal with planes that
>> + * have a cpp != 4 the values are stored together on the same u32 number in a
>> + * way so the order in memory is correct in a little-endian machine.
>> + *
>> + * Because of that, on some occasions, parts of a u32 will not be part of the
>> + * test, to make this explicit the 0xFF byte is used on those parts.
>> + */
>> +
>> +static struct multi_plane_op_case multi_plane_op_cases[] = {
>> +    {
>> +        .name = "single_pixel_source_buffer",
>> +        .format = DRM_FORMAT_XRGB8888,
>> +        .clip = DRM_RECT_INIT(0, 0, 1, 1),
>> +        .src_pitches = { 1 * 4 },
>> +        .src = {{ 0x01020304 }},
>> +        .memcpy_result = {
>> +            .dst_pitches = { TEST_USE_DEFAULT_PITCH },
>> +            .expected = {{ 0x01020304 }},
>> +        }
>> +    },
>> +    {
>> +        .name = "single_pixel_source_buffer",
>> +        .format = DRM_FORMAT_XRGB8888_A8,
>> +        .clip = DRM_RECT_INIT(0, 0, 1, 1),
>> +        .src_pitches = { 1 * 4, 1 },
>> +        .src = {
>> +            { 0x01020304 },
>> +            { 0xFFFFFF01 },
>> +        },
>> +        .memcpy_result = {
>> +            .dst_pitches = { TEST_USE_DEFAULT_PITCH },
>> +            .expected = {
>> +                { 0x01020304 },
>> +                { 0x00000001 },
>> +            },
>> +        },
>> +    },
> 
> Some tests have the same description name. Could you distinct them with
> different names?

The test description is formed not only by the `.name` attribute but also by the
string representation of the `.format` attribute, so two test descriptions are
distinct if they have the same `.name` but different `.format`.

Best Regards,
~Arthur Grillo

> 
> Best Regards,
> - Maíra
> 
>> +    {
>> +        .name = "single_pixel_source_buffer",
>> +        .format = DRM_FORMAT_YUV444,
>> +        .clip = DRM_RECT_INIT(0, 0, 1, 1),
>> +        .src_pitches = { 1, 1, 1 },
>> +        .src = {
>> +            { 0xFFFFFF01 },
>> +            { 0xFFFFFF01 },
>> +            { 0xFFFFFF01 },
>> +        },
>> +        .memcpy_result = {
>> +            .dst_pitches = { TEST_USE_DEFAULT_PITCH },
>> +            .expected = {
>> +                { 0x00000001 },
>> +                { 0x00000001 },
>> +                { 0x00000001 },
>> +            },
>> +        },
>> +    },
>> +    {
>> +        .name = "single_pixel_clip_rectangle",
>> +        .format = DRM_FORMAT_XBGR8888,
>> +        .clip = DRM_RECT_INIT(1, 1, 1, 1),
>> +        .src_pitches = { 2 * 4 },
>> +        .src = {
>> +            {
>> +                0x00000000, 0x00000000,
>> +                0x00000000, 0x01020304,
>> +            },
>> +        },
>> +        .memcpy_result = {
>> +            .dst_pitches = { TEST_USE_DEFAULT_PITCH },
>> +            .expected = {
>> +                { 0x01020304 },
>> +            },
>> +        },
>> +    },
>> +    {
>> +        .name = "single_pixel_clip_rectangle",
>> +        .format = DRM_FORMAT_XRGB8888_A8,
>> +        .clip = DRM_RECT_INIT(1, 1, 1, 1),
>> +        .src_pitches = { 2 * 4, 2 * 1 },
>> +        .src = {
>> +            {
>> +                0x00000000, 0x00000000,
>> +                0x00000000, 0x01020304,
>> +            },
>> +            { 0x01000000 },
>> +        },
>> +        .memcpy_result = {
>> +            .dst_pitches = { TEST_USE_DEFAULT_PITCH },
>> +            .expected = {
>> +                { 0x01020304 },
>> +                { 0x00000001 },
>> +            },
>> +        },
>> +    },
>> +    {
>> +        .name = "single_pixel_clip_rectangle",
>> +        .format = DRM_FORMAT_YUV444,
>> +        .clip = DRM_RECT_INIT(1, 1, 1, 1),
>> +        .src_pitches = { 2 * 1, 2 * 1, 2 * 1 },
>> +        .src = {
>> +            { 0x01000000 },
>> +            { 0x01000000 },
>> +            { 0x01000000 },
>> +        },
>> +        .memcpy_result = {
>> +            .dst_pitches = { TEST_USE_DEFAULT_PITCH },
>> +            .expected = {
>> +                { 0x00000001 },
>> +                { 0x00000001 },
>> +                { 0x00000001 },
>> +            },
>> +        },
>> +    },
>> +    {
>> +        .name = "well_known_colors",
>> +        .format = DRM_FORMAT_XBGR8888,
>> +        .clip = DRM_RECT_INIT(1, 1, 2, 4),
>> +        .src_pitches = { 4 * 4 },
>> +        .src = {
>> +            {
>> +                0x00000000, 0x00000000, 0x00000000, 0x00000000,
>> +                0x00000000, 0x11FFFFFF, 0x22000000, 0x00000000,
>> +                0x00000000, 0x33FF0000, 0x4400FF00, 0x00000000,
>> +                0x00000000, 0x550000FF, 0x66FF00FF, 0x00000000,
>> +                0x00000000, 0x77FFFF00, 0x8800FFFF, 0x00000000,
>> +            },
>> +        },
>> +        .memcpy_result = {
>> +            .dst_pitches = { TEST_USE_DEFAULT_PITCH },
>> +            .expected = {
>> +                {
>> +                    0x11FFFFFF, 0x22000000,
>> +                    0x33FF0000, 0x4400FF00,
>> +                    0x550000FF, 0x66FF00FF,
>> +                    0x77FFFF00, 0x8800FFFF,
>> +                },
>> +            },
>> +        },
>> +    },
>> +    {
>> +        .name = "well_known_colors",
>> +        .format = DRM_FORMAT_XRGB8888_A8,
>> +        .clip = DRM_RECT_INIT(1, 1, 2, 4),
>> +        .src_pitches = { 4 * 4, 4 * 1 },
>> +        .src = {
>> +            {
>> +                0x00000000, 0x00000000, 0x00000000, 0x00000000,
>> +                0x00000000, 0xFFFFFFFF, 0xFF000000, 0x00000000,
>> +                0x00000000, 0xFFFF0000, 0xFF00FF00, 0x00000000,
>> +                0x00000000, 0xFF0000FF, 0xFFFF00FF, 0x00000000,
>> +                0x00000000, 0xFFFFFF00, 0xFF00FFFF, 0x00000000,
>> +            },
>> +            {
>> +                0x00000000,
>> +                0x00221100,
>> +                0x00443300,
>> +                0x00665500,
>> +                0x00887700,
>> +            },
>> +        },
>> +        .memcpy_result = {
>> +            .dst_pitches = { TEST_USE_DEFAULT_PITCH },
>> +            .expected = {
>> +                {
>> +                    0xFFFFFFFF, 0xFF000000,
>> +                    0xFFFF0000, 0xFF00FF00,
>> +                    0xFF0000FF, 0xFFFF00FF,
>> +                    0xFFFFFF00, 0xFF00FFFF,
>> +                },
>> +                {
>> +                    0x44332211,
>> +                    0x88776655,
>> +                },
>> +            },
>> +        },
>> +    },
>> +    {
>> +        .name = "well_known_colors",
>> +        .format = DRM_FORMAT_YUV444,
>> +        .clip = DRM_RECT_INIT(1, 1, 2, 4),
>> +        .src_pitches = { 4 * 1, 4 * 1, 4 * 1 },
>> +        .src = {
>> +            {
>> +                0x00000000,
>> +                0x0000FF00,
>> +                0x00954C00,
>> +                0x00691D00,
>> +                0x00B2E100,
>> +            },
>> +            {
>> +                0x00000000,
>> +                0x00000000,
>> +                0x00BEDE00,
>> +                0x00436500,
>> +                0x00229B00,
>> +            },
>> +            {
>> +                0x00000000,
>> +                0x00000000,
>> +                0x007E9C00,
>> +                0x0083E700,
>> +                0x00641A00,
>> +            },
>> +        },
>> +        .memcpy_result = {
>> +            .dst_pitches = { TEST_USE_DEFAULT_PITCH },
>> +            .expected = {
>> +                {
>> +                    0x954C00FF,
>> +                    0xB2E1691D,
>> +                },
>> +                {
>> +                    0xBEDE0000,
>> +                    0x229B4365,
>> +                },
>> +                {
>> +                    0x7E9C0000,
>> +                    0x641A83E7,
>> +                },
>> +            },
>> +        },
>> +    },
>> +    {
>> +        .name = "destination_pitch",
>> +        .format = DRM_FORMAT_XBGR8888,
>> +        .clip = DRM_RECT_INIT(0, 0, 3, 3),
>> +        .src_pitches = { 3 * 4 },
>> +        .src = {
>> +            {
>> +                0xA10E449C, 0xB1114D05, 0xC1A8F303,
>> +                0xD16CF073, 0xA20E449C, 0xB2114D05,
>> +                0xC2A80303, 0xD26CF073, 0xA30E449C,
>> +            },
>> +        },
>> +        .memcpy_result = {
>> +            .dst_pitches = { 5 * 4 },
>> +            .expected = {
>> +                {
>> +                    0xA10E449C, 0xB1114D05, 0xC1A8F303, 0x00000000, 0x00000000,
>> +                    0xD16CF073, 0xA20E449C, 0xB2114D05, 0x00000000, 0x00000000,
>> +                    0xC2A80303, 0xD26CF073, 0xA30E449C, 0x00000000, 0x00000000,
>> +                },
>> +            },
>> +        },
>> +    },
>> +    {
>> +        .name = "destination_pitch",
>> +        .format = DRM_FORMAT_XRGB8888_A8,
>> +        .clip = DRM_RECT_INIT(0, 0, 3, 3),
>> +        .src_pitches = { 3 * 4, 3 * 1 },
>> +        .src = {
>> +            {
>> +                0xFF0E449C, 0xFF114D05, 0xFFA8F303,
>> +                0xFF6CF073, 0xFF0E449C, 0xFF114D05,
>> +                0xFFA80303, 0xFF6CF073, 0xFF0E449C,
>> +            },
>> +            {
>> +                0xB2C1B1A1,
>> +                0xD2A3D1A2,
>> +                0xFFFFFFC2,
>> +            },
>> +        },
>> +        .memcpy_result = {
>> +            .dst_pitches = { 5 * 4, 5 * 1 },
>> +            .expected = {
>> +                {
>> +                    0xFF0E449C, 0xFF114D05, 0xFFA8F303, 0x00000000, 0x00000000,
>> +                    0xFF6CF073, 0xFF0E449C, 0xFF114D05, 0x00000000, 0x00000000,
>> +                    0xFFA80303, 0xFF6CF073, 0xFF0E449C, 0x00000000, 0x00000000,
>> +                },
>> +                {
>> +                    0x00C1B1A1,
>> +                    0xD1A2B200,
>> +                    0xD2A30000,
>> +                    0xFF0000C2,
>> +                },
>> +            },
>> +        },
>> +    },
>> +    {
>> +        .name = "destination_pitch",
>> +        .format = DRM_FORMAT_YUV444,
>> +        .clip = DRM_RECT_INIT(0, 0, 3, 3),
>> +        .src_pitches = { 3 * 1, 3 * 1, 3 * 1 },
>> +        .src = {
>> +            {
>> +                0xBAC1323D,
>> +                0xBA34323D,
>> +                0xFFFFFF3D,
>> +            },
>> +            {
>> +                0xE1ABEC2A,
>> +                0xE1EAEC2A,
>> +                0xFFFFFF2A,
>> +            },
>> +            {
>> +                0xBCEBE4D7,
>> +                0xBC65E4D7,
>> +                0xFFFFFFD7,
>> +            },
>> +        },
>> +        .memcpy_result = {
>> +            .dst_pitches = { 5 * 1, 5 * 1, 5 * 1 },
>> +            .expected = {
>> +                {
>> +                    0x00C1323D,
>> +                    0x323DBA00,
>> +                    0xBA340000,
>> +                    0xFF00003D,
>> +                },
>> +                {
>> +                    0x00ABEC2A,
>> +                    0xEC2AE100,
>> +                    0xE1EA0000,
>> +                    0xFF00002A,
>> +                },
>> +                {
>> +                    0x00EBE4D7,
>> +                    0xE4D7BC00,
>> +                    0xBC650000,
>> +                    0xFF0000D7,
>> +                },
>> +            },
>> +        },
>> +    },
>> +};
>> +
>> +static void multi_plane_op_case_desc(struct multi_plane_op_case *t, char *desc)
>> +{
>> +    snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s: %p4cc", t->name, &t->format);
>> +}
>> +
>> +KUNIT_ARRAY_PARAM(multi_plane_op, multi_plane_op_cases, multi_plane_op_case_desc);
>> +
>> +static void drm_test_fb_memcpy(struct kunit *test)
>> +{
>> +    const struct multi_plane_op_case *params = test->param_value;
>> +    const struct fb_memcpy_result *result = &params->memcpy_result;
>> +    size_t dst_size[DRM_FORMAT_MAX_PLANES] = { 0 };
>> +    u32 *buf[DRM_FORMAT_MAX_PLANES] = { 0 };
>> +    u32 *src_cp[DRM_FORMAT_MAX_PLANES] = { 0 };
>> +    u32 *expected[DRM_FORMAT_MAX_PLANES] = { 0 };
>> +    struct iosys_map dst[DRM_FORMAT_MAX_PLANES];
>> +    struct iosys_map src[DRM_FORMAT_MAX_PLANES];
>> +
>> +    struct drm_framebuffer fb = {
>> +        .format = drm_format_info(params->format),
>> +    };
>> +
>> +    memcpy(fb.pitches, params->src_pitches, DRM_FORMAT_MAX_PLANES * sizeof(int));
>> +
>> +    for (size_t i = 0; i < fb.format->num_planes; i++) {
>> +        dst_size[i] = conversion_buf_size(params->format, result->dst_pitches[i],
>> +                          &params->clip, i);
>> +        KUNIT_ASSERT_GT(test, dst_size[i], 0);
>> +
>> +        buf[i] = kunit_kzalloc(test, dst_size[i], GFP_KERNEL);
>> +        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf[i]);
>> +        iosys_map_set_vaddr(&dst[i], buf[i]);
>> +
>> +        src_cp[i] = cpubuf_to_le32(test, params->src[i], TEST_BUF_SIZE);
>> +        iosys_map_set_vaddr(&src[i], src_cp[i]);
>> +    }
>> +
>> +    if (result->dst_pitches[0] == TEST_USE_DEFAULT_PITCH)
>> +        drm_fb_memcpy(dst, NULL, src, &fb, &params->clip);
>> +    else
>> +        drm_fb_memcpy(dst, result->dst_pitches, src, &fb, &params->clip);
>> +
>> +    for (size_t i = 0; i < fb.format->num_planes; i++) {
>> +        expected[i] = cpubuf_to_le32(test, result->expected[i], TEST_BUF_SIZE);
>> +        KUNIT_EXPECT_MEMEQ_MSG(test, buf[i], expected[i], dst_size[i],
>> +                       "Failed expectation on plane %zu", i);
>> +    }
>> +}
>> +
>>   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),
>> @@ -1204,6 +1594,7 @@ static struct kunit_case drm_format_helper_test_cases[] = {
>>       KUNIT_CASE_PARAM(drm_test_fb_swab, convert_xrgb8888_gen_params),
>>       KUNIT_CASE_PARAM(drm_test_fb_clip_offset, clip_offset_gen_params),
>>       KUNIT_CASE_PARAM(drm_test_fb_build_fourcc_list, fb_build_fourcc_list_gen_params),
>> +    KUNIT_CASE_PARAM(drm_test_fb_memcpy, multi_plane_op_gen_params),
>>       {}
>>   };
>>   

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2023-08-09 20:01 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-21 18:23 [PATCH 0/6] Increase code coverage on drm_format_helper.c Arthur Grillo
2023-07-21 18:23 ` [PATCH 1/6] drm/format-helper: Test default pitch fallback Arthur Grillo
2023-08-05 12:56   ` Maira Canal
2023-08-09 14:54   ` André Almeida
2023-07-21 18:23 ` [PATCH 2/6] drm/format-helper: Add KUnit tests for drm_fb_swab() Arthur Grillo
2023-08-05 13:02   ` Maira Canal
2023-08-09 14:57   ` André Almeida
2023-07-21 18:23 ` [PATCH 3/6] drm/format-helper: Add KUnit tests for drm_fb_clip_offset() Arthur Grillo
2023-08-05 13:16   ` Maira Canal
2023-08-09 15:28   ` André Almeida
2023-07-21 18:23 ` [PATCH 4/6] drm/format-helper: Add KUnit tests for drm_fb_build_fourcc_list() Arthur Grillo
2023-08-05 13:21   ` Maira Canal
2023-08-09 15:54   ` André Almeida
2023-07-21 18:23 ` [PATCH 5/6] drm/format-helper-test: Add multi-plane support to conversion_buf_size() Arthur Grillo
2023-08-05 13:22   ` Maira Canal
2023-08-09 16:16   ` André Almeida
2023-07-21 18:23 ` [PATCH 6/6] drm/format-helper: Add KUnit tests for drm_fb_memcpy() Arthur Grillo
2023-07-25 14:14   ` kernel test robot
2023-08-05 13:26   ` Maira Canal
2023-08-09 20:01     ` Arthur Grillo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).