drivers/gpu/drm/tests/drm_plane_helper_test.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/tests/drm_plane_helper_test.c
Extension
.c
Size
9695 bytes
Lines
320
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 drm_check_plane_state_test {
	const char *name;
	const char *msg;
	struct {
		unsigned int x;
		unsigned int y;
		unsigned int w;
		unsigned int h;
	} src, src_expected;
	struct {
		int x;
		int y;
		unsigned int w;
		unsigned int h;
	} crtc, crtc_expected;
	unsigned int rotation;
	int min_scale;
	int max_scale;
	bool can_position;
};

static int drm_plane_helper_init(struct kunit *test)
{
	const struct drm_check_plane_state_test *params = test->param_value;
	struct drm_plane *plane;
	struct drm_framebuffer *fb;
	struct drm_plane_state *mock;

	plane = kunit_kzalloc(test, sizeof(*plane), GFP_KERNEL);
	KUNIT_ASSERT_NOT_NULL(test, plane);

	fb = kunit_kzalloc(test, sizeof(*fb), GFP_KERNEL);
	KUNIT_ASSERT_NOT_NULL(test, fb);
	fb->width = 2048;
	fb->height = 2048;

	mock = kunit_kzalloc(test, sizeof(*mock), GFP_KERNEL);
	KUNIT_ASSERT_NOT_NULL(test, mock);
	mock->plane = plane;
	mock->crtc = ZERO_SIZE_PTR;
	mock->fb = fb;
	mock->rotation = params->rotation;
	mock->src_x = params->src.x;
	mock->src_y = params->src.y;
	mock->src_w = params->src.w;
	mock->src_h = params->src.h;
	mock->crtc_x = params->crtc.x;
	mock->crtc_y = params->crtc.y;
	mock->crtc_w = params->crtc.w;
	mock->crtc_h = params->crtc.h;

	test->priv = mock;

	return 0;
}

static void check_src_eq(struct kunit *test, struct drm_plane_state *plane_state,
			 unsigned int src_x, unsigned int src_y,
			 unsigned int src_w, unsigned int src_h)
{
	struct drm_rect expected = DRM_RECT_INIT(src_x, src_y, src_w, src_h);

	KUNIT_ASSERT_GE_MSG(test, plane_state->src.x1, 0,
			    "src x coordinate %x should never be below 0, src: " DRM_RECT_FP_FMT,
			    plane_state->src.x1, DRM_RECT_FP_ARG(&plane_state->src));

	KUNIT_ASSERT_GE_MSG(test, plane_state->src.y1, 0,
			    "src y coordinate %x should never be below 0, src: " DRM_RECT_FP_FMT,
			    plane_state->src.y1, DRM_RECT_FP_ARG(&plane_state->src));

	KUNIT_EXPECT_TRUE_MSG(test, drm_rect_equals(&plane_state->src, &expected),
			      "dst: " DRM_RECT_FP_FMT ", expected: " DRM_RECT_FP_FMT,
			      DRM_RECT_FP_ARG(&plane_state->src), DRM_RECT_FP_ARG(&expected));
}

static void check_crtc_eq(struct kunit *test, struct drm_plane_state *plane_state,
			  int crtc_x, int crtc_y,
			  unsigned int crtc_w, unsigned int crtc_h)
{
	struct drm_rect expected = DRM_RECT_INIT(crtc_x, crtc_y, crtc_w, crtc_h);

	KUNIT_EXPECT_TRUE_MSG(test, drm_rect_equals(&plane_state->dst, &expected),
			      "dst: " DRM_RECT_FMT ", expected: " DRM_RECT_FMT,
			      DRM_RECT_ARG(&plane_state->dst), DRM_RECT_ARG(&expected));
}

static void drm_test_check_plane_state(struct kunit *test)
{
	const struct drm_check_plane_state_test *params = test->param_value;
	struct drm_plane_state *plane_state = test->priv;

Annotation

Implementation Notes