xref: /linux/drivers/gpu/drm/xe/tests/xe_sriov_pf_service_kunit.c (revision 220994d61cebfc04f071d69049127657c7e8191b)
1 // SPDX-License-Identifier: GPL-2.0 AND MIT
2 /*
3  * Copyright © 2024-2025 Intel Corporation
4  */
5 
6 #include <kunit/test.h>
7 
8 #include "xe_device.h"
9 #include "xe_kunit_helpers.h"
10 #include "xe_pci_test.h"
11 
pf_service_test_init(struct kunit * test)12 static int pf_service_test_init(struct kunit *test)
13 {
14 	struct xe_pci_fake_data fake = {
15 		.sriov_mode = XE_SRIOV_MODE_PF,
16 		.platform = XE_TIGERLAKE, /* some random platform */
17 		.subplatform = XE_SUBPLATFORM_NONE,
18 	};
19 	struct xe_device *xe;
20 
21 	test->priv = &fake;
22 	xe_kunit_helper_xe_device_test_init(test);
23 
24 	xe = test->priv;
25 	KUNIT_ASSERT_EQ(test, xe_sriov_init(xe), 0);
26 
27 	xe_sriov_pf_service_init(xe);
28 	/*
29 	 * sanity check:
30 	 * - all supported platforms VF/PF ABI versions must be defined
31 	 * - base version can't be newer than latest
32 	 */
33 	KUNIT_ASSERT_NE(test, 0, xe->sriov.pf.service.version.base.major);
34 	KUNIT_ASSERT_NE(test, 0, xe->sriov.pf.service.version.latest.major);
35 	KUNIT_ASSERT_LE(test, xe->sriov.pf.service.version.base.major,
36 			xe->sriov.pf.service.version.latest.major);
37 	if (xe->sriov.pf.service.version.base.major == xe->sriov.pf.service.version.latest.major)
38 		KUNIT_ASSERT_LE(test, xe->sriov.pf.service.version.base.minor,
39 				xe->sriov.pf.service.version.latest.minor);
40 	return 0;
41 }
42 
pf_negotiate_any(struct kunit * test)43 static void pf_negotiate_any(struct kunit *test)
44 {
45 	struct xe_device *xe = test->priv;
46 	u32 major, minor;
47 
48 	KUNIT_ASSERT_EQ(test, 0,
49 			pf_negotiate_version(xe, VF2PF_HANDSHAKE_MAJOR_ANY,
50 					     VF2PF_HANDSHAKE_MINOR_ANY,
51 					     &major, &minor));
52 	KUNIT_ASSERT_EQ(test, major, xe->sriov.pf.service.version.latest.major);
53 	KUNIT_ASSERT_EQ(test, minor, xe->sriov.pf.service.version.latest.minor);
54 }
55 
pf_negotiate_base_match(struct kunit * test)56 static void pf_negotiate_base_match(struct kunit *test)
57 {
58 	struct xe_device *xe = test->priv;
59 	u32 major, minor;
60 
61 	KUNIT_ASSERT_EQ(test, 0,
62 			pf_negotiate_version(xe,
63 					     xe->sriov.pf.service.version.base.major,
64 					     xe->sriov.pf.service.version.base.minor,
65 					     &major, &minor));
66 	KUNIT_ASSERT_EQ(test, major, xe->sriov.pf.service.version.base.major);
67 	KUNIT_ASSERT_EQ(test, minor, xe->sriov.pf.service.version.base.minor);
68 }
69 
pf_negotiate_base_newer(struct kunit * test)70 static void pf_negotiate_base_newer(struct kunit *test)
71 {
72 	struct xe_device *xe = test->priv;
73 	u32 major, minor;
74 
75 	KUNIT_ASSERT_EQ(test, 0,
76 			pf_negotiate_version(xe,
77 					     xe->sriov.pf.service.version.base.major,
78 					     xe->sriov.pf.service.version.base.minor + 1,
79 					     &major, &minor));
80 	KUNIT_ASSERT_EQ(test, major, xe->sriov.pf.service.version.base.major);
81 	KUNIT_ASSERT_GE(test, minor, xe->sriov.pf.service.version.base.minor);
82 	if (xe->sriov.pf.service.version.base.major == xe->sriov.pf.service.version.latest.major)
83 		KUNIT_ASSERT_LE(test, minor, xe->sriov.pf.service.version.latest.minor);
84 	else
85 		KUNIT_FAIL(test, "FIXME: don't know how to test multi-version yet!\n");
86 }
87 
pf_negotiate_base_next(struct kunit * test)88 static void pf_negotiate_base_next(struct kunit *test)
89 {
90 	struct xe_device *xe = test->priv;
91 	u32 major, minor;
92 
93 	KUNIT_ASSERT_EQ(test, 0,
94 			pf_negotiate_version(xe,
95 					     xe->sriov.pf.service.version.base.major + 1, 0,
96 					     &major, &minor));
97 	KUNIT_ASSERT_GE(test, major, xe->sriov.pf.service.version.base.major);
98 	KUNIT_ASSERT_LE(test, major, xe->sriov.pf.service.version.latest.major);
99 	if (major == xe->sriov.pf.service.version.latest.major)
100 		KUNIT_ASSERT_LE(test, minor, xe->sriov.pf.service.version.latest.minor);
101 	else
102 		KUNIT_FAIL(test, "FIXME: don't know how to test multi-version yet!\n");
103 }
104 
pf_negotiate_base_older(struct kunit * test)105 static void pf_negotiate_base_older(struct kunit *test)
106 {
107 	struct xe_device *xe = test->priv;
108 	u32 major, minor;
109 
110 	if (!xe->sriov.pf.service.version.base.minor)
111 		kunit_skip(test, "no older minor\n");
112 
113 	KUNIT_ASSERT_NE(test, 0,
114 			pf_negotiate_version(xe,
115 					     xe->sriov.pf.service.version.base.major,
116 					     xe->sriov.pf.service.version.base.minor - 1,
117 					     &major, &minor));
118 }
119 
pf_negotiate_base_prev(struct kunit * test)120 static void pf_negotiate_base_prev(struct kunit *test)
121 {
122 	struct xe_device *xe = test->priv;
123 	u32 major, minor;
124 
125 	KUNIT_ASSERT_NE(test, 0,
126 			pf_negotiate_version(xe,
127 					     xe->sriov.pf.service.version.base.major - 1, 1,
128 					     &major, &minor));
129 }
130 
pf_negotiate_latest_match(struct kunit * test)131 static void pf_negotiate_latest_match(struct kunit *test)
132 {
133 	struct xe_device *xe = test->priv;
134 	u32 major, minor;
135 
136 	KUNIT_ASSERT_EQ(test, 0,
137 			pf_negotiate_version(xe,
138 					     xe->sriov.pf.service.version.latest.major,
139 					     xe->sriov.pf.service.version.latest.minor,
140 					     &major, &minor));
141 	KUNIT_ASSERT_EQ(test, major, xe->sriov.pf.service.version.latest.major);
142 	KUNIT_ASSERT_EQ(test, minor, xe->sriov.pf.service.version.latest.minor);
143 }
144 
pf_negotiate_latest_newer(struct kunit * test)145 static void pf_negotiate_latest_newer(struct kunit *test)
146 {
147 	struct xe_device *xe = test->priv;
148 	u32 major, minor;
149 
150 	KUNIT_ASSERT_EQ(test, 0,
151 			pf_negotiate_version(xe,
152 					     xe->sriov.pf.service.version.latest.major,
153 					     xe->sriov.pf.service.version.latest.minor + 1,
154 					     &major, &minor));
155 	KUNIT_ASSERT_EQ(test, major, xe->sriov.pf.service.version.latest.major);
156 	KUNIT_ASSERT_EQ(test, minor, xe->sriov.pf.service.version.latest.minor);
157 }
158 
pf_negotiate_latest_next(struct kunit * test)159 static void pf_negotiate_latest_next(struct kunit *test)
160 {
161 	struct xe_device *xe = test->priv;
162 	u32 major, minor;
163 
164 	KUNIT_ASSERT_EQ(test, 0,
165 			pf_negotiate_version(xe,
166 					     xe->sriov.pf.service.version.latest.major + 1, 0,
167 					     &major, &minor));
168 	KUNIT_ASSERT_EQ(test, major, xe->sriov.pf.service.version.latest.major);
169 	KUNIT_ASSERT_EQ(test, minor, xe->sriov.pf.service.version.latest.minor);
170 }
171 
pf_negotiate_latest_older(struct kunit * test)172 static void pf_negotiate_latest_older(struct kunit *test)
173 {
174 	struct xe_device *xe = test->priv;
175 	u32 major, minor;
176 
177 	if (!xe->sriov.pf.service.version.latest.minor)
178 		kunit_skip(test, "no older minor\n");
179 
180 	KUNIT_ASSERT_EQ(test, 0,
181 			pf_negotiate_version(xe,
182 					     xe->sriov.pf.service.version.latest.major,
183 					     xe->sriov.pf.service.version.latest.minor - 1,
184 					     &major, &minor));
185 	KUNIT_ASSERT_EQ(test, major, xe->sriov.pf.service.version.latest.major);
186 	KUNIT_ASSERT_EQ(test, minor, xe->sriov.pf.service.version.latest.minor - 1);
187 }
188 
pf_negotiate_latest_prev(struct kunit * test)189 static void pf_negotiate_latest_prev(struct kunit *test)
190 {
191 	struct xe_device *xe = test->priv;
192 	u32 major, minor;
193 
194 	if (xe->sriov.pf.service.version.base.major == xe->sriov.pf.service.version.latest.major)
195 		kunit_skip(test, "no prev major");
196 
197 	KUNIT_ASSERT_EQ(test, 0,
198 			pf_negotiate_version(xe,
199 					     xe->sriov.pf.service.version.latest.major - 1,
200 					     xe->sriov.pf.service.version.base.minor + 1,
201 					     &major, &minor));
202 	KUNIT_ASSERT_EQ(test, major, xe->sriov.pf.service.version.latest.major - 1);
203 	KUNIT_ASSERT_GE(test, major, xe->sriov.pf.service.version.base.major);
204 }
205 
206 static struct kunit_case pf_service_test_cases[] = {
207 	KUNIT_CASE(pf_negotiate_any),
208 	KUNIT_CASE(pf_negotiate_base_match),
209 	KUNIT_CASE(pf_negotiate_base_newer),
210 	KUNIT_CASE(pf_negotiate_base_next),
211 	KUNIT_CASE(pf_negotiate_base_older),
212 	KUNIT_CASE(pf_negotiate_base_prev),
213 	KUNIT_CASE(pf_negotiate_latest_match),
214 	KUNIT_CASE(pf_negotiate_latest_newer),
215 	KUNIT_CASE(pf_negotiate_latest_next),
216 	KUNIT_CASE(pf_negotiate_latest_older),
217 	KUNIT_CASE(pf_negotiate_latest_prev),
218 	{}
219 };
220 
221 static struct kunit_suite pf_service_suite = {
222 	.name = "pf_service",
223 	.test_cases = pf_service_test_cases,
224 	.init = pf_service_test_init,
225 };
226 
227 kunit_test_suite(pf_service_suite);
228