158 lines
4.0 KiB
C
158 lines
4.0 KiB
C
|
// SPDX-License-Identifier: GPL-2.0
|
||
|
/*
|
||
|
* Copyright © 2023 Intel Corporation
|
||
|
*/
|
||
|
|
||
|
#include <drm/drm_drv.h>
|
||
|
#include <drm/drm_kunit_helpers.h>
|
||
|
|
||
|
#include <kunit/test.h>
|
||
|
|
||
|
#include "xe_device.h"
|
||
|
#include "xe_kunit_helpers.h"
|
||
|
#include "xe_pci_test.h"
|
||
|
#include "xe_reg_sr.h"
|
||
|
#include "xe_tuning.h"
|
||
|
#include "xe_wa.h"
|
||
|
|
||
|
struct platform_test_case {
|
||
|
const char *name;
|
||
|
enum xe_platform platform;
|
||
|
enum xe_subplatform subplatform;
|
||
|
u32 graphics_verx100;
|
||
|
u32 media_verx100;
|
||
|
struct xe_step_info step;
|
||
|
};
|
||
|
|
||
|
#define PLATFORM_CASE(platform__, graphics_step__) \
|
||
|
{ \
|
||
|
.name = #platform__ " (" #graphics_step__ ")", \
|
||
|
.platform = XE_ ## platform__, \
|
||
|
.subplatform = XE_SUBPLATFORM_NONE, \
|
||
|
.step = { .graphics = STEP_ ## graphics_step__ } \
|
||
|
}
|
||
|
|
||
|
|
||
|
#define SUBPLATFORM_CASE(platform__, subplatform__, graphics_step__) \
|
||
|
{ \
|
||
|
.name = #platform__ "_" #subplatform__ " (" #graphics_step__ ")", \
|
||
|
.platform = XE_ ## platform__, \
|
||
|
.subplatform = XE_SUBPLATFORM_ ## platform__ ## _ ## subplatform__, \
|
||
|
.step = { .graphics = STEP_ ## graphics_step__ } \
|
||
|
}
|
||
|
|
||
|
#define GMDID_CASE(platform__, graphics_verx100__, graphics_step__, \
|
||
|
media_verx100__, media_step__) \
|
||
|
{ \
|
||
|
.name = #platform__ " (g:" #graphics_step__ ", m:" #media_step__ ")",\
|
||
|
.platform = XE_ ## platform__, \
|
||
|
.subplatform = XE_SUBPLATFORM_NONE, \
|
||
|
.graphics_verx100 = graphics_verx100__, \
|
||
|
.media_verx100 = media_verx100__, \
|
||
|
.step = { .graphics = STEP_ ## graphics_step__, \
|
||
|
.media = STEP_ ## media_step__ } \
|
||
|
}
|
||
|
|
||
|
static const struct platform_test_case cases[] = {
|
||
|
PLATFORM_CASE(TIGERLAKE, B0),
|
||
|
PLATFORM_CASE(DG1, A0),
|
||
|
PLATFORM_CASE(DG1, B0),
|
||
|
PLATFORM_CASE(ALDERLAKE_S, A0),
|
||
|
PLATFORM_CASE(ALDERLAKE_S, B0),
|
||
|
PLATFORM_CASE(ALDERLAKE_S, C0),
|
||
|
PLATFORM_CASE(ALDERLAKE_S, D0),
|
||
|
PLATFORM_CASE(ALDERLAKE_P, A0),
|
||
|
PLATFORM_CASE(ALDERLAKE_P, B0),
|
||
|
PLATFORM_CASE(ALDERLAKE_P, C0),
|
||
|
SUBPLATFORM_CASE(ALDERLAKE_S, RPLS, D0),
|
||
|
SUBPLATFORM_CASE(ALDERLAKE_P, RPLU, E0),
|
||
|
SUBPLATFORM_CASE(DG2, G10, C0),
|
||
|
SUBPLATFORM_CASE(DG2, G11, B1),
|
||
|
SUBPLATFORM_CASE(DG2, G12, A1),
|
||
|
GMDID_CASE(METEORLAKE, 1270, A0, 1300, A0),
|
||
|
GMDID_CASE(METEORLAKE, 1271, A0, 1300, A0),
|
||
|
GMDID_CASE(METEORLAKE, 1274, A0, 1300, A0),
|
||
|
GMDID_CASE(LUNARLAKE, 2004, A0, 2000, A0),
|
||
|
GMDID_CASE(LUNARLAKE, 2004, B0, 2000, A0),
|
||
|
GMDID_CASE(BATTLEMAGE, 2001, A0, 1301, A1),
|
||
|
};
|
||
|
|
||
|
static void platform_desc(const struct platform_test_case *t, char *desc)
|
||
|
{
|
||
|
strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);
|
||
|
}
|
||
|
|
||
|
KUNIT_ARRAY_PARAM(platform, cases, platform_desc);
|
||
|
|
||
|
static int xe_wa_test_init(struct kunit *test)
|
||
|
{
|
||
|
const struct platform_test_case *param = test->param_value;
|
||
|
struct xe_pci_fake_data data = {
|
||
|
.platform = param->platform,
|
||
|
.subplatform = param->subplatform,
|
||
|
.graphics_verx100 = param->graphics_verx100,
|
||
|
.media_verx100 = param->media_verx100,
|
||
|
.graphics_step = param->step.graphics,
|
||
|
.media_step = param->step.media,
|
||
|
};
|
||
|
struct xe_device *xe;
|
||
|
struct device *dev;
|
||
|
int ret;
|
||
|
|
||
|
dev = drm_kunit_helper_alloc_device(test);
|
||
|
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);
|
||
|
|
||
|
xe = xe_kunit_helper_alloc_xe_device(test, dev);
|
||
|
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xe);
|
||
|
|
||
|
test->priv = &data;
|
||
|
ret = xe_pci_fake_device_init(xe);
|
||
|
KUNIT_ASSERT_EQ(test, ret, 0);
|
||
|
|
||
|
if (!param->graphics_verx100)
|
||
|
xe->info.step = param->step;
|
||
|
|
||
|
/* TODO: init hw engines for engine/LRC WAs */
|
||
|
xe->drm.dev = dev;
|
||
|
test->priv = xe;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static void xe_wa_test_exit(struct kunit *test)
|
||
|
{
|
||
|
struct xe_device *xe = test->priv;
|
||
|
|
||
|
drm_kunit_helper_free_device(test, xe->drm.dev);
|
||
|
}
|
||
|
|
||
|
static void xe_wa_gt(struct kunit *test)
|
||
|
{
|
||
|
struct xe_device *xe = test->priv;
|
||
|
struct xe_gt *gt;
|
||
|
int id;
|
||
|
|
||
|
for_each_gt(gt, xe, id) {
|
||
|
xe_reg_sr_init(>->reg_sr, "GT", xe);
|
||
|
|
||
|
xe_wa_process_gt(gt);
|
||
|
xe_tuning_process_gt(gt);
|
||
|
|
||
|
KUNIT_ASSERT_EQ(test, gt->reg_sr.errors, 0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static struct kunit_case xe_wa_tests[] = {
|
||
|
KUNIT_CASE_PARAM(xe_wa_gt, platform_gen_params),
|
||
|
{}
|
||
|
};
|
||
|
|
||
|
static struct kunit_suite xe_rtp_test_suite = {
|
||
|
.name = "xe_wa",
|
||
|
.init = xe_wa_test_init,
|
||
|
.exit = xe_wa_test_exit,
|
||
|
.test_cases = xe_wa_tests,
|
||
|
};
|
||
|
|
||
|
kunit_test_suite(xe_rtp_test_suite);
|