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

Commit f2aecea1 authored by Ajay Singh Parmar's avatar Ajay Singh Parmar Committed by Sandeep Panda
Browse files

msm: mdss: hdmi: clear ddc line before starting hdcp



Clear DDC line if scrambling and Rx status polling is still
going on. Check for all scrambling and Rx status errors and
stop polling in error cases. This needs to be done before
new hdcp authentication session is started to avoid any
authentication failures because of ddc line being busy.

Change-Id: I90957410172ca206d435a5549d689ada222f84db
Signed-off-by: default avatarAjay Singh Parmar <aparmar@codeaurora.org>
parent c5b91e20
Loading
Loading
Loading
Loading
+2 −7
Original line number Diff line number Diff line
@@ -372,7 +372,6 @@ static int hdmi_hdcp_authentication_part1(struct hdmi_hdcp_ctrl *hdcp_ctrl)
	ddc_data.request_len = 1;
	ddc_data.retry = 5;
	ddc_data.what = "Bcaps";
	ddc_data.no_align = true;

	hdcp_ctrl->init_data.ddc_ctrl->ddc_data = ddc_data;

@@ -574,7 +573,6 @@ static int hdmi_hdcp_authentication_part1(struct hdmi_hdcp_ctrl *hdcp_ctrl)
	ddc_data.request_len = 5;
	ddc_data.retry = 5;
	ddc_data.what = "Bksv";
	ddc_data.no_align = true;

	hdcp_ctrl->init_data.ddc_ctrl->ddc_data = ddc_data;

@@ -649,7 +647,6 @@ static int hdmi_hdcp_authentication_part1(struct hdmi_hdcp_ctrl *hdcp_ctrl)
	ddc_data.request_len = 2;
	ddc_data.retry = 5;
	ddc_data.what = "R0'";
	ddc_data.no_align = true;

	hdcp_ctrl->init_data.ddc_ctrl->ddc_data = ddc_data;

@@ -758,7 +755,6 @@ static int hdmi_hdcp_transfer_v_h(struct hdmi_hdcp_ctrl *hdcp_ctrl)
	ddc_data.request_len = 4;
	ddc_data.retry = 5;
	ddc_data.what = what;
	ddc_data.no_align = true;

	if (hdcp_ctrl->tz_hdcp) {
		memset(scm_buf, 0x00, sizeof(scm_buf));
@@ -888,7 +884,7 @@ static int hdmi_hdcp_authentication_part2(struct hdmi_hdcp_ctrl *hdcp_ctrl)
		ddc_data.request_len = 1;
		ddc_data.retry = 5;
		ddc_data.what = "Bcaps";
		ddc_data.no_align = false;
		ddc_data.retry_align = true;

		hdcp_ctrl->init_data.ddc_ctrl->ddc_data = ddc_data;

@@ -910,7 +906,7 @@ static int hdmi_hdcp_authentication_part2(struct hdmi_hdcp_ctrl *hdcp_ctrl)
	ddc_data.request_len = 2;
	ddc_data.retry = 5;
	ddc_data.what = "Bstatuss";
	ddc_data.no_align = false;
	ddc_data.retry_align = true;

	hdcp_ctrl->init_data.ddc_ctrl->ddc_data = ddc_data;

@@ -1005,7 +1001,6 @@ static int hdmi_hdcp_authentication_part2(struct hdmi_hdcp_ctrl *hdcp_ctrl)
	ddc_data.request_len = ksv_bytes;
	ddc_data.retry = 5;
	ddc_data.what = "KSV FIFO";
	ddc_data.no_align = true;

	hdcp_ctrl->init_data.ddc_ctrl->ddc_data = ddc_data;

+5 −2
Original line number Diff line number Diff line
@@ -233,6 +233,10 @@ static int hdmi_hdcp2p2_authenticate(void *input)
	ctrl->sink_status = SINK_CONNECTED;
	atomic_set(&ctrl->auth_state, HDCP_STATE_AUTHENTICATING);

	/* make sure ddc is idle before starting hdcp 2.2 authentication */
	hdmi_scrambler_ddc_disable(ctrl->init_data.ddc_ctrl);
	hdmi_hdcp2p2_ddc_disable(ctrl->init_data.ddc_ctrl);

	cdata.context = input;
	hdmi_hdcp2p2_wakeup(&cdata);

@@ -431,7 +435,6 @@ static int hdmi_hdcp2p2_ddc_write_message(struct hdmi_hdcp2p2_ctrl *ctrl,
	ddc_data.offset = HDCP_SINK_DDC_HDCP2_WRITE_MESSAGE;
	ddc_data.data_buf = buf;
	ddc_data.data_len = size;
	ddc_data.retry = 1;
	ddc_data.hard_timeout = ctrl->timeout;
	ddc_data.what = "HDCP2WriteMessage";

@@ -800,7 +803,7 @@ static void hdmi_hdcp2p2_link_work(struct kthread_work *work)
		goto exit;
	}

	rc = hdmi_ddc_check_status(ddc_ctrl);
	rc = hdmi_hdcp2p2_ddc_check_status(ddc_ctrl);
	if (rc) {
		cdata.cmd = HDCP_LIB_WKUP_CMD_STOP;
		goto exit;
+1 −1
Original line number Diff line number Diff line
@@ -1394,7 +1394,7 @@ static u32 hdmi_tx_ddc_read(struct hdmi_tx_ddc_ctrl *ddc_ctrl,
			ddc_data.request_len = block_size;
			ddc_data.retry       = 1;
			ddc_data.what        = "EDID";
			ddc_data.no_align    = false;
			ddc_data.retry_align = true;

			ddc_ctrl->ddc_data = ddc_data;

+404 −534

File changed.

Preview size limit exceeded, changes collapsed.

+4 −3
Original line number Diff line number Diff line
@@ -406,7 +406,7 @@ struct hdmi_tx_ddc_data {
	u32 dev_addr;
	u32 offset;
	u32 request_len;
	u32 no_align;
	u32 retry_align;
	u32 hard_timeout;
	u32 timeout_left;
	int retry;
@@ -432,6 +432,7 @@ struct hdmi_tx_hdcp2p2_ddc_data {
	bool ddc_max_retries_fail;
	bool ddc_done;
	bool ddc_read_req;
	bool ddc_timeout;
	int irq_wait_count;
};

@@ -497,10 +498,10 @@ int hdmi_scdc_read(struct hdmi_tx_ddc_ctrl *ctrl, u32 data_type, u32 *val);
int hdmi_scdc_write(struct hdmi_tx_ddc_ctrl *ctrl, u32 data_type, u32 val);
int hdmi_setup_ddc_timers(struct hdmi_tx_ddc_ctrl *ctrl,
			  u32 type, u32 to_in_num_lines);
void hdmi_hdcp2p2_ddc_reset(struct hdmi_tx_ddc_ctrl *ctrl);
void hdmi_scrambler_ddc_disable(struct hdmi_tx_ddc_ctrl *ctrl);
void hdmi_hdcp2p2_ddc_disable(struct hdmi_tx_ddc_ctrl *ctrl);
int hdmi_hdcp2p2_ddc_read_rxstatus(struct hdmi_tx_ddc_ctrl *ctrl, bool wait);
int hdmi_ddc_check_status(struct hdmi_tx_ddc_ctrl *ctrl);
int hdmi_hdcp2p2_ddc_check_status(struct hdmi_tx_ddc_ctrl *ctrl);
int hdmi_utils_get_timeout_in_hysnc(struct msm_hdmi_mode_timing_info *timing,
	u32 timeout_ms);