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

Commit 5d2c2f96 authored by Tatenda Chipeperekwa's avatar Tatenda Chipeperekwa
Browse files

drm/msm/hdcp: set hardware key once per session



Set the hardware key only once per session to prevent redundant calls
into the secure layer, and repeatedly notifying the DisplayPort
driver of authentication success.

CRs-Fixed: 2449071
Change-Id: If6db8de27ee61d86308dc3fd4ac48377fbbd24f8
Signed-off-by: default avatarTatenda Chipeperekwa <tatendac@codeaurora.org>
parent b0438fe6
Loading
Loading
Loading
Loading
+32 −27
Original line number Diff line number Diff line
@@ -528,17 +528,27 @@ static void sde_hdcp_2x_initialize_command(struct sde_hdcp_2x_ctrl *hdcp,
		cdata->buf = hdcp->app_data.request.data + 1;
}

static void sde_hdcp_2x_msg_sent(struct sde_hdcp_2x_ctrl *hdcp)
static void sde_hdcp_2x_set_hw_key(struct sde_hdcp_2x_ctrl *hdcp)
{
	int rc;
	struct hdcp_transport_wakeup_data cdata = {
						HDCP_TRANSPORT_CMD_INVALID };
	cdata.context = hdcp->client_data;

	switch (hdcp->app_data.response.data[0]) {
	case SKE_SEND_TYPE_ID:
		if (!hdcp2_app_comm(hdcp->hdcp2_ctx,
				HDCP2_CMD_EN_ENCRYPTION, &hdcp->app_data)) {
	if (hdcp->authenticated) {
		pr_debug("authenticated, h/w key already set\n");
		return;
	}

	rc = hdcp2_app_comm(hdcp->hdcp2_ctx, HDCP2_CMD_SET_HW_KEY,
			&hdcp->app_data);
	if (rc) {
		pr_err("failed to set h/w key: %d\n", rc);
		return;
	}

	hdcp->authenticated = true;
	pr_debug("authenticated\n");

	if (hdcp->force_encryption)
		hdcp2_force_encryption(hdcp->hdcp2_ctx, 1);
@@ -547,6 +557,16 @@ static void sde_hdcp_2x_msg_sent(struct sde_hdcp_2x_ctrl *hdcp)
	sde_hdcp_2x_wakeup_client(hdcp, &cdata);
}

static void sde_hdcp_2x_msg_sent(struct sde_hdcp_2x_ctrl *hdcp)
{
	struct hdcp_transport_wakeup_data cdata = {
						HDCP_TRANSPORT_CMD_INVALID };
	cdata.context = hdcp->client_data;

	switch (hdcp->app_data.response.data[0]) {
	case SKE_SEND_TYPE_ID:
		sde_hdcp_2x_set_hw_key(hdcp);

		/* poll for link check */
		sde_hdcp_2x_initialize_command(hdcp,
				HDCP_TRANSPORT_CMD_LINK_POLL, &cdata);
@@ -743,25 +763,10 @@ static void sde_hdcp_2x_msg_recvd(struct sde_hdcp_2x_ctrl *hdcp)
			if (!rc)
				sde_hdcp_2x_send_message(hdcp);
			goto exit;
		} else if (!hdcp->authenticated) {
			rc = hdcp2_app_comm(hdcp->hdcp2_ctx,
					HDCP2_CMD_EN_ENCRYPTION,
					&hdcp->app_data);
			if (!rc) {
				hdcp->authenticated = true;

				if (hdcp->force_encryption)
					hdcp2_force_encryption(
							hdcp->hdcp2_ctx, 1);

				cdata.cmd = HDCP_TRANSPORT_CMD_STATUS_SUCCESS;
				sde_hdcp_2x_wakeup_client(hdcp, &cdata);
			} else {
				pr_err("failed to enable encryption (%d)\n",
						rc);
			}
		}

		sde_hdcp_2x_set_hw_key(hdcp);

		sde_hdcp_2x_initialize_command(hdcp,
				HDCP_TRANSPORT_CMD_LINK_POLL, &cdata);
		goto exit;
+3 −3
Original line number Diff line number Diff line
@@ -1124,7 +1124,7 @@ static int hdcp2_app_timeout(struct hdcp2_handle *handle)
	return rc;
}

static int hdcp2_app_enable_encryption(struct hdcp2_handle *handle)
static int hdcp2_app_set_hw_key(struct hdcp2_handle *handle)
{
	int rc = 0;

@@ -1249,8 +1249,8 @@ int hdcp2_app_comm(void *ctx, enum hdcp2_app_cmd cmd,
	case HDCP2_CMD_TIMEOUT:
		rc = hdcp2_app_timeout(handle);
		break;
	case HDCP2_CMD_EN_ENCRYPTION:
		rc = hdcp2_app_enable_encryption(handle);
	case HDCP2_CMD_SET_HW_KEY:
		rc = hdcp2_app_set_hw_key(handle);
		break;
	case HDCP2_CMD_QUERY_STREAM:
		rc = hdcp2_app_query_stream(handle);
+3 −3
Original line number Diff line number Diff line
/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -407,7 +407,7 @@ static void mdss_hdcp_2x_msg_sent(struct mdss_hdcp_2x_ctrl *hdcp)
	switch (hdcp->app_data.response.data[0]) {
	case SKE_SEND_TYPE_ID:
		if (!hdcp2_app_comm(hdcp->hdcp2_ctx,
				HDCP2_CMD_EN_ENCRYPTION, &hdcp->app_data)) {
				HDCP2_CMD_SET_HW_KEY, &hdcp->app_data)) {
			hdcp->authenticated = true;

			cdata.cmd = HDCP_TRANSPORT_CMD_STATUS_SUCCESS;
@@ -587,7 +587,7 @@ static void mdss_hdcp_2x_msg_recvd(struct mdss_hdcp_2x_ctrl *hdcp)
	if (msg[0] == REP_STREAM_READY) {
		if (!hdcp->authenticated) {
			rc = hdcp2_app_comm(hdcp->hdcp2_ctx,
					HDCP2_CMD_EN_ENCRYPTION,
					HDCP2_CMD_SET_HW_KEY,
					&hdcp->app_data);
			if (!rc) {
				hdcp->authenticated = true;
+3 −3
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ enum hdcp2_app_cmd {
	HDCP2_CMD_STOP,
	HDCP2_CMD_PROCESS_MSG,
	HDCP2_CMD_TIMEOUT,
	HDCP2_CMD_EN_ENCRYPTION,
	HDCP2_CMD_SET_HW_KEY,
	HDCP2_CMD_QUERY_STREAM,
};

@@ -51,8 +51,8 @@ static inline const char *hdcp2_app_cmd_str(enum hdcp2_app_cmd cmd)
		return HDCP_QSEECOM_ENUM_STR(HDCP2_CMD_PROCESS_MSG);
	case HDCP2_CMD_TIMEOUT:
		return HDCP_QSEECOM_ENUM_STR(HDCP2_CMD_TIMEOUT);
	case HDCP2_CMD_EN_ENCRYPTION:
		return HDCP_QSEECOM_ENUM_STR(HDCP2_CMD_EN_ENCRYPTION);
	case HDCP2_CMD_SET_HW_KEY:
		return HDCP_QSEECOM_ENUM_STR(HDCP2_CMD_SET_HW_KEY);
	case HDCP2_CMD_QUERY_STREAM:
		return HDCP_QSEECOM_ENUM_STR(HDCP2_CMD_QUERY_STREAM);
	default:			return "???";