浏览代码

disp: msm: dsi: avoid seamless request for cwb transitions

There are some scenarios where a dfps request
during cwb session will result in cwb
encoder not getting disabled once the cwb
session is over. Add support to fail the
commit if any VRR or dynamic clock change
request is received during CWB transitions
to handle this.

Change-Id: Id3f192f79eac4ad0d7301bd34f7151fec243d685
Signed-off-by: Krishna Manikandan <[email protected]>
Signed-off-by: Satya Rama Aditya Pinapala <[email protected]>
Krishna Manikandan 5 年之前
父节点
当前提交
eaa0b9cc15
共有 1 个文件被更改,包括 18 次插入4 次删除
  1. 18 4
      msm/dsi/dsi_drm.c

+ 18 - 4
msm/dsi/dsi_drm.c

@@ -11,6 +11,7 @@
 #include "sde_connector.h"
 #include "dsi_drm.h"
 #include "sde_trace.h"
+#include "sde_encoder.h"
 
 #define to_dsi_bridge(x)     container_of((x), struct dsi_bridge, base)
 #define to_dsi_state(x)      container_of((x), struct dsi_connector_state, base)
@@ -343,6 +344,8 @@ static bool dsi_bridge_mode_fixup(struct drm_bridge *bridge,
 	struct dsi_display *display;
 	struct dsi_display_mode dsi_mode, cur_dsi_mode, *panel_dsi_mode;
 	struct drm_crtc_state *crtc_state;
+	bool clone_mode = false;
+	struct drm_encoder *encoder;
 
 	crtc_state = container_of(mode, struct drm_crtc_state, mode);
 
@@ -407,6 +410,14 @@ static bool dsi_bridge_mode_fixup(struct drm_bridge *bridge,
 			return false;
 		}
 
+		drm_for_each_encoder(encoder, crtc_state->crtc->dev) {
+			if (encoder->crtc != crtc_state->crtc)
+				continue;
+
+			if (sde_encoder_in_clone_mode(encoder))
+				clone_mode = true;
+		}
+
 		/* No panel mode switch when drm pipeline is changing */
 		if ((dsi_mode.panel_mode != cur_dsi_mode.panel_mode) &&
 			(!(dsi_mode.dsi_mode_flags & DSI_MODE_FLAG_VRR)) &&
@@ -423,13 +434,16 @@ static bool dsi_bridge_mode_fixup(struct drm_bridge *bridge,
 			dsi_mode.dsi_mode_flags |= DSI_MODE_FLAG_DMS;
 	}
 
-	/* Reject seamless transition when active changed */
-	if (crtc_state->active_changed &&
+	/* Reject seamless transition when active/connectors changed */
+	if ((crtc_state->active_changed ||
+		(crtc_state->connectors_changed && clone_mode)) &&
 		((dsi_mode.dsi_mode_flags & DSI_MODE_FLAG_VRR) ||
 		(dsi_mode.dsi_mode_flags & DSI_MODE_FLAG_POMS) ||
 		(dsi_mode.dsi_mode_flags & DSI_MODE_FLAG_DYN_CLK))) {
-		DSI_ERR("seamless upon active changed 0x%x %d\n",
-			dsi_mode.dsi_mode_flags, crtc_state->active_changed);
+		DSI_ERR("seamless on active/conn(%d/%d) changed 0x%x\n",
+			crtc_state->active_changed,
+			crtc_state->connectors_changed,
+			dsi_mode.dsi_mode_flags);
 		return false;
 	}