drm_dp_dpcd_write(9)
π« drm_dp_dpcd_write(9) β the Kernel API Manual, bestie edition π«
Okay so picture this: you're deep in the kernel, you've got a DisplayPort AUX channel, and you just need to shove a bunch of bytes into DPCD. That's literally this function. Welcome to the drm_dp_dpcd_write page from the Kernel API Manual β buckle up, it's a short one but it's giving essential. π¦
β¨ NAME β¨
drm_dp_dpcd_write β write a series of bytes to the DPCD, no cap π
πΈ SYNOPSIS πΈ
ssize_t drm_dp_dpcd_write (struct drm_dp_aux *aux , unsigned int offset
, void *buffer , size_t size );
Look at that signature. Gorgeous. Iconic. Let's break it down. β¨
π ARGUMENTS π
auxβ the DisplayPort AUX channel, and yes it can be SST or MST, both are welcome here π«Άoffsetβ the address of the (first) register you're writing to, like the starting point of your little byte journeybufferβ the buffer holding the values you wanna write, aka the payload, aka the whole pointsizeβ how many bytes are chillin' inbuffer
π DESCRIPTION π
So here's the tea. On success you get back the number of bytes transferred. On failure you get a negative error code β classic.
Let's talk errors, because they matter and I refuse to gloss over them:
-EIOcomes back if the request was NAKed by the sink, or if the retry count was exceeded π-EPROTOcomes back if not all bytes were transferred. Partial transfer? Not on this function's watch.- Errors from the underlying AUX channel transfer function get propagated straight to the caller β with one exception:
-EBUSY, which causes the transaction to be retried instead of being passed along. She's persistent. π
Also, lowkey important: in most of the cases you want to use drm_dp_dpcd_write_data instead. Not me telling you the sequel is better, but likeβ¦ the docs are telling you the sequel is better. π
π₯ SEE ALSO π₯
This list is long and honestly kind of iconic β every single one of these, bestie, no skipping:
Kernel file ./drivers/gpu/drm/display/drm_dp_helper.c dp helpers(9), drm_dp_phy_name(9), drm_dp_lttpr_wake_timeout_setup(9), dp helpers(9), drm_dp_dpcd_probe(9), drm_dp_dpcd_set_powered(9), drm_dp_dpcd_set_probe(9), drm_dp_dpcd_read(9), drm_dp_dpcd_read_link_status(9), drm_dp_dpcd_read_phy_link_status(9), drm_dp_link_power_up(9), drm_dp_link_power_down(9), drm_dp_dpcd_write_payload(9), drm_dp_dpcd_clear_payload(9), drm_dp_dpcd_poll_act_handled(9), drm_dp_downstream_is_type(9), drm_dp_downstream_is_tmds(9), drm_dp_send_real_edid_checksum(9), drm_dp_read_dpcd_caps(9), drm_dp_read_downstream_info(9), drm_dp_downstream_max_dotclock(9), drm_dp_downstream_max_tmds_clock(9), drm_dp_downstream_min_tmds_clock(9), drm_dp_downstream_max_bpc(9), drm_dp_downstream_420_passthrough(9), drm_dp_downstream_444_to_420_conversion(9), drm_dp_downstream_rgb_to_ycbcr_conversion(9), drm_dp_downstream_mode(9), drm_dp_downstream_id(9), drm_dp_downstream_debug(9), drm_dp_subconnector_type(9), drm_dp_set_subconnector_property(9), drm_dp_read_sink_count_cap(9), drm_dp_read_sink_count(9), drm_dp_remote_aux_init(9), drm_dp_aux_init(9), drm_dp_aux_register(9), drm_dp_aux_unregister(9), drm_dp_psr_setup_time(9), drm_dp_start_crc(9), drm_dp_stop_crc(9), drm_dp_read_desc(9), drm_dp_dump_lttpr_desc(9), drm_dp_dsc_sink_bpp_incr(9), drm_dp_dsc_slice_count_to_mask(9), drm_dp_dsc_sink_slice_count_mask(9), drm_dp_dsc_sink_max_slice_count(9), drm_dp_dsc_sink_line_buf_depth(9), drm_dp_dsc_sink_supported_input_bpcs(9), drm_dp_dsc_sink_max_slice_throughput(9), drm_dp_dsc_branch_max_overall_throughput(9), drm_dp_dsc_branch_max_line_width(9), drm_dp_read_lttpr_common_caps(9), drm_dp_read_lttpr_phy_caps(9), drm_dp_lttpr_count(9), drm_dp_lttpr_max_link_rate(9), drm_dp_lttpr_set_transparent_mode(9), drm_dp_lttpr_init(9), drm_dp_lttpr_max_lane_count(9), drm_dp_lttpr_voltage_swing_level_3_supported(9), drm_dp_lttpr_pre_emphasis_level_3_supported(9), drm_dp_get_phy_test_pattern(9), drm_dp_set_phy_test_pattern(9), drm_dp_as_sdp_supported(9), drm_dp_vsc_sdp_supported(9), drm_dp_vsc_sdp_pack(9), drm_dp_get_pcon_max_frl_bw(9), drm_dp_pcon_frl_prepare(9), drm_dp_pcon_is_frl_ready(9), drm_dp_pcon_frl_configure_1(9), drm_dp_pcon_frl_configure_2(9), drm_dp_pcon_reset_frl_config(9), drm_dp_pcon_frl_enable(9), drm_dp_pcon_hdmi_link_active(9), drm_dp_pcon_hdmi_link_mode(9), drm_dp_pcon_hdmi_frl_link_error_count(9), drm_dp_pcon_pps_default(9), drm_dp_pcon_pps_override_buf(9), drm_edp_backlight_set_level(9), drm_edp_backlight_enable(9), drm_edp_backlight_disable(9), drm_edp_backlight_init(9), drm_panel_dp_aux_backlight(9), drm_dp_link_symbol_cycles(9), drm_dp_bw_overhead(9), drm_dp_bw_channel_coding_efficiency(9), drm_dp_max_dprx_data_rate(9)
Like I said. A lot. All of them. Every single one made it in. π
And that's the whole page, bestie! π This lil' cutie lives in ./drivers/gpu/drm/display, it's dated October 2026, and that's the Kernel API Manual signing off. Go write some bytes. Slay. πβ¨
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms