소스 검색

disp: msm: dp: Update sink sync check to be disabled by default

The DP standard leaves ambiguity to if sink synchronization
will be set before auxiliary protocols such as HDCP are to begin.
Update the dp_display HDCP worker  to check sink sync only if
explicitly instructed to via the new debugfs node 'hdcp_wait_sink_sync'

Change-Id: I4f4d0b14096aa3dc498e47de557de14092d37a58
Signed-off-by: Christopher Braga <[email protected]>
Christopher Braga 6 년 전
부모
커밋
78439dfaf7
3개의 변경된 파일22개의 추가작업 그리고 6개의 파일을 삭제
  1. 10 0
      msm/dp/dp_debug.c
  2. 2 0
      msm/dp/dp_debug.h
  3. 10 6
      msm/dp/dp_display.c

+ 10 - 0
msm/dp/dp_debug.c

@@ -1933,6 +1933,16 @@ static int dp_debug_init(struct dp_debug *dp_debug)
 		goto error_remove_dir;
 	}
 
+	file = debugfs_create_bool("hdcp_wait_sink_sync", 0644, dir,
+			&debug->dp_debug.hdcp_wait_sink_sync);
+
+	if (IS_ERR_OR_NULL(file)) {
+		rc = PTR_ERR(file);
+		pr_err("[%s] debugfs hdcp_wait_sink_sync failed, rc=%d\n",
+		       DEBUG_NAME, rc);
+		goto error_remove_dir;
+	}
+
 	file = debugfs_create_bool("dsc_feature_enable", 0644, dir,
 			&debug->parser->dsc_feature_enable);
 	if (IS_ERR_OR_NULL(file)) {

+ 2 - 0
msm/dp/dp_debug.h

@@ -16,6 +16,7 @@
 /**
  * struct dp_debug
  * @debug_en: specifies whether debug mode enabled
+ * @hdcp_wait_sink_sync: used to wait for sink synchronization before HDCP auth
  * @vdisplay: used to filter out vdisplay value
  * @hdisplay: used to filter out hdisplay value
  * @vrefresh: used to filter out vrefresh value
@@ -28,6 +29,7 @@ struct dp_debug {
 	bool sim_mode;
 	bool psm_enabled;
 	bool hdcp_disabled;
+	bool hdcp_wait_sink_sync;
 	int aspect_ratio;
 	int vdisplay;
 	int hdisplay;

+ 10 - 6
msm/dp/dp_display.c

@@ -324,12 +324,16 @@ static void dp_display_hdcp_cb_work(struct work_struct *work)
 		dp->hdcp_delayed_off = false;
 	}
 
-	drm_dp_dpcd_readb(dp->aux->drm_aux, DP_SINK_STATUS, &sink_status);
-	sink_status &= (DP_RECEIVE_PORT_0_STATUS | DP_RECEIVE_PORT_1_STATUS);
-	if (sink_status < 1) {
-		pr_debug("Sink not synchronized. Queuing again then exiting\n");
-		queue_delayed_work(dp->wq, &dp->hdcp_cb_work, HZ);
-		return;
+	if (dp->debug->hdcp_wait_sink_sync) {
+		drm_dp_dpcd_readb(dp->aux->drm_aux, DP_SINK_STATUS,
+				&sink_status);
+		sink_status &= (DP_RECEIVE_PORT_0_STATUS |
+				DP_RECEIVE_PORT_1_STATUS);
+		if (sink_status < 1) {
+			pr_debug("Sink not synchronized. Queuing again then exiting\n");
+			queue_delayed_work(dp->wq, &dp->hdcp_cb_work, HZ);
+			return;
+		}
 	}
 
 	status = &dp->link->hdcp_status;