Skip to content

Commit

Permalink
drm/msm/dp: force link training for display resolution change
Browse files Browse the repository at this point in the history
During display resolution changes display have to be disabled first
followed by display enable with new resolution. This patch force
main link always be retrained during display enable procedure to
simplify implementation instead of manually kicking of irq_hpd
handle.

Changes in v2:
-- set force_link_train flag on DP only (is_edp == false)

Signed-off-by: Kuogee Hsieh <quic_khsieh@quicinc.com>
  • Loading branch information
Kuogee Hsieh authored and intel-lab-lkp committed May 26, 2022
1 parent c4955d9 commit 4281683
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 11 deletions.
6 changes: 3 additions & 3 deletions drivers/gpu/drm/msm/dp/dp_ctrl.c
Expand Up @@ -1552,7 +1552,7 @@ static int dp_ctrl_process_phy_test_request(struct dp_ctrl_private *ctrl)

ret = dp_ctrl_on_link(&ctrl->dp_ctrl);
if (!ret)
ret = dp_ctrl_on_stream(&ctrl->dp_ctrl);
ret = dp_ctrl_on_stream(&ctrl->dp_ctrl, false);
else
DRM_ERROR("failed to enable DP link controller\n");

Expand Down Expand Up @@ -1808,7 +1808,7 @@ static int dp_ctrl_link_retrain(struct dp_ctrl_private *ctrl)
return dp_ctrl_setup_main_link(ctrl, &training_step);
}

int dp_ctrl_on_stream(struct dp_ctrl *dp_ctrl)
int dp_ctrl_on_stream(struct dp_ctrl *dp_ctrl, bool force_link_train)
{
int ret = 0;
bool mainlink_ready = false;
Expand Down Expand Up @@ -1849,7 +1849,7 @@ int dp_ctrl_on_stream(struct dp_ctrl *dp_ctrl)
return 0;
}

if (!dp_ctrl_channel_eq_ok(ctrl))
if (force_link_tarin || !dp_ctrl_channel_eq_ok(ctrl))
dp_ctrl_link_retrain(ctrl);

/* stop txing train pattern to end link training */
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/msm/dp/dp_ctrl.h
Expand Up @@ -21,7 +21,7 @@ struct dp_ctrl {
};

int dp_ctrl_on_link(struct dp_ctrl *dp_ctrl);
int dp_ctrl_on_stream(struct dp_ctrl *dp_ctrl);
int dp_ctrl_on_stream(struct dp_ctrl *dp_ctrl, bool force_link_train);
int dp_ctrl_off_link_stream(struct dp_ctrl *dp_ctrl);
int dp_ctrl_off_link(struct dp_ctrl *dp_ctrl);
int dp_ctrl_off(struct dp_ctrl *dp_ctrl);
Expand Down
15 changes: 8 additions & 7 deletions drivers/gpu/drm/msm/dp/dp_display.c
Expand Up @@ -878,7 +878,7 @@ static int dp_display_enable(struct dp_display_private *dp, u32 data)
return 0;
}

rc = dp_ctrl_on_stream(dp->ctrl);
rc = dp_ctrl_on_stream(dp->ctrl, data);
if (!rc)
dp_display->power_on = true;

Expand Down Expand Up @@ -1665,6 +1665,7 @@ void dp_bridge_enable(struct drm_bridge *drm_bridge)
int rc = 0;
struct dp_display_private *dp_display;
u32 state;
bool force_link_train = false;

dp_display = container_of(dp, struct dp_display_private, dp_display);
if (!dp_display->dp_mode.drm_mode.clock) {
Expand Down Expand Up @@ -1699,10 +1700,14 @@ void dp_bridge_enable(struct drm_bridge *drm_bridge)

state = dp_display->hpd_state;

if (state == ST_DISPLAY_OFF)
if (state == ST_DISPLAY_OFF) {
dp_display_host_phy_init(dp_display);

dp_display_enable(dp_display, 0);
if (!dp->is_edp)
force_link_train = true;
}

dp_display_enable(dp_display, force_link_train);

rc = dp_display_post_enable(dp);
if (rc) {
Expand All @@ -1711,10 +1716,6 @@ void dp_bridge_enable(struct drm_bridge *drm_bridge)
dp_display_unprepare(dp);
}

/* manual kick off plug event to train link */
if (state == ST_DISPLAY_OFF)
dp_add_event(dp_display, EV_IRQ_HPD_INT, 0, 0);

/* completed connection */
dp_display->hpd_state = ST_CONNECTED;

Expand Down

0 comments on commit 4281683

Please sign in to comment.