Commit 58edb079 authored by Isabel Zhang's avatar Isabel Zhang Committed by Alex Deucher
Browse files

drm/amd/display: Revert change to HDCP display states



[Why]
Change is causing a regression where the OPC app no longer functions
properly.

[How]
Revert the changelist causing the issue.

Signed-off-by: default avatarIsabel Zhang <isabel.zhang@amd.com>
Reviewed-by: default avatarYongqiang Sun <yongqiang.sun@amd.com>
Acked-by: default avatarRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 9941b812
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -328,8 +328,7 @@ enum mod_hdcp_status mod_hdcp_add_display(struct mod_hdcp *hdcp,
	/* add display to connection */
	hdcp->connection.link = *link;
	*display_container = *display;
	status = mod_hdcp_add_display_to_topology(hdcp, display_container);

	status = mod_hdcp_add_display_to_topology(hdcp, display->index);
	if (status != MOD_HDCP_STATUS_SUCCESS)
		goto out;

@@ -375,7 +374,7 @@ enum mod_hdcp_status mod_hdcp_remove_display(struct mod_hdcp *hdcp,
	status = mod_hdcp_remove_display_from_topology(hdcp, index);
	if (status != MOD_HDCP_STATUS_SUCCESS)
		goto out;
	memset(display, 0, sizeof(struct mod_hdcp_display));
	display->state = MOD_HDCP_DISPLAY_INACTIVE;

	/* request authentication when connection is not reset */
	if (current_state(hdcp) != HDCP_UNINITIALIZED)
+22 −6
Original line number Diff line number Diff line
@@ -328,7 +328,7 @@ void mod_hdcp_dump_binary_message(uint8_t *msg, uint32_t msg_size,

/* psp functions */
enum mod_hdcp_status mod_hdcp_add_display_to_topology(
		struct mod_hdcp *hdcp, struct mod_hdcp_display *display);
		struct mod_hdcp *hdcp, uint8_t index);
enum mod_hdcp_status mod_hdcp_remove_display_from_topology(
		struct mod_hdcp *hdcp, uint8_t index);
enum mod_hdcp_status mod_hdcp_hdcp1_create_session(struct mod_hdcp *hdcp);
@@ -503,6 +503,11 @@ static inline uint8_t is_display_active(struct mod_hdcp_display *display)
	return display->state >= MOD_HDCP_DISPLAY_ACTIVE;
}

static inline uint8_t is_display_added(struct mod_hdcp_display *display)
{
	return display->state >= MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED;
}

static inline uint8_t is_display_encryption_enabled(struct mod_hdcp_display *display)
{
	return display->state >= MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED;
@@ -510,23 +515,34 @@ static inline uint8_t is_display_encryption_enabled(struct mod_hdcp_display *dis

static inline uint8_t get_active_display_count(struct mod_hdcp *hdcp)
{
	uint8_t active_count = 0;
	uint8_t added_count = 0;
	uint8_t i;

	for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++)
		if (is_display_active(&hdcp->displays[i]))
			active_count++;
	return active_count;
			added_count++;
	return added_count;
}

static inline uint8_t get_added_display_count(struct mod_hdcp *hdcp)
{
	uint8_t added_count = 0;
	uint8_t i;

	for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++)
		if (is_display_added(&hdcp->displays[i]))
			added_count++;
	return added_count;
}

static inline struct mod_hdcp_display *get_first_active_display(
static inline struct mod_hdcp_display *get_first_added_display(
		struct mod_hdcp *hdcp)
{
	uint8_t i;
	struct mod_hdcp_display *display = NULL;

	for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++)
		if (is_display_active(&hdcp->displays[i])) {
		if (is_display_added(&hdcp->displays[i])) {
			display = &hdcp->displays[i];
			break;
		}
+1 −1
Original line number Diff line number Diff line
@@ -129,7 +129,7 @@ static inline uint8_t get_device_count(struct mod_hdcp *hdcp)
static inline enum mod_hdcp_status check_device_count(struct mod_hdcp *hdcp)
{
	/* device count must be greater than or equal to tracked hdcp displays */
	return (get_device_count(hdcp) < get_active_display_count(hdcp)) ?
	return (get_device_count(hdcp) < get_added_display_count(hdcp)) ?
			MOD_HDCP_STATUS_HDCP1_DEVICE_COUNT_MISMATCH_FAILURE :
			MOD_HDCP_STATUS_SUCCESS;
}
+1 −1
Original line number Diff line number Diff line
@@ -208,7 +208,7 @@ static inline uint8_t get_device_count(struct mod_hdcp *hdcp)
static enum mod_hdcp_status check_device_count(struct mod_hdcp *hdcp)
{
	/* device count must be greater than or equal to tracked hdcp displays */
	return (get_device_count(hdcp) < get_active_display_count(hdcp)) ?
	return (get_device_count(hdcp) < get_added_display_count(hdcp)) ?
			MOD_HDCP_STATUS_HDCP2_DEVICE_COUNT_MISMATCH_FAILURE :
			MOD_HDCP_STATUS_SUCCESS;
}
+22 −17
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ enum mod_hdcp_status mod_hdcp_remove_display_from_topology(

	dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.dtm_shared_buf;

	if (!display || !is_display_active(display))
	if (!display || !is_display_added(display))
		return MOD_HDCP_STATUS_DISPLAY_NOT_FOUND;

	memset(dtm_cmd, 0, sizeof(struct ta_dtm_shared_memory));
@@ -73,21 +73,25 @@ enum mod_hdcp_status mod_hdcp_remove_display_from_topology(
	HDCP_TOP_REMOVE_DISPLAY_TRACE(hdcp, display->index);
 
 	return MOD_HDCP_STATUS_SUCCESS;
 }
 
enum mod_hdcp_status mod_hdcp_add_display_to_topology(
		struct mod_hdcp *hdcp, struct mod_hdcp_display *display)
}
enum mod_hdcp_status mod_hdcp_add_display_to_topology(struct mod_hdcp *hdcp,
						      uint8_t index)
{
	struct psp_context *psp = hdcp->config.psp.handle;
	struct ta_dtm_shared_memory *dtm_cmd;
	struct mod_hdcp_display *display =
			get_active_display_at_index(hdcp, index);
	struct mod_hdcp_link *link = &hdcp->connection.link;

	if (!psp->dtm_context.dtm_initialized) {
		DRM_ERROR("Failed to add display topology, DTM TA is not initialized.");
		display->state = MOD_HDCP_DISPLAY_INACTIVE;
		return MOD_HDCP_STATUS_FAILURE;
	}

	if (!display || is_display_added(display))
		return MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE;

	dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.dtm_shared_buf;

	memset(dtm_cmd, 0, sizeof(struct ta_dtm_shared_memory));
@@ -109,11 +113,10 @@ enum mod_hdcp_status mod_hdcp_add_display_to_topology(

	psp_dtm_invoke(psp, dtm_cmd->cmd_id);

	if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS) {
		display->state = MOD_HDCP_DISPLAY_INACTIVE;
	if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS)
		return MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE;
	}

	display->state = MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED;
	HDCP_TOP_ADD_DISPLAY_TRACE(hdcp, display->index);

	return MOD_HDCP_STATUS_SUCCESS;
@@ -123,7 +126,7 @@ enum mod_hdcp_status mod_hdcp_hdcp1_create_session(struct mod_hdcp *hdcp)
{

	struct psp_context *psp = hdcp->config.psp.handle;
	struct mod_hdcp_display *display = get_first_active_display(hdcp);
	struct mod_hdcp_display *display = get_first_added_display(hdcp);
	struct ta_hdcp_shared_memory *hdcp_cmd;

	if (!psp->hdcp_context.hdcp_initialized) {
@@ -176,7 +179,7 @@ enum mod_hdcp_status mod_hdcp_hdcp1_destroy_session(struct mod_hdcp *hdcp)
		if (is_display_encryption_enabled(
				&hdcp->displays[i])) {
			hdcp->displays[i].state =
								MOD_HDCP_DISPLAY_ACTIVE;
					MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED;
			HDCP_HDCP1_DISABLED_TRACE(hdcp,
					hdcp->displays[i].index);
		}
@@ -228,7 +231,7 @@ enum mod_hdcp_status mod_hdcp_hdcp1_enable_encryption(struct mod_hdcp *hdcp)
{
	struct psp_context *psp = hdcp->config.psp.handle;
	struct ta_hdcp_shared_memory *hdcp_cmd;
	struct mod_hdcp_display *display = get_first_active_display(hdcp);
	struct mod_hdcp_display *display = get_first_added_display(hdcp);

	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
@@ -298,7 +301,8 @@ enum mod_hdcp_status mod_hdcp_hdcp1_enable_dp_stream_encryption(struct mod_hdcp

	for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++) {

		if (hdcp->displays[i].adjust.disable)
		if (hdcp->displays[i].state != MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED ||
		    hdcp->displays[i].adjust.disable)
			continue;

		memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
@@ -360,7 +364,7 @@ enum mod_hdcp_status mod_hdcp_hdcp2_create_session(struct mod_hdcp *hdcp)
{
	struct psp_context *psp = hdcp->config.psp.handle;
	struct ta_hdcp_shared_memory *hdcp_cmd;
	struct mod_hdcp_display *display = get_first_active_display(hdcp);
	struct mod_hdcp_display *display = get_first_added_display(hdcp);

	if (!psp->hdcp_context.hdcp_initialized) {
		DRM_ERROR("Failed to create hdcp session, HDCP TA is not initialized");
@@ -419,7 +423,7 @@ enum mod_hdcp_status mod_hdcp_hdcp2_destroy_session(struct mod_hdcp *hdcp)
		if (is_display_encryption_enabled(
				&hdcp->displays[i])) {
			hdcp->displays[i].state =
								MOD_HDCP_DISPLAY_ACTIVE;
					MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED;
			HDCP_HDCP2_DISABLED_TRACE(hdcp,
					hdcp->displays[i].index);
		}
@@ -658,7 +662,7 @@ enum mod_hdcp_status mod_hdcp_hdcp2_enable_encryption(struct mod_hdcp *hdcp)
{
	struct psp_context *psp = hdcp->config.psp.handle;
	struct ta_hdcp_shared_memory *hdcp_cmd;
	struct mod_hdcp_display *display = get_first_active_display(hdcp);
	struct mod_hdcp_display *display = get_first_added_display(hdcp);

	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
@@ -743,7 +747,8 @@ enum mod_hdcp_status mod_hdcp_hdcp2_enable_dp_stream_encryption(struct mod_hdcp


	for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++) {
		if (hdcp->displays[i].adjust.disable)
		if (hdcp->displays[i].state != MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED ||
		    hdcp->displays[i].adjust.disable)
			continue;
		hdcp_cmd->in_msg.hdcp2_enable_dp_stream_encryption.display_handle = hdcp->displays[i].index;
		hdcp_cmd->in_msg.hdcp2_enable_dp_stream_encryption.session_handle = hdcp->auth.id;
Loading