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.
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
drm/drm_atomic.hdrm/drm_atomic_state_helper.hdrm/drm_atomic_uapi.hdrm/drm_drv.hdrm/drm_edid.hdrm/drm_connector.hdrm/drm_fourcc.hdrm/drm_kunit_helpers.hdrm/drm_managed.hdrm/drm_modeset_helper_vtables.hdrm/drm_print.hdrm/drm_probe_helper.hdrm/display/drm_hdmi_helper.hdrm/display/drm_hdmi_state_helper.h../drm_crtc_internal.hkunit/test.hdrm_kunit_edid.h
Detected Declarations
struct drm_atomic_helper_connector_hdmi_privfunction set_connector_edidfunction accept_infoframe_clear_infoframefunction accept_infoframe_write_infoframefunction reject_connector_tmds_char_rate_validfunction reject_100mhz_connector_tmds_char_rate_validfunction dummy_connector_get_modesfunction dummy_hdmi_connector_resetfunction test_encoder_atomic_enablefunction __connector_hdmi_initfunction drm_kunit_helper_connector_hdmi_initfunction drm_test_check_broadcast_rgb_crtc_mode_changedfunction drm_test_check_broadcast_rgb_crtc_mode_not_changedfunction drm_test_check_broadcast_rgb_auto_cea_modefunction drm_test_check_broadcast_rgb_auto_cea_mode_vic_1function drm_test_check_broadcast_rgb_full_cea_modefunction drm_test_check_broadcast_rgb_full_cea_mode_vic_1function drm_test_check_broadcast_rgb_limited_cea_modefunction drm_test_check_broadcast_rgb_limited_cea_mode_vic_1function drm_test_check_broadcast_rgb_cea_mode_yuv420function check_broadcast_rgb_cea_mode_yuv420_descfunction drm_test_check_output_bpc_crtc_mode_changedfunction drm_test_check_output_bpc_crtc_mode_not_changedfunction drm_test_check_output_bpc_dvifunction drm_test_check_tmds_char_rate_rgb_8bpcfunction drm_test_check_tmds_char_rate_rgb_10bpcfunction drm_test_check_tmds_char_rate_rgb_12bpcfunction drm_test_check_hdmi_funcs_reject_ratefunction drm_test_check_max_tmds_rate_bpc_fallback_rgbfunction drm_test_check_max_tmds_rate_bpc_fallback_yuv420function drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv422function drm_test_check_max_tmds_rate_bpc_fallback_ignore_yuv420function drm_test_check_driver_unsupported_fallback_yuv420function drm_test_check_output_bpc_format_vic_1function drm_test_check_output_bpc_format_driver_rgb_onlyfunction drm_test_check_output_bpc_format_display_rgb_onlyfunction drm_test_check_output_bpc_format_driver_8bpc_onlyfunction drm_test_check_output_bpc_format_display_8bpc_onlyfunction drm_test_check_disable_connectorfunction drm_test_check_broadcast_rgb_valuefunction drm_test_check_bpc_8_valuefunction drm_test_check_bpc_10_valuefunction drm_test_check_bpc_12_valuefunction drm_test_check_format_valuefunction drm_test_check_tmds_char_valuefunction drm_hdmi_connector_mode_validfunction drm_hdmi_connector_mode_validfunction drm_hdmi_connector_mode_valid
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
- Immediate include surface: `drm/drm_atomic.h`, `drm/drm_atomic_state_helper.h`, `drm/drm_atomic_uapi.h`, `drm/drm_drv.h`, `drm/drm_edid.h`, `drm/drm_connector.h`, `drm/drm_fourcc.h`, `drm/drm_kunit_helpers.h`.
- Detected declarations: `struct drm_atomic_helper_connector_hdmi_priv`, `function set_connector_edid`, `function accept_infoframe_clear_infoframe`, `function accept_infoframe_write_infoframe`, `function reject_connector_tmds_char_rate_valid`, `function reject_100mhz_connector_tmds_char_rate_valid`, `function dummy_connector_get_modes`, `function dummy_hdmi_connector_reset`, `function test_encoder_atomic_enable`, `function __connector_hdmi_init`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.