[PATCH v5 02/10] drm/bridge: synopsys: Add DW DPTX Controller support library
Dmitry Baryshkov
dmitry.baryshkov at oss.qualcomm.com
Fri Jul 25 08:22:55 PDT 2025
On Wed, Jul 16, 2025 at 06:04:29PM +0800, Andy Yan wrote:
> From: Andy Yan <andy.yan at rock-chips.com>
>
> The DW DP TX Controller is compliant with the DisplayPort Specification
> Version 1.4 with the following features:
>
> * DisplayPort 1.4a
> * Main Link: 1/2/4 lanes
> * Main Link Support 1.62Gbps, 2.7Gbps, 5.4Gbps and 8.1Gbps
> * AUX channel 1Mbps
> * Single Stream Transport(SST)
> * Multistream Transport (MST)
> * Type-C support (alternate mode)
> * HDCP 2.2, HDCP 1.3
> * Supports up to 8/10 bits per color component
> * Supports RBG, YCbCr4:4:4, YCbCr4:2:2, YCbCr4:2:0
> * Pixel clock up to 594MHz
> * I2S, SPDIF audio interface
>
> Add library with common helpers to make it can be shared with
> other SoC.
>
> Signed-off-by: Andy Yan <andy.yan at rock-chips.com>
>
> ---
>
> Changes in v5:
> - Use drm_dp_read_sink_count_cap instead of the private implementation.
>
> Changes in v4:
> - Drop unnecessary header files
> - Switch to devm_drm_bridge_alloc
>
> Changes in v3:
> - Rebase on drm-misc-next
> - Switch to common helpers to power up/down dp link
> - Only pass parameters to phy that should be set
>
> Changes in v2:
> - Fix compile error when build as module
> - Add phy init
> - Only use one dw_dp_link_train_set
> - inline dw_dp_phy_update_vs_emph
> - Use dp_sdp
> - Check return value of drm_modeset_lock
> - Merge code in atomic_pre_enable/mode_fixup to atomic_check
> - Return NULL if can't find a supported output format
> - Fix max_link_rate from plat_data
>
> drivers/gpu/drm/bridge/synopsys/Kconfig | 7 +
> drivers/gpu/drm/bridge/synopsys/Makefile | 1 +
> drivers/gpu/drm/bridge/synopsys/dw-dp.c | 2044 ++++++++++++++++++++++
> include/drm/bridge/dw_dp.h | 20 +
> 4 files changed, 2072 insertions(+)
> create mode 100644 drivers/gpu/drm/bridge/synopsys/dw-dp.c
> create mode 100644 include/drm/bridge/dw_dp.h
> +
> +static int dw_dp_link_parse(struct dw_dp *dp, struct drm_connector *connector)
> +{
> + struct dw_dp_link *link = &dp->link;
> + u8 dpcd;
> + int ret;
> +
> + dw_dp_link_reset(link);
> +
> + ret = drm_dp_read_dpcd_caps(&dp->aux, link->dpcd);
> + if (ret < 0)
> + return ret;
> +
> + drm_dp_read_desc(&dp->aux, &link->desc, drm_dp_is_branch(link->dpcd));
> +
> + if (drm_dp_read_sink_count_cap(connector, link->dpcd, &link->desc)) {
> + ret = drm_dp_read_sink_count(&dp->aux);
> + if (ret < 0)
> + return ret;
> +
> + link->sink_count = ret;
> +
> + /* Dongle connected, but no display */
> + if (!link->sink_count)
> + return -ENODEV;
> + }
> +
> + ret = drm_dp_dpcd_readb(&dp->aux, DP_DPRX_FEATURE_ENUMERATION_LIST, &dpcd);
> + if (ret < 0)
> + return ret;
> +
> + link->vsc_sdp_supported = !!(dpcd & DP_VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED);
drm_dp_vsc_sdp_supported()
> +
> + link->revision = link->dpcd[DP_DPCD_REV];
> + link->rate = min_t(u32, min(dp->plat_data.max_link_rate,
> + dp->phy->attrs.max_link_rate * 100),
> + drm_dp_max_link_rate(link->dpcd));
> + link->lanes = min_t(u8, phy_get_bus_width(dp->phy),
> + drm_dp_max_lane_count(link->dpcd));
> +
> + link->caps.enhanced_framing = drm_dp_enhanced_frame_cap(link->dpcd);
> + link->caps.tps3_supported = drm_dp_tps3_supported(link->dpcd);
> + link->caps.tps4_supported = drm_dp_tps4_supported(link->dpcd);
> + link->caps.fast_training = drm_dp_fast_training_cap(link->dpcd);
> + link->caps.channel_coding = drm_dp_channel_coding_supported(link->dpcd);
> + link->caps.ssc = !!(link->dpcd[DP_MAX_DOWNSPREAD] & DP_MAX_DOWNSPREAD_0_5);
> +
> + return 0;
> +}
> +
--
With best wishes
Dmitry
More information about the Linux-rockchip
mailing list