drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_replay_test.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_replay_test.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/amd/display/amdgpu_dm/tests/amdgpu_dm_replay_test.c
Extension
.c
Size
6206 bytes
Lines
207
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 replay_test_ctx {
	struct dc_link *link;
	struct amdgpu_dm_connector *aconnector;
	struct dm_connector_state *dm_state;
};

static struct replay_test_ctx *alloc_replay_ctx(struct kunit *test)
{
	struct replay_test_ctx *ctx;

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

	ctx->link = kunit_kzalloc(test, sizeof(*ctx->link), GFP_KERNEL);
	KUNIT_ASSERT_NOT_NULL(test, ctx->link);

	ctx->aconnector = kunit_kzalloc(test, sizeof(*ctx->aconnector), GFP_KERNEL);
	KUNIT_ASSERT_NOT_NULL(test, ctx->aconnector);

	ctx->dm_state = kunit_kzalloc(test, sizeof(*ctx->dm_state), GFP_KERNEL);
	KUNIT_ASSERT_NOT_NULL(test, ctx->dm_state);

	/* Wire connector state so to_dm_connector_state() works */
	ctx->aconnector->base.state = &ctx->dm_state->base;

	return ctx;
}

/*
 * Helper: set all conditions for replay support to pass so individual
 * tests can disable one condition at a time.
 */
static void set_all_replay_caps(struct replay_test_ctx *ctx)
{
	ctx->dm_state->freesync_capable = true;
	ctx->aconnector->vsdb_info.replay_mode = true;
	ctx->link->dpcd_caps.edp_rev = EDP_REVISION_13;
	ctx->link->dpcd_caps.alpm_caps.bits.AUX_WAKE_ALPM_CAP = 1;
	ctx->link->dpcd_caps.adaptive_sync_caps.dp_adap_sync_caps.bits.ADAPTIVE_SYNC_SDP_SUPPORT = 1;
	ctx->link->dpcd_caps.pr_info.pixel_deviation_per_line = 1;
	ctx->link->dpcd_caps.pr_info.max_deviation_line = 1;
}

/* Tests for amdgpu_dm_link_supports_replay() — all caps met */

static void dm_test_replay_supports_all_caps(struct kunit *test)
{
	struct replay_test_ctx *ctx = alloc_replay_ctx(test);

	set_all_replay_caps(ctx);

	KUNIT_EXPECT_TRUE(test,
			  amdgpu_dm_link_supports_replay(ctx->link, ctx->aconnector));
}

/* Tests for amdgpu_dm_link_supports_replay() — freesync not capable */

static void dm_test_replay_no_freesync(struct kunit *test)
{
	struct replay_test_ctx *ctx = alloc_replay_ctx(test);

	set_all_replay_caps(ctx);
	ctx->dm_state->freesync_capable = false;

	KUNIT_EXPECT_FALSE(test,
			   amdgpu_dm_link_supports_replay(ctx->link, ctx->aconnector));
}

/* Tests for amdgpu_dm_link_supports_replay() — no replay mode in VSDB */

static void dm_test_replay_no_vsdb_replay_mode(struct kunit *test)
{
	struct replay_test_ctx *ctx = alloc_replay_ctx(test);

	set_all_replay_caps(ctx);
	ctx->aconnector->vsdb_info.replay_mode = false;

	KUNIT_EXPECT_FALSE(test,
			   amdgpu_dm_link_supports_replay(ctx->link, ctx->aconnector));
}

/* Tests for amdgpu_dm_link_supports_replay() — eDP revision too low */

static void dm_test_replay_edp_rev_too_low(struct kunit *test)
{
	struct replay_test_ctx *ctx = alloc_replay_ctx(test);

	set_all_replay_caps(ctx);
	ctx->link->dpcd_caps.edp_rev = EDP_REVISION_12;

Annotation

Implementation Notes