Home | History | Annotate | Line # | Download | only in hdcp
      1 /*	$NetBSD: amdgpu_hdcp_psp.c,v 1.2 2021/12/18 23:45:07 riastradh Exp $	*/
      2 
      3 /*
      4  * Copyright 2018 Advanced Micro Devices, Inc.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included in
     14  * all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     22  * OTHER DEALINGS IN THE SOFTWARE.
     23  *
     24  * Authors: AMD
     25  *
     26  */
     27 
     28 #include <sys/cdefs.h>
     29 __KERNEL_RCSID(0, "$NetBSD: amdgpu_hdcp_psp.c,v 1.2 2021/12/18 23:45:07 riastradh Exp $");
     30 
     31 #define MAX_NUM_DISPLAYS 24
     32 
     33 
     34 #include "hdcp.h"
     35 
     36 #include "amdgpu.h"
     37 #include "hdcp_psp.h"
     38 
     39 static void hdcp2_message_init(struct mod_hdcp *hdcp,
     40 			       struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *in)
     41 {
     42 	in->session_handle = hdcp->auth.id;
     43 	in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__NULL_MESSAGE;
     44 	in->prepare.msg2_id = TA_HDCP_HDCP2_MSG_ID__NULL_MESSAGE;
     45 	in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__NULL_MESSAGE;
     46 	in->process.msg1_desc.msg_size = 0;
     47 	in->process.msg2_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__NULL_MESSAGE;
     48 	in->process.msg2_desc.msg_size = 0;
     49 	in->process.msg3_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__NULL_MESSAGE;
     50 	in->process.msg3_desc.msg_size = 0;
     51 }
     52 enum mod_hdcp_status mod_hdcp_remove_display_topology(struct mod_hdcp *hdcp)
     53 {
     54 
     55 	struct psp_context *psp = hdcp->config.psp.handle;
     56 	struct ta_dtm_shared_memory *dtm_cmd;
     57 	struct mod_hdcp_display *display = NULL;
     58 	uint8_t i;
     59 
     60 	dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.dtm_shared_buf;
     61 
     62 	for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++) {
     63 		if (is_display_added(&(hdcp->connection.displays[i]))) {
     64 
     65 			memset(dtm_cmd, 0, sizeof(struct ta_dtm_shared_memory));
     66 
     67 			display = &hdcp->connection.displays[i];
     68 
     69 			dtm_cmd->cmd_id = TA_DTM_COMMAND__TOPOLOGY_UPDATE_V2;
     70 			dtm_cmd->dtm_in_message.topology_update_v2.display_handle = display->index;
     71 			dtm_cmd->dtm_in_message.topology_update_v2.is_active = 0;
     72 			dtm_cmd->dtm_status = TA_DTM_STATUS__GENERIC_FAILURE;
     73 
     74 			psp_dtm_invoke(psp, dtm_cmd->cmd_id);
     75 
     76 			if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS)
     77 				return MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE;
     78 
     79 			display->state = MOD_HDCP_DISPLAY_ACTIVE;
     80 			HDCP_TOP_REMOVE_DISPLAY_TRACE(hdcp, display->index);
     81 		}
     82 	}
     83 
     84 	return MOD_HDCP_STATUS_SUCCESS;
     85 }
     86 
     87 enum mod_hdcp_status mod_hdcp_add_display_topology(struct mod_hdcp *hdcp)
     88 {
     89 	struct psp_context *psp = hdcp->config.psp.handle;
     90 	struct ta_dtm_shared_memory *dtm_cmd;
     91 	struct mod_hdcp_display *display = NULL;
     92 	struct mod_hdcp_link *link = &hdcp->connection.link;
     93 	uint8_t i;
     94 
     95 	if (!psp->dtm_context.dtm_initialized) {
     96 		DRM_ERROR("Failed to add display topology, DTM TA is not initialized.");
     97 		return MOD_HDCP_STATUS_FAILURE;
     98 	}
     99 
    100 	dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.dtm_shared_buf;
    101 
    102 	for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++) {
    103 		if (hdcp->connection.displays[i].state == MOD_HDCP_DISPLAY_ACTIVE) {
    104 			display = &hdcp->connection.displays[i];
    105 
    106 			memset(dtm_cmd, 0, sizeof(struct ta_dtm_shared_memory));
    107 
    108 			dtm_cmd->cmd_id = TA_DTM_COMMAND__TOPOLOGY_UPDATE_V2;
    109 			dtm_cmd->dtm_in_message.topology_update_v2.display_handle = display->index;
    110 			dtm_cmd->dtm_in_message.topology_update_v2.is_active = 1;
    111 			dtm_cmd->dtm_in_message.topology_update_v2.controller = display->controller;
    112 			dtm_cmd->dtm_in_message.topology_update_v2.ddc_line = link->ddc_line;
    113 			dtm_cmd->dtm_in_message.topology_update_v2.dig_be = link->dig_be;
    114 			dtm_cmd->dtm_in_message.topology_update_v2.dig_fe = display->dig_fe;
    115 			dtm_cmd->dtm_in_message.topology_update_v2.dp_mst_vcid = display->vc_id;
    116 			dtm_cmd->dtm_in_message.topology_update_v2.max_hdcp_supported_version =
    117 				TA_DTM_HDCP_VERSION_MAX_SUPPORTED__2_2;
    118 			dtm_cmd->dtm_status = TA_DTM_STATUS__GENERIC_FAILURE;
    119 
    120 			psp_dtm_invoke(psp, dtm_cmd->cmd_id);
    121 
    122 			if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS)
    123 				return MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE;
    124 
    125 			display->state = MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED;
    126 			HDCP_TOP_ADD_DISPLAY_TRACE(hdcp, display->index);
    127 		}
    128 	}
    129 
    130 	return MOD_HDCP_STATUS_SUCCESS;
    131 }
    132 
    133 enum mod_hdcp_status mod_hdcp_hdcp1_create_session(struct mod_hdcp *hdcp)
    134 {
    135 
    136 	struct psp_context *psp = hdcp->config.psp.handle;
    137 	struct mod_hdcp_display *display = get_first_added_display(hdcp);
    138 	struct ta_hdcp_shared_memory *hdcp_cmd;
    139 
    140 	if (!psp->hdcp_context.hdcp_initialized) {
    141 		DRM_ERROR("Failed to create hdcp session. HDCP TA is not initialized.");
    142 		return MOD_HDCP_STATUS_FAILURE;
    143 	}
    144 
    145 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    146 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    147 
    148 	hdcp_cmd->in_msg.hdcp1_create_session.display_handle = display->index;
    149 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_CREATE_SESSION;
    150 
    151 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    152 
    153 	hdcp->auth.id = hdcp_cmd->out_msg.hdcp1_create_session.session_handle;
    154 
    155 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    156 		return MOD_HDCP_STATUS_HDCP1_CREATE_SESSION_FAILURE;
    157 
    158 	hdcp->auth.msg.hdcp1.ainfo = hdcp_cmd->out_msg.hdcp1_create_session.ainfo_primary;
    159 	memcpy(hdcp->auth.msg.hdcp1.aksv, hdcp_cmd->out_msg.hdcp1_create_session.aksv_primary,
    160 		sizeof(hdcp->auth.msg.hdcp1.aksv));
    161 	memcpy(hdcp->auth.msg.hdcp1.an, hdcp_cmd->out_msg.hdcp1_create_session.an_primary,
    162 		sizeof(hdcp->auth.msg.hdcp1.an));
    163 
    164 	return MOD_HDCP_STATUS_SUCCESS;
    165 }
    166 
    167 enum mod_hdcp_status mod_hdcp_hdcp1_destroy_session(struct mod_hdcp *hdcp)
    168 {
    169 
    170 	struct psp_context *psp = hdcp->config.psp.handle;
    171 	struct ta_hdcp_shared_memory *hdcp_cmd;
    172 
    173 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    174 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    175 
    176 	hdcp_cmd->in_msg.hdcp1_destroy_session.session_handle = hdcp->auth.id;
    177 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_DESTROY_SESSION;
    178 
    179 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    180 
    181 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    182 		return MOD_HDCP_STATUS_HDCP1_DESTROY_SESSION_FAILURE;
    183 
    184 	HDCP_TOP_HDCP1_DESTROY_SESSION_TRACE(hdcp);
    185 
    186 	return MOD_HDCP_STATUS_SUCCESS;
    187 }
    188 
    189 enum mod_hdcp_status mod_hdcp_hdcp1_validate_rx(struct mod_hdcp *hdcp)
    190 {
    191 	struct psp_context *psp = hdcp->config.psp.handle;
    192 	struct ta_hdcp_shared_memory *hdcp_cmd;
    193 
    194 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    195 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    196 
    197 	hdcp_cmd->in_msg.hdcp1_first_part_authentication.session_handle = hdcp->auth.id;
    198 
    199 	memcpy(hdcp_cmd->in_msg.hdcp1_first_part_authentication.bksv_primary, hdcp->auth.msg.hdcp1.bksv,
    200 		TA_HDCP__HDCP1_KSV_SIZE);
    201 
    202 	hdcp_cmd->in_msg.hdcp1_first_part_authentication.r0_prime_primary = hdcp->auth.msg.hdcp1.r0p;
    203 	hdcp_cmd->in_msg.hdcp1_first_part_authentication.bcaps = hdcp->auth.msg.hdcp1.bcaps;
    204 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_FIRST_PART_AUTHENTICATION;
    205 
    206 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    207 
    208 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    209 		return MOD_HDCP_STATUS_HDCP1_VALIDATE_RX_FAILURE;
    210 
    211 	if (hdcp_cmd->out_msg.hdcp1_first_part_authentication.authentication_status ==
    212 	    TA_HDCP_AUTHENTICATION_STATUS__HDCP1_FIRST_PART_COMPLETE) {
    213 		/* needs second part of authentication */
    214 		hdcp->connection.is_repeater = 1;
    215 	} else if (hdcp_cmd->out_msg.hdcp1_first_part_authentication.authentication_status ==
    216 		   TA_HDCP_AUTHENTICATION_STATUS__HDCP1_AUTHENTICATED) {
    217 		hdcp->connection.is_repeater = 0;
    218 	} else
    219 		return MOD_HDCP_STATUS_HDCP1_VALIDATE_RX_FAILURE;
    220 
    221 
    222 	return MOD_HDCP_STATUS_SUCCESS;
    223 }
    224 
    225 enum mod_hdcp_status mod_hdcp_hdcp1_enable_encryption(struct mod_hdcp *hdcp)
    226 {
    227 	struct psp_context *psp = hdcp->config.psp.handle;
    228 	struct ta_hdcp_shared_memory *hdcp_cmd;
    229 	struct mod_hdcp_display *display = get_first_added_display(hdcp);
    230 
    231 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    232 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    233 
    234 	hdcp_cmd->in_msg.hdcp1_enable_encryption.session_handle = hdcp->auth.id;
    235 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_ENABLE_ENCRYPTION;
    236 
    237 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    238 
    239 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    240 		return MOD_HDCP_STATUS_HDCP1_ENABLE_ENCRYPTION;
    241 
    242 	if (!is_dp_mst_hdcp(hdcp)) {
    243 		display->state = MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED;
    244 		HDCP_HDCP1_ENABLED_TRACE(hdcp, display->index);
    245 	}
    246 	return MOD_HDCP_STATUS_SUCCESS;
    247 }
    248 
    249 enum mod_hdcp_status mod_hdcp_hdcp1_validate_ksvlist_vp(struct mod_hdcp *hdcp)
    250 {
    251 	struct psp_context *psp = hdcp->config.psp.handle;
    252 	struct ta_hdcp_shared_memory *hdcp_cmd;
    253 
    254 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    255 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    256 
    257 	hdcp_cmd->in_msg.hdcp1_second_part_authentication.session_handle = hdcp->auth.id;
    258 
    259 	hdcp_cmd->in_msg.hdcp1_second_part_authentication.ksv_list_size = hdcp->auth.msg.hdcp1.ksvlist_size;
    260 	memcpy(hdcp_cmd->in_msg.hdcp1_second_part_authentication.ksv_list, hdcp->auth.msg.hdcp1.ksvlist,
    261 	       hdcp->auth.msg.hdcp1.ksvlist_size);
    262 
    263 	memcpy(hdcp_cmd->in_msg.hdcp1_second_part_authentication.v_prime, hdcp->auth.msg.hdcp1.vp,
    264 	       sizeof(hdcp->auth.msg.hdcp1.vp));
    265 
    266 	hdcp_cmd->in_msg.hdcp1_second_part_authentication.bstatus_binfo =
    267 		is_dp_hdcp(hdcp) ? hdcp->auth.msg.hdcp1.binfo_dp : hdcp->auth.msg.hdcp1.bstatus;
    268 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_SECOND_PART_AUTHENTICATION;
    269 
    270 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    271 
    272 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    273 		return MOD_HDCP_STATUS_HDCP1_VALIDATE_KSV_LIST_FAILURE;
    274 
    275 	return MOD_HDCP_STATUS_SUCCESS;
    276 }
    277 
    278 enum mod_hdcp_status mod_hdcp_hdcp1_enable_dp_stream_encryption(struct mod_hdcp *hdcp)
    279 {
    280 
    281 	struct psp_context *psp = hdcp->config.psp.handle;
    282 	struct ta_hdcp_shared_memory *hdcp_cmd;
    283 	int i = 0;
    284 
    285 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    286 
    287 	for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++) {
    288 
    289 		if (hdcp->connection.displays[i].state != MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED ||
    290 		    hdcp->connection.displays[i].adjust.disable)
    291 			continue;
    292 
    293 		memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    294 
    295 		hdcp_cmd->in_msg.hdcp1_enable_dp_stream_encryption.session_handle = hdcp->auth.id;
    296 		hdcp_cmd->in_msg.hdcp1_enable_dp_stream_encryption.display_handle = hdcp->connection.displays[i].index;
    297 		hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_ENABLE_DP_STREAM_ENCRYPTION;
    298 
    299 		psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    300 
    301 		if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    302 			return MOD_HDCP_STATUS_HDCP1_ENABLE_STREAM_ENCRYPTION_FAILURE;
    303 
    304 		hdcp->connection.displays[i].state = MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED;
    305 		HDCP_HDCP1_ENABLED_TRACE(hdcp, hdcp->connection.displays[i].index);
    306 	}
    307 
    308 	return MOD_HDCP_STATUS_SUCCESS;
    309 }
    310 
    311 enum mod_hdcp_status mod_hdcp_hdcp1_link_maintenance(struct mod_hdcp *hdcp)
    312 {
    313 	struct psp_context *psp = hdcp->config.psp.handle;
    314 	struct ta_hdcp_shared_memory *hdcp_cmd;
    315 
    316 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    317 
    318 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    319 
    320 	hdcp_cmd->in_msg.hdcp1_get_encryption_status.session_handle = hdcp->auth.id;
    321 
    322 	hdcp_cmd->out_msg.hdcp1_get_encryption_status.protection_level = 0;
    323 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_GET_ENCRYPTION_STATUS;
    324 
    325 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    326 
    327 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    328 		return MOD_HDCP_STATUS_HDCP1_LINK_MAINTENANCE_FAILURE;
    329 
    330 	return (hdcp_cmd->out_msg.hdcp1_get_encryption_status.protection_level == 1)
    331 		       ? MOD_HDCP_STATUS_SUCCESS
    332 		       : MOD_HDCP_STATUS_HDCP1_LINK_MAINTENANCE_FAILURE;
    333 }
    334 
    335 enum mod_hdcp_status mod_hdcp_hdcp1_get_link_encryption_status(struct mod_hdcp *hdcp,
    336 							       enum mod_hdcp_encryption_status *encryption_status)
    337 {
    338 	*encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF;
    339 
    340 	if (mod_hdcp_hdcp1_link_maintenance(hdcp) != MOD_HDCP_STATUS_SUCCESS)
    341 		return MOD_HDCP_STATUS_FAILURE;
    342 
    343 	*encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP1_ON;
    344 
    345 	return MOD_HDCP_STATUS_SUCCESS;
    346 }
    347 
    348 enum mod_hdcp_status mod_hdcp_hdcp2_create_session(struct mod_hdcp *hdcp)
    349 {
    350 	struct psp_context *psp = hdcp->config.psp.handle;
    351 	struct ta_hdcp_shared_memory *hdcp_cmd;
    352 	struct mod_hdcp_display *display = get_first_added_display(hdcp);
    353 
    354 	if (!psp->hdcp_context.hdcp_initialized) {
    355 		DRM_ERROR("Failed to create hdcp session, HDCP TA is not initialized");
    356 		return MOD_HDCP_STATUS_FAILURE;
    357 	}
    358 
    359 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    360 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    361 
    362 	if (!display)
    363 		return MOD_HDCP_STATUS_DISPLAY_NOT_FOUND;
    364 
    365 	hdcp_cmd->in_msg.hdcp2_create_session_v2.display_handle = display->index;
    366 
    367 	if (hdcp->connection.link.adjust.hdcp2.force_type == MOD_HDCP_FORCE_TYPE_0)
    368 		hdcp_cmd->in_msg.hdcp2_create_session_v2.negotiate_content_type =
    369 			TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__FORCE_TYPE0;
    370 	else if (hdcp->connection.link.adjust.hdcp2.force_type == MOD_HDCP_FORCE_TYPE_1)
    371 		hdcp_cmd->in_msg.hdcp2_create_session_v2.negotiate_content_type =
    372 			TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__FORCE_TYPE1;
    373 	else if (hdcp->connection.link.adjust.hdcp2.force_type == MOD_HDCP_FORCE_TYPE_MAX)
    374 		hdcp_cmd->in_msg.hdcp2_create_session_v2.negotiate_content_type =
    375 			TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__MAX_SUPPORTED;
    376 
    377 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_CREATE_SESSION_V2;
    378 
    379 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    380 
    381 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    382 		return MOD_HDCP_STATUS_HDCP2_CREATE_SESSION_FAILURE;
    383 
    384 	hdcp->auth.id = hdcp_cmd->out_msg.hdcp2_create_session_v2.session_handle;
    385 
    386 	return MOD_HDCP_STATUS_SUCCESS;
    387 }
    388 
    389 enum mod_hdcp_status mod_hdcp_hdcp2_destroy_session(struct mod_hdcp *hdcp)
    390 {
    391 	struct psp_context *psp = hdcp->config.psp.handle;
    392 	struct ta_hdcp_shared_memory *hdcp_cmd;
    393 
    394 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    395 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    396 
    397 	hdcp_cmd->in_msg.hdcp2_destroy_session.session_handle = hdcp->auth.id;
    398 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_DESTROY_SESSION;
    399 
    400 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    401 
    402 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    403 		return MOD_HDCP_STATUS_HDCP2_DESTROY_SESSION_FAILURE;
    404 
    405 	HDCP_TOP_HDCP2_DESTROY_SESSION_TRACE(hdcp);
    406 
    407 	return MOD_HDCP_STATUS_SUCCESS;
    408 }
    409 
    410 enum mod_hdcp_status mod_hdcp_hdcp2_prepare_ake_init(struct mod_hdcp *hdcp)
    411 {
    412 	struct psp_context *psp = hdcp->config.psp.handle;
    413 	struct ta_hdcp_shared_memory *hdcp_cmd;
    414 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
    415 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
    416 
    417 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    418 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    419 
    420 	msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
    421 	msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
    422 
    423 	hdcp2_message_init(hdcp, msg_in);
    424 
    425 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
    426 	msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__AKE_INIT;
    427 
    428 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    429 
    430 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    431 		return MOD_HDCP_STATUS_HDCP2_PREP_AKE_INIT_FAILURE;
    432 
    433 	memcpy(&hdcp->auth.msg.hdcp2.ake_init[0], &msg_out->prepare.transmitter_message[0],
    434 	       sizeof(hdcp->auth.msg.hdcp2.ake_init));
    435 
    436 	return MOD_HDCP_STATUS_SUCCESS;
    437 }
    438 
    439 enum mod_hdcp_status mod_hdcp_hdcp2_validate_ake_cert(struct mod_hdcp *hdcp)
    440 {
    441 	struct psp_context *psp = hdcp->config.psp.handle;
    442 	struct ta_hdcp_shared_memory *hdcp_cmd;
    443 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
    444 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
    445 
    446 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    447 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    448 
    449 	msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
    450 	msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
    451 
    452 	hdcp2_message_init(hdcp, msg_in);
    453 
    454 	msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__AKE_SEND_CERT;
    455 	msg_in->process.msg1_desc.msg_size = TA_HDCP_HDCP2_MSG_ID_MAX_SIZE__AKE_SEND_CERT;
    456 
    457 	memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.ake_cert,
    458 	       sizeof(hdcp->auth.msg.hdcp2.ake_cert));
    459 
    460 	msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__AKE_NO_STORED_KM;
    461 	msg_in->prepare.msg2_id = TA_HDCP_HDCP2_MSG_ID__AKE_STORED_KM;
    462 
    463 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
    464 
    465 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    466 
    467 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    468 		return MOD_HDCP_STATUS_HDCP2_VALIDATE_AKE_CERT_FAILURE;
    469 
    470 	memcpy(hdcp->auth.msg.hdcp2.ake_no_stored_km, &msg_out->prepare.transmitter_message[0],
    471 	       sizeof(hdcp->auth.msg.hdcp2.ake_no_stored_km));
    472 
    473 	memcpy(hdcp->auth.msg.hdcp2.ake_stored_km,
    474 	       &msg_out->prepare.transmitter_message[sizeof(hdcp->auth.msg.hdcp2.ake_no_stored_km)],
    475 	       sizeof(hdcp->auth.msg.hdcp2.ake_stored_km));
    476 
    477 	if (msg_out->process.msg1_status == TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS) {
    478 		hdcp->connection.is_km_stored = msg_out->process.is_km_stored ? 1 : 0;
    479 		hdcp->connection.is_repeater = msg_out->process.is_repeater ? 1 : 0;
    480 		return MOD_HDCP_STATUS_SUCCESS;
    481 	}
    482 
    483 	return MOD_HDCP_STATUS_FAILURE;
    484 }
    485 
    486 enum mod_hdcp_status mod_hdcp_hdcp2_validate_h_prime(struct mod_hdcp *hdcp)
    487 {
    488 	struct psp_context *psp = hdcp->config.psp.handle;
    489 	struct ta_hdcp_shared_memory *hdcp_cmd;
    490 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
    491 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
    492 
    493 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    494 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    495 
    496 	msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
    497 	msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
    498 
    499 	hdcp2_message_init(hdcp, msg_in);
    500 
    501 	msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__AKE_SEND_H_PRIME;
    502 	msg_in->process.msg1_desc.msg_size = TA_HDCP_HDCP2_MSG_ID_MAX_SIZE__AKE_SEND_H_PRIME;
    503 
    504 	memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.ake_h_prime,
    505 	       sizeof(hdcp->auth.msg.hdcp2.ake_h_prime));
    506 
    507 	if (!hdcp->connection.is_km_stored) {
    508 		msg_in->process.msg2_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__AKE_SEND_PAIRING_INFO;
    509 		msg_in->process.msg2_desc.msg_size = TA_HDCP_HDCP2_MSG_ID_MAX_SIZE__AKE_SEND_PAIRING_INFO;
    510 		memcpy(&msg_in->process.receiver_message[sizeof(hdcp->auth.msg.hdcp2.ake_h_prime)],
    511 		       hdcp->auth.msg.hdcp2.ake_pairing_info, sizeof(hdcp->auth.msg.hdcp2.ake_pairing_info));
    512 	}
    513 
    514 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
    515 
    516 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    517 
    518 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    519 		return MOD_HDCP_STATUS_HDCP2_VALIDATE_H_PRIME_FAILURE;
    520 
    521 	if (msg_out->process.msg1_status != TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS)
    522 		return MOD_HDCP_STATUS_HDCP2_VALIDATE_H_PRIME_FAILURE;
    523 	else if (!hdcp->connection.is_km_stored &&
    524 		 msg_out->process.msg2_status != TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS)
    525 		return MOD_HDCP_STATUS_HDCP2_VALIDATE_PAIRING_INFO_FAILURE;
    526 
    527 
    528 	return MOD_HDCP_STATUS_SUCCESS;
    529 }
    530 
    531 enum mod_hdcp_status mod_hdcp_hdcp2_prepare_lc_init(struct mod_hdcp *hdcp)
    532 {
    533 	struct psp_context *psp = hdcp->config.psp.handle;
    534 	struct ta_hdcp_shared_memory *hdcp_cmd;
    535 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
    536 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
    537 
    538 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    539 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    540 
    541 	msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
    542 	msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
    543 
    544 	hdcp2_message_init(hdcp, msg_in);
    545 
    546 	msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__LC_INIT;
    547 
    548 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
    549 
    550 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    551 
    552 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    553 		return MOD_HDCP_STATUS_HDCP2_PREP_LC_INIT_FAILURE;
    554 
    555 	memcpy(hdcp->auth.msg.hdcp2.lc_init, &msg_out->prepare.transmitter_message[0],
    556 	       sizeof(hdcp->auth.msg.hdcp2.lc_init));
    557 
    558 	return MOD_HDCP_STATUS_SUCCESS;
    559 }
    560 
    561 enum mod_hdcp_status mod_hdcp_hdcp2_validate_l_prime(struct mod_hdcp *hdcp)
    562 {
    563 	struct psp_context *psp = hdcp->config.psp.handle;
    564 	struct ta_hdcp_shared_memory *hdcp_cmd;
    565 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
    566 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
    567 
    568 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    569 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    570 
    571 	msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
    572 	msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
    573 
    574 	hdcp2_message_init(hdcp, msg_in);
    575 
    576 	msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__LC_SEND_L_PRIME;
    577 	msg_in->process.msg1_desc.msg_size = TA_HDCP_HDCP2_MSG_ID_MAX_SIZE__LC_SEND_L_PRIME;
    578 
    579 	memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.lc_l_prime,
    580 	       sizeof(hdcp->auth.msg.hdcp2.lc_l_prime));
    581 
    582 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
    583 
    584 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    585 
    586 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    587 		return MOD_HDCP_STATUS_HDCP2_VALIDATE_L_PRIME_FAILURE;
    588 
    589 	if (msg_out->process.msg1_status != TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS)
    590 		return MOD_HDCP_STATUS_HDCP2_VALIDATE_L_PRIME_FAILURE;
    591 
    592 	return MOD_HDCP_STATUS_SUCCESS;
    593 }
    594 
    595 enum mod_hdcp_status mod_hdcp_hdcp2_prepare_eks(struct mod_hdcp *hdcp)
    596 {
    597 	struct psp_context *psp = hdcp->config.psp.handle;
    598 	struct ta_hdcp_shared_memory *hdcp_cmd;
    599 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
    600 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
    601 
    602 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    603 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    604 
    605 	msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
    606 	msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
    607 
    608 	hdcp2_message_init(hdcp, msg_in);
    609 
    610 	msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__SKE_SEND_EKS;
    611 
    612 	if (is_dp_hdcp(hdcp))
    613 		msg_in->prepare.msg2_id = TA_HDCP_HDCP2_MSG_ID__SIGNAL_CONTENT_STREAM_TYPE_DP;
    614 
    615 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
    616 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    617 
    618 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    619 		return MOD_HDCP_STATUS_HDCP2_PREP_EKS_FAILURE;
    620 
    621 	memcpy(hdcp->auth.msg.hdcp2.ske_eks, &msg_out->prepare.transmitter_message[0],
    622 	       sizeof(hdcp->auth.msg.hdcp2.ske_eks));
    623 	msg_out->prepare.msg1_desc.msg_size = sizeof(hdcp->auth.msg.hdcp2.ske_eks);
    624 
    625 	if (is_dp_hdcp(hdcp)) {
    626 		memcpy(hdcp->auth.msg.hdcp2.content_stream_type_dp,
    627 		       &msg_out->prepare.transmitter_message[sizeof(hdcp->auth.msg.hdcp2.ske_eks)],
    628 		       sizeof(hdcp->auth.msg.hdcp2.content_stream_type_dp));
    629 	}
    630 
    631 	return MOD_HDCP_STATUS_SUCCESS;
    632 }
    633 
    634 enum mod_hdcp_status mod_hdcp_hdcp2_enable_encryption(struct mod_hdcp *hdcp)
    635 {
    636 	struct psp_context *psp = hdcp->config.psp.handle;
    637 	struct ta_hdcp_shared_memory *hdcp_cmd;
    638 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
    639 	struct mod_hdcp_display *display = get_first_added_display(hdcp);
    640 
    641 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    642 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    643 
    644 	msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
    645 
    646 	hdcp2_message_init(hdcp, msg_in);
    647 
    648 	if (!display)
    649 		return MOD_HDCP_STATUS_DISPLAY_NOT_FOUND;
    650 
    651 	hdcp_cmd->in_msg.hdcp1_enable_encryption.session_handle = hdcp->auth.id;
    652 
    653 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_SET_ENCRYPTION;
    654 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    655 
    656 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    657 		return MOD_HDCP_STATUS_HDCP2_ENABLE_ENCRYPTION_FAILURE;
    658 
    659 	if (!is_dp_mst_hdcp(hdcp)) {
    660 		display->state = MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED;
    661 		HDCP_HDCP2_ENABLED_TRACE(hdcp, display->index);
    662 	}
    663 
    664 	return MOD_HDCP_STATUS_SUCCESS;
    665 }
    666 
    667 enum mod_hdcp_status mod_hdcp_hdcp2_validate_rx_id_list(struct mod_hdcp *hdcp)
    668 {
    669 	struct psp_context *psp = hdcp->config.psp.handle;
    670 	struct ta_hdcp_shared_memory *hdcp_cmd;
    671 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
    672 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
    673 
    674 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    675 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    676 
    677 	msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
    678 	msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
    679 
    680 	hdcp2_message_init(hdcp, msg_in);
    681 
    682 	msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__REPEATERAUTH_SEND_RECEIVERID_LIST;
    683 	msg_in->process.msg1_desc.msg_size = sizeof(hdcp->auth.msg.hdcp2.rx_id_list);
    684 	memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.rx_id_list,
    685 	       sizeof(hdcp->auth.msg.hdcp2.rx_id_list));
    686 
    687 	msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__REPEATERAUTH_SEND_ACK;
    688 
    689 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
    690 
    691 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    692 
    693 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    694 		return MOD_HDCP_STATUS_HDCP2_VALIDATE_RX_ID_LIST_FAILURE;
    695 
    696 	memcpy(hdcp->auth.msg.hdcp2.repeater_auth_ack, &msg_out->prepare.transmitter_message[0],
    697 	       sizeof(hdcp->auth.msg.hdcp2.repeater_auth_ack));
    698 
    699 	if (msg_out->process.msg1_status == TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS) {
    700 		hdcp->connection.is_km_stored = msg_out->process.is_km_stored ? 1 : 0;
    701 		hdcp->connection.is_repeater = msg_out->process.is_repeater ? 1 : 0;
    702 		return MOD_HDCP_STATUS_SUCCESS;
    703 	}
    704 
    705 
    706 	return MOD_HDCP_STATUS_HDCP2_VALIDATE_RX_ID_LIST_FAILURE;
    707 }
    708 
    709 enum mod_hdcp_status mod_hdcp_hdcp2_enable_dp_stream_encryption(struct mod_hdcp *hdcp)
    710 {
    711 	struct psp_context *psp = hdcp->config.psp.handle;
    712 	struct ta_hdcp_shared_memory *hdcp_cmd;
    713 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
    714 	uint8_t i;
    715 
    716 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    717 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    718 
    719 	msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
    720 
    721 	hdcp2_message_init(hdcp, msg_in);
    722 
    723 
    724 	for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++) {
    725 		if (hdcp->connection.displays[i].state != MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED ||
    726 		    hdcp->connection.displays[i].adjust.disable)
    727 			continue;
    728 		hdcp_cmd->in_msg.hdcp2_enable_dp_stream_encryption.display_handle = hdcp->connection.displays[i].index;
    729 		hdcp_cmd->in_msg.hdcp2_enable_dp_stream_encryption.session_handle = hdcp->auth.id;
    730 
    731 		hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_ENABLE_DP_STREAM_ENCRYPTION;
    732 		psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    733 
    734 		if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    735 			break;
    736 
    737 		hdcp->connection.displays[i].state = MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED;
    738 		HDCP_HDCP2_ENABLED_TRACE(hdcp, hdcp->connection.displays[i].index);
    739 	}
    740 
    741 	return (hdcp_cmd->hdcp_status == TA_HDCP_STATUS__SUCCESS) ? MOD_HDCP_STATUS_SUCCESS
    742 								  : MOD_HDCP_STATUS_HDCP2_ENABLE_STREAM_ENCRYPTION;
    743 }
    744 
    745 enum mod_hdcp_status mod_hdcp_hdcp2_prepare_stream_management(struct mod_hdcp *hdcp)
    746 {
    747 
    748 	struct psp_context *psp = hdcp->config.psp.handle;
    749 	struct ta_hdcp_shared_memory *hdcp_cmd;
    750 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
    751 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
    752 
    753 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    754 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    755 
    756 	msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
    757 	msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
    758 
    759 	hdcp2_message_init(hdcp, msg_in);
    760 
    761 	msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__REPEATERAUTH_STREAM_MANAGE;
    762 
    763 
    764 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
    765 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    766 
    767 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    768 		return MOD_HDCP_STATUS_HDCP2_PREPARE_STREAM_MANAGEMENT_FAILURE;
    769 
    770 	hdcp->auth.msg.hdcp2.stream_manage_size = msg_out->prepare.msg1_desc.msg_size;
    771 
    772 	memcpy(hdcp->auth.msg.hdcp2.repeater_auth_stream_manage, &msg_out->prepare.transmitter_message[0],
    773 	       sizeof(hdcp->auth.msg.hdcp2.repeater_auth_stream_manage));
    774 
    775 	return MOD_HDCP_STATUS_SUCCESS;
    776 }
    777 
    778 enum mod_hdcp_status mod_hdcp_hdcp2_validate_stream_ready(struct mod_hdcp *hdcp)
    779 {
    780 	struct psp_context *psp = hdcp->config.psp.handle;
    781 	struct ta_hdcp_shared_memory *hdcp_cmd;
    782 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
    783 	struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
    784 
    785 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    786 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    787 
    788 	msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
    789 	msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
    790 
    791 	hdcp2_message_init(hdcp, msg_in);
    792 
    793 	msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__REPEATERAUTH_STREAM_READY;
    794 
    795 	msg_in->process.msg1_desc.msg_size = sizeof(hdcp->auth.msg.hdcp2.repeater_auth_stream_ready);
    796 
    797 	memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.repeater_auth_stream_ready,
    798 	       sizeof(hdcp->auth.msg.hdcp2.repeater_auth_stream_ready));
    799 
    800 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
    801 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    802 
    803 	return (hdcp_cmd->hdcp_status == TA_HDCP_STATUS__SUCCESS) &&
    804 			       (msg_out->process.msg1_status == TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS)
    805 		       ? MOD_HDCP_STATUS_SUCCESS
    806 		       : MOD_HDCP_STATUS_HDCP2_VALIDATE_STREAM_READY_FAILURE;
    807 }
    808 
    809 enum mod_hdcp_status mod_hdcp_hdcp2_get_link_encryption_status(struct mod_hdcp *hdcp,
    810 							       enum mod_hdcp_encryption_status *encryption_status)
    811 {
    812 	struct psp_context *psp = hdcp->config.psp.handle;
    813 	struct ta_hdcp_shared_memory *hdcp_cmd;
    814 
    815 	hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
    816 
    817 	memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
    818 
    819 	hdcp_cmd->in_msg.hdcp2_get_encryption_status.session_handle = hdcp->auth.id;
    820 	hdcp_cmd->out_msg.hdcp2_get_encryption_status.protection_level = 0;
    821 	hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_GET_ENCRYPTION_STATUS;
    822 	*encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF;
    823 
    824 	psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
    825 
    826 	if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
    827 		return MOD_HDCP_STATUS_FAILURE;
    828 
    829 	if (hdcp_cmd->out_msg.hdcp2_get_encryption_status.protection_level == 1) {
    830 		if (hdcp_cmd->out_msg.hdcp2_get_encryption_status.hdcp2_type == TA_HDCP2_CONTENT_TYPE__TYPE1)
    831 			*encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE1_ON;
    832 		else
    833 			*encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE0_ON;
    834 	}
    835 
    836 	return MOD_HDCP_STATUS_SUCCESS;
    837 }
    838