drivers/gpu/drm/xe/tests/xe_sriov_pf_service_kunit.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/xe/tests/xe_sriov_pf_service_kunit.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/xe/tests/xe_sriov_pf_service_kunit.c
Extension
.c
Size
7140 bytes
Lines
228
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: GPL-2.0 AND MIT
/*
 * Copyright © 2024-2025 Intel Corporation
 */

#include <kunit/test.h>

#include "xe_device.h"
#include "xe_kunit_helpers.h"
#include "xe_pci_test.h"

static int pf_service_test_init(struct kunit *test)
{
	struct xe_pci_fake_data fake = {
		.sriov_mode = XE_SRIOV_MODE_PF,
		.platform = XE_TIGERLAKE, /* some random platform */
		.subplatform = XE_SUBPLATFORM_NONE,
	};
	struct xe_device *xe;

	test->priv = &fake;
	xe_kunit_helper_xe_device_test_init(test);

	xe = test->priv;
	KUNIT_ASSERT_EQ(test, xe_sriov_init(xe), 0);

	xe_sriov_pf_service_init(xe);
	/*
	 * sanity check:
	 * - all supported platforms VF/PF ABI versions must be defined
	 * - base version can't be newer than latest
	 */
	KUNIT_ASSERT_NE(test, 0, xe->sriov.pf.service.version.base.major);
	KUNIT_ASSERT_NE(test, 0, xe->sriov.pf.service.version.latest.major);
	KUNIT_ASSERT_LE(test, xe->sriov.pf.service.version.base.major,
			xe->sriov.pf.service.version.latest.major);
	if (xe->sriov.pf.service.version.base.major == xe->sriov.pf.service.version.latest.major)
		KUNIT_ASSERT_LE(test, xe->sriov.pf.service.version.base.minor,
				xe->sriov.pf.service.version.latest.minor);
	return 0;
}

static void pf_negotiate_any(struct kunit *test)
{
	struct xe_device *xe = test->priv;
	u32 major, minor;

	KUNIT_ASSERT_EQ(test, 0,
			pf_negotiate_version(xe, VF2PF_HANDSHAKE_MAJOR_ANY,
					     VF2PF_HANDSHAKE_MINOR_ANY,
					     &major, &minor));
	KUNIT_ASSERT_EQ(test, major, xe->sriov.pf.service.version.latest.major);
	KUNIT_ASSERT_EQ(test, minor, xe->sriov.pf.service.version.latest.minor);
}

static void pf_negotiate_base_match(struct kunit *test)
{
	struct xe_device *xe = test->priv;
	u32 major, minor;

	KUNIT_ASSERT_EQ(test, 0,
			pf_negotiate_version(xe,
					     xe->sriov.pf.service.version.base.major,
					     xe->sriov.pf.service.version.base.minor,
					     &major, &minor));
	KUNIT_ASSERT_EQ(test, major, xe->sriov.pf.service.version.base.major);
	KUNIT_ASSERT_EQ(test, minor, xe->sriov.pf.service.version.base.minor);
}

static void pf_negotiate_base_newer(struct kunit *test)
{
	struct xe_device *xe = test->priv;
	u32 major, minor;

	KUNIT_ASSERT_EQ(test, 0,
			pf_negotiate_version(xe,
					     xe->sriov.pf.service.version.base.major,
					     xe->sriov.pf.service.version.base.minor + 1,
					     &major, &minor));
	KUNIT_ASSERT_EQ(test, major, xe->sriov.pf.service.version.base.major);
	KUNIT_ASSERT_GE(test, minor, xe->sriov.pf.service.version.base.minor);
	if (xe->sriov.pf.service.version.base.major == xe->sriov.pf.service.version.latest.major)
		KUNIT_ASSERT_LE(test, minor, xe->sriov.pf.service.version.latest.minor);
	else
		KUNIT_FAIL(test, "FIXME: don't know how to test multi-version yet!\n");
}

static void pf_negotiate_base_next(struct kunit *test)
{
	struct xe_device *xe = test->priv;

Annotation

Implementation Notes