mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
drm/msm/dp: split msm_dp_ctrl_config_ctrl() into link parts and stream parts
The DP_CONFIGURATION_CTRL register contains both link-level and stream-specific fields. Currently, msm_dp_ctrl_config_ctrl() configures all of them together. Separate the configuration into link parts and stream parts to support MST. Clear the stream-specific fields before OR-ing new values in the stream path to avoid bit accumulation across repeated calls. Signed-off-by: Yongxing Mou <yongxing.mou@oss.qualcomm.com> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> Patchwork: https://patchwork.freedesktop.org/patch/742733/ Link: https://lore.kernel.org/r/20260728-dp_mstclean-v9-4-f7779fce10f4@oss.qualcomm.com Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
This commit is contained in:
parent
1c96c88ec1
commit
7de83c2129
|
|
@ -388,26 +388,48 @@ void msm_dp_ctrl_push_idle(struct msm_dp_ctrl *msm_dp_ctrl)
|
|||
drm_dbg_dp(ctrl->drm_dev, "mainlink off\n");
|
||||
}
|
||||
|
||||
static void msm_dp_ctrl_config_ctrl(struct msm_dp_ctrl_private *ctrl)
|
||||
static void msm_dp_ctrl_config_ctrl_streams(struct msm_dp_ctrl_private *ctrl,
|
||||
struct msm_dp_panel *msm_dp_panel)
|
||||
{
|
||||
u32 config = 0, tbd;
|
||||
|
||||
/*
|
||||
* RMW: called from atomic_enable(), serialized by the DRM atomic framework.
|
||||
* Clear stream-specific fields before OR-ing to avoid bit accumulation.
|
||||
*/
|
||||
config = msm_dp_read_link(ctrl, REG_DP_CONFIGURATION_CTRL);
|
||||
config &= ~(DP_CONFIGURATION_CTRL_RGB_YUV_MASK |
|
||||
DP_CONFIGURATION_CTRL_BPC_MASK |
|
||||
DP_CONFIGURATION_CTRL_SEND_VSC);
|
||||
|
||||
if (msm_dp_panel->msm_dp_mode.out_fmt_is_yuv_420)
|
||||
config |= DP_CONFIGURATION_CTRL_RGB_YUV; /* YUV420 */
|
||||
|
||||
tbd = msm_dp_link_get_test_bits_depth(ctrl->link,
|
||||
msm_dp_panel->msm_dp_mode.bpp);
|
||||
|
||||
config |= tbd << DP_CONFIGURATION_CTRL_BPC_SHIFT;
|
||||
|
||||
if (msm_dp_panel->psr_cap.version)
|
||||
config |= DP_CONFIGURATION_CTRL_SEND_VSC;
|
||||
|
||||
drm_dbg_dp(ctrl->drm_dev, "stream DP_CONFIGURATION_CTRL=0x%x\n", config);
|
||||
|
||||
msm_dp_write_link(ctrl, REG_DP_CONFIGURATION_CTRL, config);
|
||||
}
|
||||
|
||||
static void msm_dp_ctrl_config_ctrl_link(struct msm_dp_ctrl_private *ctrl)
|
||||
{
|
||||
u32 config = 0;
|
||||
const u8 *dpcd = ctrl->panel->dpcd;
|
||||
|
||||
/* Default-> LSCLK DIV: 1/4 LCLK */
|
||||
config |= (2 << DP_CONFIGURATION_CTRL_LSCLK_DIV_SHIFT);
|
||||
|
||||
if (ctrl->panel->msm_dp_mode.out_fmt_is_yuv_420)
|
||||
config |= DP_CONFIGURATION_CTRL_RGB_YUV; /* YUV420 */
|
||||
|
||||
/* Scrambler reset enable */
|
||||
if (drm_dp_alternate_scrambler_reset_cap(dpcd))
|
||||
config |= DP_CONFIGURATION_CTRL_ASSR;
|
||||
|
||||
tbd = msm_dp_link_get_test_bits_depth(ctrl->link,
|
||||
ctrl->panel->msm_dp_mode.bpp);
|
||||
|
||||
config |= tbd << DP_CONFIGURATION_CTRL_BPC_SHIFT;
|
||||
|
||||
/* Num of Lanes */
|
||||
config |= ((ctrl->link->link_params.num_lanes - 1)
|
||||
<< DP_CONFIGURATION_CTRL_NUM_OF_LANES_SHIFT);
|
||||
|
|
@ -421,10 +443,7 @@ static void msm_dp_ctrl_config_ctrl(struct msm_dp_ctrl_private *ctrl)
|
|||
config |= DP_CONFIGURATION_CTRL_STATIC_DYNAMIC_CN;
|
||||
config |= DP_CONFIGURATION_CTRL_SYNC_ASYNC_CLK;
|
||||
|
||||
if (ctrl->panel->psr_cap.version)
|
||||
config |= DP_CONFIGURATION_CTRL_SEND_VSC;
|
||||
|
||||
drm_dbg_dp(ctrl->drm_dev, "DP_CONFIGURATION_CTRL=0x%x\n", config);
|
||||
drm_dbg_dp(ctrl->drm_dev, "link DP_CONFIGURATION_CTRL=0x%x\n", config);
|
||||
|
||||
msm_dp_write_link(ctrl, REG_DP_CONFIGURATION_CTRL, config);
|
||||
}
|
||||
|
|
@ -450,7 +469,8 @@ static void msm_dp_ctrl_configure_source_params(struct msm_dp_ctrl_private *ctrl
|
|||
msm_dp_ctrl_lane_mapping(ctrl);
|
||||
msm_dp_setup_peripheral_flush(ctrl);
|
||||
|
||||
msm_dp_ctrl_config_ctrl(ctrl);
|
||||
msm_dp_ctrl_config_ctrl_link(ctrl);
|
||||
msm_dp_ctrl_config_ctrl_streams(ctrl, ctrl->panel);
|
||||
|
||||
test_bits_depth = msm_dp_link_get_test_bits_depth(ctrl->link, ctrl->panel->msm_dp_mode.bpp);
|
||||
colorimetry_cfg = msm_dp_link_get_colorimetry_config(ctrl->link);
|
||||
|
|
@ -1628,7 +1648,8 @@ static int msm_dp_ctrl_link_train(struct msm_dp_ctrl_private *ctrl,
|
|||
u8 assr;
|
||||
struct msm_dp_link_info link_info = {0};
|
||||
|
||||
msm_dp_ctrl_config_ctrl(ctrl);
|
||||
msm_dp_ctrl_config_ctrl_link(ctrl);
|
||||
msm_dp_ctrl_config_ctrl_streams(ctrl, ctrl->panel);
|
||||
|
||||
link_info.num_lanes = ctrl->link->link_params.num_lanes;
|
||||
link_info.rate = ctrl->link->link_params.rate;
|
||||
|
|
|
|||
|
|
@ -149,8 +149,10 @@
|
|||
#define DP_CONFIGURATION_CTRL_ENHANCED_FRAMING (0x00000040)
|
||||
#define DP_CONFIGURATION_CTRL_SEND_VSC (0x00000080)
|
||||
#define DP_CONFIGURATION_CTRL_BPC (0x00000100)
|
||||
#define DP_CONFIGURATION_CTRL_BPC_MASK GENMASK(9, 8)
|
||||
#define DP_CONFIGURATION_CTRL_ASSR (0x00000400)
|
||||
#define DP_CONFIGURATION_CTRL_RGB_YUV (0x00000800)
|
||||
#define DP_CONFIGURATION_CTRL_RGB_YUV_MASK GENMASK(12, 11)
|
||||
#define DP_CONFIGURATION_CTRL_LSCLK_DIV (0x00002000)
|
||||
#define DP_CONFIGURATION_CTRL_NUM_OF_LANES_SHIFT (0x04)
|
||||
#define DP_CONFIGURATION_CTRL_BPC_SHIFT (0x08)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user