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 <cbraga@codeaurora.org>
This commit is contained in:
Christopher Braga
2019-04-22 17:06:55 -04:00
parent c24090b2c5
commit 78439dfaf7
3 changed files with 22 additions and 6 deletions

View File

@@ -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)) {

View File

@@ -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;

View File

@@ -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;