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
12static 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
43static 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
56static 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
70static 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
88static 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
105static 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
120static 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
131static 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
145static 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
159static 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
172static 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
189static 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
206static 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
221static 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
227kunit_test_suite(pf_service_suite);
228

source code of linux/drivers/gpu/drm/xe/tests/xe_sriov_pf_service_kunit.c