drivers/gpu/drm/i915/display/intel_dp.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/i915/display/intel_dp.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/i915/display/intel_dp.c- Extension
.c- Size
- 224984 bytes
- Lines
- 7652
- 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
linux/export.hlinux/i2c.hlinux/iopoll.hlinux/log2.hlinux/math.hlinux/notifier.hlinux/seq_buf.hlinux/slab.hlinux/sort.hlinux/string_helpers.hlinux/timekeeping.hlinux/types.hasm/byteorder.hdrm/display/drm_dp_helper.hdrm/display/drm_dp_tunnel.hdrm/display/drm_dsc_helper.hdrm/display/drm_hdmi_helper.hdrm/drm_atomic_helper.hdrm/drm_crtc.hdrm/drm_edid.hdrm/drm_fixed.hdrm/drm_print.hdrm/drm_probe_helper.hg4x_dp.hintel_alpm.hintel_atomic.hintel_audio.hintel_backlight.hintel_combo_phy_regs.hintel_connector.hintel_crtc.hintel_crtc_state_dump.h
Detected Declarations
function intel_dp_is_edpfunction intel_dp_is_uhbrfunction intel_dp_link_symbol_sizefunction intel_dp_link_symbol_clockfunction max_dprx_ratefunction max_dprx_lane_countfunction intel_dp_set_default_sink_ratesfunction intel_dp_set_dpcd_sink_ratesfunction intel_dp_set_sink_ratesfunction intel_dp_set_default_max_sink_lane_countfunction intel_dp_set_max_sink_lane_countfunction intel_dp_rate_limit_lenfunction intel_dp_common_len_rate_limitfunction intel_dp_common_ratefunction intel_dp_max_common_ratefunction intel_dp_max_source_lane_countfunction intel_dp_set_max_common_lane_countfunction intel_dp_max_common_lane_countfunction forced_lane_countfunction intel_dp_max_lane_countfunction intel_dp_min_lane_countfunction intel_dp_link_bw_overheadfunction intel_dp_link_requiredfunction intel_dp_effective_data_ratefunction intel_dp_max_link_data_ratefunction intel_dp_has_joinerfunction dg2_max_source_ratefunction icl_max_source_ratefunction ehl_max_source_ratefunction mtl_max_source_ratefunction vbt_max_link_ratefunction intel_dp_set_source_ratesfunction intersect_ratesfunction intel_dp_rate_indexfunction intel_dp_link_config_ratefunction intel_dp_link_config_lane_countfunction intel_dp_link_config_bwfunction link_config_cmp_by_bwfunction intel_dp_link_config_initfunction intel_dp_link_config_getfunction intel_dp_link_config_indexfunction intel_dp_set_common_ratesfunction intel_dp_set_common_link_paramsfunction intel_dp_link_params_validfunction intel_dp_mode_to_fec_clockfunction intel_dp_bw_fec_overheadfunction small_joiner_ram_size_bitsfunction align_min_vesa_compressed_bpp_x16
Annotated Snippet
if (drm_dp_lttpr_count(intel_dp->lttpr_common_caps)) {
/* We have a repeater */
if (intel_dp->lttpr_common_caps[0] >= 0x20 &&
intel_dp->lttpr_common_caps[DP_MAIN_LINK_CHANNEL_CODING_PHY_REPEATER -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV] &
DP_PHY_REPEATER_128B132B_SUPPORTED) {
/* Repeater supports 128b/132b, valid UHBR rates */
uhbr_rates &= intel_dp->lttpr_common_caps[DP_PHY_REPEATER_128B132B_RATES -
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
} else {
/* Does not support 128b/132b */
uhbr_rates = 0;
}
}
if (uhbr_rates & DP_UHBR10)
intel_dp->sink_rates[i++] = 1000000;
if (uhbr_rates & DP_UHBR13_5)
intel_dp->sink_rates[i++] = 1350000;
if (uhbr_rates & DP_UHBR20)
intel_dp->sink_rates[i++] = 2000000;
}
intel_dp->num_sink_rates = i;
}
static void intel_dp_set_sink_rates(struct intel_dp *intel_dp)
{
struct intel_display *display = to_intel_display(intel_dp);
struct intel_connector *connector = intel_dp->attached_connector;
struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
struct intel_encoder *encoder = &intel_dig_port->base;
intel_dp_set_dpcd_sink_rates(intel_dp);
if (intel_dp->num_sink_rates)
return;
drm_err(display->drm,
"[CONNECTOR:%d:%s][ENCODER:%d:%s] Invalid DPCD with no link rates, using defaults\n",
connector->base.base.id, connector->base.name,
encoder->base.base.id, encoder->base.name);
intel_dp_set_default_sink_rates(intel_dp);
}
static void intel_dp_set_default_max_sink_lane_count(struct intel_dp *intel_dp)
{
intel_dp->max_sink_lane_count = 1;
}
static void intel_dp_set_max_sink_lane_count(struct intel_dp *intel_dp)
{
struct intel_display *display = to_intel_display(intel_dp);
struct intel_connector *connector = intel_dp->attached_connector;
struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
struct intel_encoder *encoder = &intel_dig_port->base;
intel_dp->max_sink_lane_count = max_dprx_lane_count(intel_dp);
switch (intel_dp->max_sink_lane_count) {
case 1:
case 2:
case 4:
return;
}
drm_err(display->drm,
"[CONNECTOR:%d:%s][ENCODER:%d:%s] Invalid DPCD max lane count (%d), using default\n",
connector->base.base.id, connector->base.name,
encoder->base.base.id, encoder->base.name,
intel_dp->max_sink_lane_count);
intel_dp_set_default_max_sink_lane_count(intel_dp);
}
/* Get length of rates array potentially limited by max_rate. */
static int intel_dp_rate_limit_len(const int *rates, int len, int max_rate)
{
int i;
/* Limit results by potentially reduced max rate */
for (i = 0; i < len; i++) {
if (rates[len - i - 1] <= max_rate)
return len - i;
}
return 0;
}
Annotation
- Immediate include surface: `linux/export.h`, `linux/i2c.h`, `linux/iopoll.h`, `linux/log2.h`, `linux/math.h`, `linux/notifier.h`, `linux/seq_buf.h`, `linux/slab.h`.
- Detected declarations: `function intel_dp_is_edp`, `function intel_dp_is_uhbr`, `function intel_dp_link_symbol_size`, `function intel_dp_link_symbol_clock`, `function max_dprx_rate`, `function max_dprx_lane_count`, `function intel_dp_set_default_sink_rates`, `function intel_dp_set_dpcd_sink_rates`, `function intel_dp_set_sink_rates`, `function intel_dp_set_default_max_sink_lane_count`.
- 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.