drivers/gpu/drm/vkms/tests/vkms_config_test.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/vkms/tests/vkms_config_test.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/vkms/tests/vkms_config_test.c
Extension
.c
Size
32913 bytes
Lines
1030
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

struct default_config_case {
	bool enable_cursor;
	bool enable_writeback;
	bool enable_overlay;
	bool enable_plane_pipeline;
};

static void vkms_config_test_empty_config(struct kunit *test)
{
	struct vkms_config *config;
	const char *dev_name = "test";

	config = vkms_config_create(dev_name);
	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);

	/* The dev_name string and the config have different lifetimes */
	dev_name = NULL;
	KUNIT_EXPECT_STREQ(test, vkms_config_get_device_name(config), "test");

	KUNIT_EXPECT_EQ(test, vkms_config_get_num_planes(config), 0);
	KUNIT_EXPECT_EQ(test, vkms_config_get_num_crtcs(config), 0);
	KUNIT_EXPECT_EQ(test, vkms_config_get_num_encoders(config), 0);
	KUNIT_EXPECT_EQ(test, vkms_config_get_num_connectors(config), 0);

	KUNIT_EXPECT_FALSE(test, vkms_config_is_valid(config));

	vkms_config_destroy(config);
}

static struct default_config_case default_config_cases[] = {
	{ false, false, false, false },
	{ true, false, false, false },
	{ true, true, false, false },
	{ true, false, true, false },
	{ false, true, false, false },
	{ false, true, true, false },
	{ false, false, true, false },
	{ true, true, true, false },
	{ false, false, false, true },
	{ true, false, false, true },
	{ true, true, false, true },
	{ true, false, true, true },
	{ false, true, false, true },
	{ false, true, true, true },
	{ false, false, true, true },
	{ true, true, true, true },
};

KUNIT_ARRAY_PARAM(default_config, default_config_cases, NULL);

static void vkms_config_test_default_config(struct kunit *test)
{
	const struct default_config_case *params = test->param_value;
	struct vkms_config *config;
	struct vkms_config_plane *plane_cfg;
	struct vkms_config_crtc *crtc_cfg;
	int n_primaries = 0;
	int n_cursors = 0;
	int n_overlays = 0;

	config = vkms_config_default_create(params->enable_cursor,
					    params->enable_writeback,
					    params->enable_overlay,
					    params->enable_plane_pipeline);
	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, config);

	/* Planes */
	vkms_config_for_each_plane(config, plane_cfg) {
		KUNIT_EXPECT_EQ(test,
				vkms_config_plane_get_default_pipeline(plane_cfg),
				params->enable_plane_pipeline);
		switch (vkms_config_plane_get_type(plane_cfg)) {
		case DRM_PLANE_TYPE_PRIMARY:
			n_primaries++;
			break;
		case DRM_PLANE_TYPE_CURSOR:
			n_cursors++;
			break;
		case DRM_PLANE_TYPE_OVERLAY:
			n_overlays++;
			break;
		default:
			KUNIT_FAIL_AND_ABORT(test, "Unknown plane type");
		}
	}
	KUNIT_EXPECT_EQ(test, n_primaries, 1);
	KUNIT_EXPECT_EQ(test, n_cursors, params->enable_cursor ? 1 : 0);
	KUNIT_EXPECT_EQ(test, n_overlays, params->enable_overlay ? 8 : 0);

	/* CRTCs */

Annotation

Implementation Notes