File Index
Files and directories
Sign in
FILE

xe_sriov_pf_service_kunit.c

File preview with syntax highlighting.

linux-6.19.14/drivers/gpu/drm/xe/tests/xe_sriov_pf_service_kunit.c C
  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);
~/ Read-only file preview.