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