Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 68711c21 authored by Govinda Rajulu Chenna's avatar Govinda Rajulu Chenna Committed by Gerrit - the friendly Code Review server
Browse files

drm/msm/dp: update stream on sequence in mst mode



Moving ctrl state to SEND_VIDEO before stream ch allocation
causes the controller to enter into bad state in mst mode.
This change corrects the programming sequence as per the hw
recommendation.

CRs-Fixed: 2280286
Change-Id: I249bbc3403c137df58b6bbbec80eb554422c6351
Signed-off-by: default avatarGovinda Rajulu Chenna <gchenna@codeaurora.org>
parent cf2cba72
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@
#define DP_INTR_MASK2		(DP_INTERRUPT_STATUS2 << 2)

#define DP_INTERRUPT_STATUS5 \
	(DP_INTR_MST_DP0_VCPF_SENT | DP_INTR_MST_DP0_VCPF_SENT)
	(DP_INTR_MST_DP0_VCPF_SENT | DP_INTR_MST_DP1_VCPF_SENT)

#define DP_INTR_MASK5		(DP_INTERRUPT_STATUS5 << 2)

+25 −24
Original line number Diff line number Diff line
@@ -666,7 +666,6 @@ static int dp_ctrl_link_maintenance(struct dp_ctrl *dp_ctrl)
{
	int ret = 0;
	struct dp_ctrl_private *ctrl;
	bool mainlink_ready = false;

	if (!dp_ctrl) {
		pr_err("Invalid input data\n");
@@ -684,7 +683,6 @@ static int dp_ctrl_link_maintenance(struct dp_ctrl *dp_ctrl)
	ctrl->aux->state &= ~DP_STATE_LINK_MAINTENANCE_FAILED;
	ctrl->aux->state |= DP_STATE_LINK_MAINTENANCE_STARTED;

	ctrl->dp_ctrl.push_idle(&ctrl->dp_ctrl, DP_STREAM_0);
	ctrl->dp_ctrl.reset(&ctrl->dp_ctrl);

	do {
@@ -716,14 +714,6 @@ static int dp_ctrl_link_maintenance(struct dp_ctrl *dp_ctrl)
		ret = dp_ctrl_setup_main_link(ctrl, true);
	} while (ret == -EAGAIN);

	ctrl->panel->hw_cfg(ctrl->panel);

	ctrl->catalog->state_ctrl(ctrl->catalog, ST_SEND_VIDEO);

	dp_ctrl_wait4video_ready(ctrl);
	mainlink_ready = ctrl->catalog->mainlink_ready(ctrl->catalog);
	pr_debug("mainlink %s\n", mainlink_ready ? "READY" : "NOT READY");

	ctrl->aux->state &= ~DP_STATE_LINK_MAINTENANCE_STARTED;

	if (ret)
@@ -919,11 +909,30 @@ static void dp_ctrl_mst_calculate_rg(struct dp_ctrl_private *ctrl,
	pr_debug("x_int: %d, y_frac_enum: %d\n", x_int, y_frac_enum);
}

static int dp_ctrl_mst_send_act(struct dp_ctrl_private *ctrl)
{
	bool act_complete;

	if (!ctrl->mst_mode)
		return 0;

	ctrl->catalog->trigger_act(ctrl->catalog);
	msleep(20); /* needs 1 frame time */

	ctrl->catalog->read_act_complete_sts(ctrl->catalog, &act_complete);

	if (!act_complete)
		pr_err("mst act trigger complete failed\n");
	else
		DP_MST_DEBUG("mst ACT trigger complete SUCCESS\n");

	return 0;
}

static int dp_ctrl_mst_stream_setup(struct dp_ctrl_private *ctrl,
		struct dp_panel *panel)
{
	u32 x_int, y_frac_enum, lanes, bw_code;
	bool act_complete;

	if (!ctrl->mst_mode)
		return 0;
@@ -950,16 +959,6 @@ static int dp_ctrl_mst_stream_setup(struct dp_ctrl_private *ctrl,
	DP_MST_DEBUG("mst lane_cnt:%d, bw:%d, x_int:%d, y_frac:%d\n",
			lanes, bw_code, x_int, y_frac_enum);

	ctrl->catalog->trigger_act(ctrl->catalog);
	msleep(20); /* needs 1 frame time */

	ctrl->catalog->read_act_complete_sts(ctrl->catalog, &act_complete);

	if (!act_complete)
		pr_err("mst act trigger complete failed\n");
	else
		DP_MST_DEBUG("mst ACT trigger complete SUCCESS\n");

	return 0;
}

@@ -988,14 +987,16 @@ static int dp_ctrl_stream_on(struct dp_ctrl *dp_ctrl, struct dp_panel *panel)

	rc = panel->hw_cfg(panel);
	if (rc)
		goto error;

	dp_ctrl_send_video(ctrl);
		return rc;

	rc = dp_ctrl_mst_stream_setup(ctrl, panel);
	if (rc)
		goto error;

	dp_ctrl_send_video(ctrl);

	dp_ctrl_mst_send_act(ctrl);

	rc = dp_ctrl_wait4video_ready(ctrl);
	if (rc)
		goto error;
+3 −0
Original line number Diff line number Diff line
@@ -1266,6 +1266,9 @@ static int dp_display_prepare(struct dp_display *dp_display, void *panel)
	if (atomic_read(&dp->aborted))
		goto end;

	if (dp->power_on)
		goto end;

	dp->aux->init(dp->aux, dp->parser->aux_cfg);

	if (dp->debug->psm_enabled) {