mirror of
https://github.com/torvalds/linux.git
synced 2026-04-24 09:35:52 -04:00
drm/xe/kunit: Add test for LMTT operations
The LMTT variants are abstracted with xe_lmtt_ops. Make sure that both 2L and ML ops implementations are correct. Reviewed-by: Michał Winiarski <michal.winiarski@intel.com> Link: https://lore.kernel.org/r/20231128151507.1015-6-michal.wajdeczko@intel.com Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
This commit is contained in:
committed by
Rodrigo Vivi
parent
a43ac2de4c
commit
f1a5d808b2
73
drivers/gpu/drm/xe/tests/xe_lmtt_test.c
Normal file
73
drivers/gpu/drm/xe/tests/xe_lmtt_test.c
Normal file
@@ -0,0 +1,73 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 AND MIT
|
||||
/*
|
||||
* Copyright © 2023 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <kunit/test.h>
|
||||
|
||||
static const struct lmtt_ops_param {
|
||||
const char *desc;
|
||||
const struct xe_lmtt_ops *ops;
|
||||
} lmtt_ops_params[] = {
|
||||
{ "2-level", &lmtt_2l_ops, },
|
||||
{ "multi-level", &lmtt_ml_ops, },
|
||||
};
|
||||
|
||||
static void lmtt_ops_param_get_desc(const struct lmtt_ops_param *p, char *desc)
|
||||
{
|
||||
snprintf(desc, KUNIT_PARAM_DESC_SIZE, "%s", p->desc);
|
||||
}
|
||||
|
||||
KUNIT_ARRAY_PARAM(lmtt_ops, lmtt_ops_params, lmtt_ops_param_get_desc);
|
||||
|
||||
static void test_ops(struct kunit *test)
|
||||
{
|
||||
const struct lmtt_ops_param *p = test->param_value;
|
||||
const struct xe_lmtt_ops *ops = p->ops;
|
||||
unsigned int n;
|
||||
|
||||
KUNIT_ASSERT_NOT_NULL(test, ops->lmtt_root_pd_level);
|
||||
KUNIT_ASSERT_NOT_NULL(test, ops->lmtt_pte_num);
|
||||
KUNIT_ASSERT_NOT_NULL(test, ops->lmtt_pte_size);
|
||||
KUNIT_ASSERT_NOT_NULL(test, ops->lmtt_pte_shift);
|
||||
KUNIT_ASSERT_NOT_NULL(test, ops->lmtt_pte_index);
|
||||
KUNIT_ASSERT_NOT_NULL(test, ops->lmtt_pte_encode);
|
||||
|
||||
KUNIT_EXPECT_NE(test, ops->lmtt_root_pd_level(), 0);
|
||||
|
||||
for (n = 0; n <= ops->lmtt_root_pd_level(); n++) {
|
||||
KUNIT_EXPECT_NE_MSG(test, ops->lmtt_pte_num(n), 0,
|
||||
"level=%u", n);
|
||||
KUNIT_EXPECT_NE_MSG(test, ops->lmtt_pte_size(n), 0,
|
||||
"level=%u", n);
|
||||
KUNIT_EXPECT_NE_MSG(test, ops->lmtt_pte_encode(0, n), LMTT_PTE_INVALID,
|
||||
"level=%u", n);
|
||||
}
|
||||
|
||||
for (n = 0; n < ops->lmtt_root_pd_level(); n++) {
|
||||
u64 addr = BIT_ULL(ops->lmtt_pte_shift(n));
|
||||
|
||||
KUNIT_EXPECT_NE_MSG(test, ops->lmtt_pte_shift(n), 0,
|
||||
"level=%u", n);
|
||||
KUNIT_EXPECT_EQ_MSG(test, ops->lmtt_pte_index(addr - 1, n), 0,
|
||||
"addr=%#llx level=%u", addr, n);
|
||||
KUNIT_EXPECT_EQ_MSG(test, ops->lmtt_pte_index(addr + 1, n), 1,
|
||||
"addr=%#llx level=%u", addr, n);
|
||||
KUNIT_EXPECT_EQ_MSG(test, ops->lmtt_pte_index(addr * 2 - 1, n), 1,
|
||||
"addr=%#llx level=%u", addr, n);
|
||||
KUNIT_EXPECT_EQ_MSG(test, ops->lmtt_pte_index(addr * 2, n), 2,
|
||||
"addr=%#llx level=%u", addr, n);
|
||||
}
|
||||
}
|
||||
|
||||
static struct kunit_case lmtt_test_cases[] = {
|
||||
KUNIT_CASE_PARAM(test_ops, lmtt_ops_gen_params),
|
||||
{}
|
||||
};
|
||||
|
||||
static struct kunit_suite lmtt_suite = {
|
||||
.name = "lmtt",
|
||||
.test_cases = lmtt_test_cases,
|
||||
};
|
||||
|
||||
kunit_test_suites(&lmtt_suite);
|
||||
Reference in New Issue
Block a user