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