From cca4cd467495da29e056b7bba7a6bb22ab3fd488 Mon Sep 17 00:00:00 2001 From: Michal Wajdeczko Date: Wed, 8 Jul 2026 20:07:55 +0200 Subject: [PATCH] drm/xe/tests: Add string encoding helper test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before we start using string to KLV encoding helper, add a simple test to make sure it works as expected. Signed-off-by: Michal Wajdeczko Reviewed-by: MichaƂ Winiarski #v1 Link: https://patch.msgid.link/20260708180755.2684-1-michal.wajdeczko@intel.com --- .../drm/xe/tests/xe_guc_klv_helpers_kunit.c | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/drivers/gpu/drm/xe/tests/xe_guc_klv_helpers_kunit.c b/drivers/gpu/drm/xe/tests/xe_guc_klv_helpers_kunit.c index f87189ef13d5..cb4b182d88d0 100644 --- a/drivers/gpu/drm/xe/tests/xe_guc_klv_helpers_kunit.c +++ b/drivers/gpu/drm/xe/tests/xe_guc_klv_helpers_kunit.c @@ -84,10 +84,94 @@ static void test_encode_u64(struct kunit *test) KUNIT_ASSERT_PTR_EQ(test, fail, xe_guc_klv_encode_u64(fail, ARRAY_SIZE(klvs), key, value)); } +static u32 str_klv_size(const char *string) +{ + return GUC_KLV_LEN_MIN + to_num_dwords(strlen(string) + 1); +} + +static void test_encode_string(struct kunit *test) +{ + size_t longest_str = to_num_bytes(FIELD_MAX(GUC_KLV_0_LEN)) - 1; + u32 avail = GUC_KLV_LEN_MIN + FIELD_MAX(GUC_KLV_0_LEN) + 1; + const char *string = "abcdefghijklmnopqrstvwxyz"; + u16 key = TEST_KEY; + u32 *klvs; + u32 *next; + char *buf; + u32 n; + + klvs = kunit_kcalloc(test, avail, sizeof(u32), GFP_KERNEL); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, klvs); + + buf = kunit_kzalloc(test, longest_str + 2, GFP_KERNEL); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf); + + /* empty string, no space, must fail */ + for (n = 0; n < str_klv_size(""); n++) { + klvs[0] = TEST_PAD; + KUNIT_EXPECT_PTR_EQ(test, ERR_PTR(-ENOSPC), + xe_guc_klv_encode_string(klvs, n, key, "")); + KUNIT_EXPECT_EQ(test, klvs[0], TEST_PAD); + } + + /* empty string, must pass */ + KUNIT_EXPECT_PTR_EQ(test, klvs + str_klv_size(""), + xe_guc_klv_encode_string(klvs, str_klv_size(""), key, "")); + KUNIT_EXPECT_PTR_EQ(test, klvs + str_klv_size(""), + xe_guc_klv_encode_string(klvs, avail, key, "")); + + /* demo string, no space, must fail */ + for (n = 0; n < str_klv_size(string); n++) { + klvs[0] = TEST_PAD; + KUNIT_EXPECT_PTR_EQ(test, ERR_PTR(-ENOSPC), + xe_guc_klv_encode_string(klvs, n, key, string)); + KUNIT_EXPECT_EQ(test, klvs[0], TEST_PAD); + } + + /* different string len, must pass */ + for (n = 0; n <= strlen(string); n++) { + strscpy(buf, string, n + 1); + kunit_info(test, "%u: '%s'\n", n, buf); + KUNIT_ASSERT_EQ(test, n, strlen(buf)); + memset32(klvs, TEST_PAD, avail); + + next = xe_guc_klv_encode_string(klvs, str_klv_size(buf), key, buf); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, next); + KUNIT_EXPECT_PTR_EQ(test, next, klvs + str_klv_size(buf)); + KUNIT_EXPECT_STREQ_MSG(test, buf, (char *)(klvs + GUC_KLV_LEN_MIN), "n=%u", n); + kunit_info(test, "%u: %*ph\n", n, (int)to_num_bytes(next - klvs), klvs); + KUNIT_EXPECT_NE(test, *(next - 1), TEST_PAD); + KUNIT_ASSERT_EQ(test, *next, TEST_PAD); + + /* bigger buf doesn't matter */ + KUNIT_EXPECT_PTR_EQ(test, + xe_guc_klv_encode_string(klvs, str_klv_size(buf), key, buf), + xe_guc_klv_encode_string(klvs, avail, key, buf)); + } + + /* don't crash if already failed */ + KUNIT_EXPECT_PTR_EQ(test, ERR_PTR(-EROFS), + xe_guc_klv_encode_string(ERR_PTR(-EROFS), avail, key, "")); + + /* too long string, must fail */ + memset(buf, 'X', longest_str + 1); + buf[longest_str + 1] = '\0'; + KUNIT_EXPECT_LT(test, longest_str, strlen(buf)); + KUNIT_EXPECT_PTR_EQ(test, ERR_PTR(-E2BIG), + xe_guc_klv_encode_string(klvs, avail, key, buf)); + + /* longest string, should pass */ + buf[longest_str] = '\0'; + KUNIT_EXPECT_EQ(test, longest_str, strlen(buf)); + KUNIT_EXPECT_PTR_EQ(test, klvs + str_klv_size(buf), + xe_guc_klv_encode_string(klvs, avail, key, buf)); +} + static struct kunit_case guc_klv_helpers_test_cases[] = { KUNIT_CASE(test_count), KUNIT_CASE(test_encode_u32), KUNIT_CASE(test_encode_u64), + KUNIT_CASE(test_encode_string), {} };