158 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright © 2023 Intel Corporation4 */5 6#include <drm/drm_drv.h>7#include <drm/drm_kunit_helpers.h>8 9#include <kunit/test.h>10 11#include "xe_device.h"12#include "xe_kunit_helpers.h"13#include "xe_pci_test.h"14#include "xe_reg_sr.h"15#include "xe_tuning.h"16#include "xe_wa.h"17 18struct platform_test_case {19 const char *name;20 enum xe_platform platform;21 enum xe_subplatform subplatform;22 u32 graphics_verx100;23 u32 media_verx100;24 struct xe_step_info step;25};26 27#define PLATFORM_CASE(platform__, graphics_step__) \28 { \29 .name = #platform__ " (" #graphics_step__ ")", \30 .platform = XE_ ## platform__, \31 .subplatform = XE_SUBPLATFORM_NONE, \32 .step = { .graphics = STEP_ ## graphics_step__ } \33 }34 35 36#define SUBPLATFORM_CASE(platform__, subplatform__, graphics_step__) \37 { \38 .name = #platform__ "_" #subplatform__ " (" #graphics_step__ ")", \39 .platform = XE_ ## platform__, \40 .subplatform = XE_SUBPLATFORM_ ## platform__ ## _ ## subplatform__, \41 .step = { .graphics = STEP_ ## graphics_step__ } \42 }43 44#define GMDID_CASE(platform__, graphics_verx100__, graphics_step__, \45 media_verx100__, media_step__) \46 { \47 .name = #platform__ " (g:" #graphics_step__ ", m:" #media_step__ ")",\48 .platform = XE_ ## platform__, \49 .subplatform = XE_SUBPLATFORM_NONE, \50 .graphics_verx100 = graphics_verx100__, \51 .media_verx100 = media_verx100__, \52 .step = { .graphics = STEP_ ## graphics_step__, \53 .media = STEP_ ## media_step__ } \54 }55 56static const struct platform_test_case cases[] = {57 PLATFORM_CASE(TIGERLAKE, B0),58 PLATFORM_CASE(DG1, A0),59 PLATFORM_CASE(DG1, B0),60 PLATFORM_CASE(ALDERLAKE_S, A0),61 PLATFORM_CASE(ALDERLAKE_S, B0),62 PLATFORM_CASE(ALDERLAKE_S, C0),63 PLATFORM_CASE(ALDERLAKE_S, D0),64 PLATFORM_CASE(ALDERLAKE_P, A0),65 PLATFORM_CASE(ALDERLAKE_P, B0),66 PLATFORM_CASE(ALDERLAKE_P, C0),67 SUBPLATFORM_CASE(ALDERLAKE_S, RPLS, D0),68 SUBPLATFORM_CASE(ALDERLAKE_P, RPLU, E0),69 SUBPLATFORM_CASE(DG2, G10, C0),70 SUBPLATFORM_CASE(DG2, G11, B1),71 SUBPLATFORM_CASE(DG2, G12, A1),72 GMDID_CASE(METEORLAKE, 1270, A0, 1300, A0),73 GMDID_CASE(METEORLAKE, 1271, A0, 1300, A0),74 GMDID_CASE(METEORLAKE, 1274, A0, 1300, A0),75 GMDID_CASE(LUNARLAKE, 2004, A0, 2000, A0),76 GMDID_CASE(LUNARLAKE, 2004, B0, 2000, A0),77 GMDID_CASE(BATTLEMAGE, 2001, A0, 1301, A1),78};79 80static void platform_desc(const struct platform_test_case *t, char *desc)81{82 strscpy(desc, t->name, KUNIT_PARAM_DESC_SIZE);83}84 85KUNIT_ARRAY_PARAM(platform, cases, platform_desc);86 87static int xe_wa_test_init(struct kunit *test)88{89 const struct platform_test_case *param = test->param_value;90 struct xe_pci_fake_data data = {91 .platform = param->platform,92 .subplatform = param->subplatform,93 .graphics_verx100 = param->graphics_verx100,94 .media_verx100 = param->media_verx100,95 .graphics_step = param->step.graphics,96 .media_step = param->step.media,97 };98 struct xe_device *xe;99 struct device *dev;100 int ret;101 102 dev = drm_kunit_helper_alloc_device(test);103 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dev);104 105 xe = xe_kunit_helper_alloc_xe_device(test, dev);106 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, xe);107 108 test->priv = &data;109 ret = xe_pci_fake_device_init(xe);110 KUNIT_ASSERT_EQ(test, ret, 0);111 112 if (!param->graphics_verx100)113 xe->info.step = param->step;114 115 /* TODO: init hw engines for engine/LRC WAs */116 xe->drm.dev = dev;117 test->priv = xe;118 119 return 0;120}121 122static void xe_wa_test_exit(struct kunit *test)123{124 struct xe_device *xe = test->priv;125 126 drm_kunit_helper_free_device(test, xe->drm.dev);127}128 129static void xe_wa_gt(struct kunit *test)130{131 struct xe_device *xe = test->priv;132 struct xe_gt *gt;133 int id;134 135 for_each_gt(gt, xe, id) {136 xe_reg_sr_init(>->reg_sr, "GT", xe);137 138 xe_wa_process_gt(gt);139 xe_tuning_process_gt(gt);140 141 KUNIT_ASSERT_EQ(test, gt->reg_sr.errors, 0);142 }143}144 145static struct kunit_case xe_wa_tests[] = {146 KUNIT_CASE_PARAM(xe_wa_gt, platform_gen_params),147 {}148};149 150static struct kunit_suite xe_rtp_test_suite = {151 .name = "xe_wa",152 .init = xe_wa_test_init,153 .exit = xe_wa_test_exit,154 .test_cases = xe_wa_tests,155};156 157kunit_test_suite(xe_rtp_test_suite);158