drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c
Extension
.c
Size
93907 bytes
Lines
3145
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_atomic_helper_connector_hdmi_priv {
	struct drm_device drm;
	struct drm_plane *plane;
	struct drm_crtc *crtc;
	struct drm_encoder encoder;
	struct drm_connector connector;

	const void *current_edid;
	size_t current_edid_len;

	int hdmi_update_failures;
};

#define connector_to_priv(c) \
	container_of_const(c, struct drm_atomic_helper_connector_hdmi_priv, connector)

#define encoder_to_priv(e) \
	container_of_const(e, struct drm_atomic_helper_connector_hdmi_priv, encoder)

static struct drm_display_mode *find_preferred_mode(struct drm_connector *connector)
{
	struct drm_device *drm = connector->dev;
	struct drm_display_mode *mode, *preferred;

	mutex_lock(&drm->mode_config.mutex);
	preferred = list_first_entry_or_null(&connector->modes, struct drm_display_mode, head);
	list_for_each_entry(mode, &connector->modes, head)
		if (mode->type & DRM_MODE_TYPE_PREFERRED)
			preferred = mode;
	mutex_unlock(&drm->mode_config.mutex);

	return preferred;
}

static int set_connector_edid(struct kunit *test, struct drm_connector *connector,
			      const void *edid, size_t edid_len)
{
	struct drm_atomic_helper_connector_hdmi_priv *priv =
		connector_to_priv(connector);
	struct drm_device *drm = connector->dev;
	int ret;

	priv->current_edid = edid;
	priv->current_edid_len = edid_len;

	mutex_lock(&drm->mode_config.mutex);
	ret = connector->funcs->fill_modes(connector, 4096, 4096);
	mutex_unlock(&drm->mode_config.mutex);

	return ret;
}

static int accept_infoframe_clear_infoframe(struct drm_connector *connector)
{
	return 0;
}

static int accept_infoframe_write_infoframe(struct drm_connector *connector,
					    const u8 *buffer, size_t len)
{
	return 0;
}

static const struct drm_connector_hdmi_funcs dummy_connector_hdmi_funcs = {
	.avi = {
		.clear_infoframe = accept_infoframe_clear_infoframe,
		.write_infoframe = accept_infoframe_write_infoframe,
	},
	.hdmi = {
		.clear_infoframe = accept_infoframe_clear_infoframe,
		.write_infoframe = accept_infoframe_write_infoframe,
	},
};

static enum drm_mode_status
reject_connector_tmds_char_rate_valid(const struct drm_connector *connector,
				      const struct drm_display_mode *mode,
				      unsigned long long tmds_rate)
{
	return MODE_BAD;
}

static const struct drm_connector_hdmi_funcs reject_connector_hdmi_funcs = {
	.tmds_char_rate_valid	= reject_connector_tmds_char_rate_valid,
	.avi = {
		.clear_infoframe = accept_infoframe_clear_infoframe,
		.write_infoframe = accept_infoframe_write_infoframe,
	},
	.hdmi = {
		.clear_infoframe = accept_infoframe_clear_infoframe,

Annotation

Implementation Notes