2 * Copyright 2018 Advanced Micro Devices, Inc.
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:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
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.
26 #define MAX_NUM_DISPLAYS 24
34 static void hdcp2_message_init(struct mod_hdcp *hdcp,
35 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *in)
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;
47 enum mod_hdcp_status mod_hdcp_remove_display_from_topology(
48 struct mod_hdcp *hdcp, uint8_t index)
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);
55 dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.dtm_shared_buf;
57 if (!display || !is_display_added(display))
58 return MOD_HDCP_STATUS_DISPLAY_NOT_FOUND;
60 memset(dtm_cmd, 0, sizeof(struct ta_dtm_shared_memory));
62 dtm_cmd->cmd_id = TA_DTM_COMMAND__TOPOLOGY_UPDATE_V2;
63 dtm_cmd->dtm_in_message.topology_update_v2.display_handle = display->index;
64 dtm_cmd->dtm_in_message.topology_update_v2.is_active = 0;
65 dtm_cmd->dtm_status = TA_DTM_STATUS__GENERIC_FAILURE;
67 psp_dtm_invoke(psp, dtm_cmd->cmd_id);
69 if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS)
70 return MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE;
72 display->state = MOD_HDCP_DISPLAY_ACTIVE;
73 HDCP_TOP_REMOVE_DISPLAY_TRACE(hdcp, display->index);
75 return MOD_HDCP_STATUS_SUCCESS;
78 enum mod_hdcp_status mod_hdcp_add_display_to_topology(struct mod_hdcp *hdcp,
81 struct psp_context *psp = hdcp->config.psp.handle;
82 struct ta_dtm_shared_memory *dtm_cmd;
83 struct mod_hdcp_display *display =
84 get_active_display_at_index(hdcp, index);
85 struct mod_hdcp_link *link = &hdcp->connection.link;
87 if (!psp->dtm_context.dtm_initialized) {
88 DRM_ERROR("Failed to add display topology, DTM TA is not initialized.");
89 return MOD_HDCP_STATUS_FAILURE;
92 if (!display || is_display_added(display))
93 return MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE;
95 dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.dtm_shared_buf;
97 memset(dtm_cmd, 0, sizeof(struct ta_dtm_shared_memory));
99 dtm_cmd->cmd_id = TA_DTM_COMMAND__TOPOLOGY_UPDATE_V2;
100 dtm_cmd->dtm_in_message.topology_update_v2.display_handle = display->index;
101 dtm_cmd->dtm_in_message.topology_update_v2.is_active = 1;
102 dtm_cmd->dtm_in_message.topology_update_v2.controller = display->controller;
103 dtm_cmd->dtm_in_message.topology_update_v2.ddc_line = link->ddc_line;
104 dtm_cmd->dtm_in_message.topology_update_v2.dig_be = link->dig_be;
105 dtm_cmd->dtm_in_message.topology_update_v2.dig_fe = display->dig_fe;
106 if (is_dp_hdcp(hdcp))
107 dtm_cmd->dtm_in_message.topology_update_v2.is_assr = link->dp.assr_supported;
109 dtm_cmd->dtm_in_message.topology_update_v2.dp_mst_vcid = display->vc_id;
110 dtm_cmd->dtm_in_message.topology_update_v2.max_hdcp_supported_version =
111 TA_DTM_HDCP_VERSION_MAX_SUPPORTED__2_2;
112 dtm_cmd->dtm_status = TA_DTM_STATUS__GENERIC_FAILURE;
114 psp_dtm_invoke(psp, dtm_cmd->cmd_id);
116 if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS)
117 return MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE;
119 display->state = MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED;
120 HDCP_TOP_ADD_DISPLAY_TRACE(hdcp, display->index);
122 return MOD_HDCP_STATUS_SUCCESS;
125 enum mod_hdcp_status mod_hdcp_hdcp1_create_session(struct mod_hdcp *hdcp)
128 struct psp_context *psp = hdcp->config.psp.handle;
129 struct mod_hdcp_display *display = get_first_added_display(hdcp);
130 struct ta_hdcp_shared_memory *hdcp_cmd;
132 if (!psp->hdcp_context.hdcp_initialized) {
133 DRM_ERROR("Failed to create hdcp session. HDCP TA is not initialized.");
134 return MOD_HDCP_STATUS_FAILURE;
137 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
138 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
140 hdcp_cmd->in_msg.hdcp1_create_session.display_handle = display->index;
141 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_CREATE_SESSION;
143 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
145 hdcp->auth.id = hdcp_cmd->out_msg.hdcp1_create_session.session_handle;
147 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
148 return MOD_HDCP_STATUS_HDCP1_CREATE_SESSION_FAILURE;
150 hdcp->auth.msg.hdcp1.ainfo = hdcp_cmd->out_msg.hdcp1_create_session.ainfo_primary;
151 memcpy(hdcp->auth.msg.hdcp1.aksv, hdcp_cmd->out_msg.hdcp1_create_session.aksv_primary,
152 sizeof(hdcp->auth.msg.hdcp1.aksv));
153 memcpy(hdcp->auth.msg.hdcp1.an, hdcp_cmd->out_msg.hdcp1_create_session.an_primary,
154 sizeof(hdcp->auth.msg.hdcp1.an));
156 return MOD_HDCP_STATUS_SUCCESS;
159 enum mod_hdcp_status mod_hdcp_hdcp1_destroy_session(struct mod_hdcp *hdcp)
162 struct psp_context *psp = hdcp->config.psp.handle;
163 struct ta_hdcp_shared_memory *hdcp_cmd;
166 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
167 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
169 hdcp_cmd->in_msg.hdcp1_destroy_session.session_handle = hdcp->auth.id;
170 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_DESTROY_SESSION;
172 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
174 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
175 return MOD_HDCP_STATUS_HDCP1_DESTROY_SESSION_FAILURE;
177 HDCP_TOP_HDCP1_DESTROY_SESSION_TRACE(hdcp);
178 for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++)
179 if (is_display_encryption_enabled(
180 &hdcp->displays[i])) {
181 hdcp->displays[i].state =
182 MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED;
183 HDCP_HDCP1_DISABLED_TRACE(hdcp,
184 hdcp->displays[i].index);
187 return MOD_HDCP_STATUS_SUCCESS;
190 enum mod_hdcp_status mod_hdcp_hdcp1_validate_rx(struct mod_hdcp *hdcp)
192 struct psp_context *psp = hdcp->config.psp.handle;
193 struct ta_hdcp_shared_memory *hdcp_cmd;
195 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
196 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
198 hdcp_cmd->in_msg.hdcp1_first_part_authentication.session_handle = hdcp->auth.id;
200 memcpy(hdcp_cmd->in_msg.hdcp1_first_part_authentication.bksv_primary, hdcp->auth.msg.hdcp1.bksv,
201 TA_HDCP__HDCP1_KSV_SIZE);
203 hdcp_cmd->in_msg.hdcp1_first_part_authentication.r0_prime_primary = hdcp->auth.msg.hdcp1.r0p;
204 hdcp_cmd->in_msg.hdcp1_first_part_authentication.bcaps = hdcp->auth.msg.hdcp1.bcaps;
205 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_FIRST_PART_AUTHENTICATION;
207 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
209 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
210 return MOD_HDCP_STATUS_HDCP1_VALIDATE_RX_FAILURE;
212 if (hdcp_cmd->out_msg.hdcp1_first_part_authentication.authentication_status ==
213 TA_HDCP_AUTHENTICATION_STATUS__HDCP1_FIRST_PART_COMPLETE) {
214 /* needs second part of authentication */
215 hdcp->connection.is_repeater = 1;
216 } else if (hdcp_cmd->out_msg.hdcp1_first_part_authentication.authentication_status ==
217 TA_HDCP_AUTHENTICATION_STATUS__HDCP1_AUTHENTICATED) {
218 hdcp->connection.is_repeater = 0;
219 } else if (hdcp_cmd->out_msg.hdcp1_first_part_authentication.authentication_status ==
220 TA_HDCP_AUTHENTICATION_STATUS__HDCP1_KSV_REVOKED) {
221 hdcp->connection.is_hdcp1_revoked = 1;
222 return MOD_HDCP_STATUS_HDCP1_BKSV_REVOKED;
224 return MOD_HDCP_STATUS_HDCP1_VALIDATE_RX_FAILURE;
227 return MOD_HDCP_STATUS_SUCCESS;
230 enum mod_hdcp_status mod_hdcp_hdcp1_enable_encryption(struct mod_hdcp *hdcp)
232 struct psp_context *psp = hdcp->config.psp.handle;
233 struct ta_hdcp_shared_memory *hdcp_cmd;
234 struct mod_hdcp_display *display = get_first_added_display(hdcp);
236 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
237 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
239 hdcp_cmd->in_msg.hdcp1_enable_encryption.session_handle = hdcp->auth.id;
240 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_ENABLE_ENCRYPTION;
242 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
244 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
245 return MOD_HDCP_STATUS_HDCP1_ENABLE_ENCRYPTION;
247 if (!is_dp_mst_hdcp(hdcp)) {
248 display->state = MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED;
249 HDCP_HDCP1_ENABLED_TRACE(hdcp, display->index);
251 return MOD_HDCP_STATUS_SUCCESS;
254 enum mod_hdcp_status mod_hdcp_hdcp1_validate_ksvlist_vp(struct mod_hdcp *hdcp)
256 struct psp_context *psp = hdcp->config.psp.handle;
257 struct ta_hdcp_shared_memory *hdcp_cmd;
258 enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
260 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
261 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
263 hdcp_cmd->in_msg.hdcp1_second_part_authentication.session_handle = hdcp->auth.id;
265 hdcp_cmd->in_msg.hdcp1_second_part_authentication.ksv_list_size = hdcp->auth.msg.hdcp1.ksvlist_size;
266 memcpy(hdcp_cmd->in_msg.hdcp1_second_part_authentication.ksv_list, hdcp->auth.msg.hdcp1.ksvlist,
267 hdcp->auth.msg.hdcp1.ksvlist_size);
269 memcpy(hdcp_cmd->in_msg.hdcp1_second_part_authentication.v_prime, hdcp->auth.msg.hdcp1.vp,
270 sizeof(hdcp->auth.msg.hdcp1.vp));
272 hdcp_cmd->in_msg.hdcp1_second_part_authentication.bstatus_binfo =
273 is_dp_hdcp(hdcp) ? hdcp->auth.msg.hdcp1.binfo_dp : hdcp->auth.msg.hdcp1.bstatus;
274 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_SECOND_PART_AUTHENTICATION;
276 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
278 if (hdcp_cmd->hdcp_status == TA_HDCP_STATUS__SUCCESS &&
279 hdcp_cmd->out_msg.hdcp1_second_part_authentication.authentication_status ==
280 TA_HDCP_AUTHENTICATION_STATUS__HDCP1_AUTHENTICATED) {
281 status = MOD_HDCP_STATUS_SUCCESS;
282 } else if (hdcp_cmd->out_msg.hdcp1_second_part_authentication.authentication_status ==
283 TA_HDCP_AUTHENTICATION_STATUS__HDCP1_KSV_REVOKED) {
284 hdcp->connection.is_hdcp1_revoked = 1;
285 status = MOD_HDCP_STATUS_HDCP1_KSV_LIST_REVOKED;
287 status = MOD_HDCP_STATUS_HDCP1_VALIDATE_KSV_LIST_FAILURE;
293 enum mod_hdcp_status mod_hdcp_hdcp1_enable_dp_stream_encryption(struct mod_hdcp *hdcp)
296 struct psp_context *psp = hdcp->config.psp.handle;
297 struct ta_hdcp_shared_memory *hdcp_cmd;
300 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
302 for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++) {
304 if (hdcp->displays[i].state != MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED ||
305 hdcp->displays[i].adjust.disable)
308 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
310 hdcp_cmd->in_msg.hdcp1_enable_dp_stream_encryption.session_handle = hdcp->auth.id;
311 hdcp_cmd->in_msg.hdcp1_enable_dp_stream_encryption.display_handle = hdcp->displays[i].index;
312 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_ENABLE_DP_STREAM_ENCRYPTION;
314 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
316 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
317 return MOD_HDCP_STATUS_HDCP1_ENABLE_STREAM_ENCRYPTION_FAILURE;
319 hdcp->displays[i].state = MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED;
320 HDCP_HDCP1_ENABLED_TRACE(hdcp, hdcp->displays[i].index);
323 return MOD_HDCP_STATUS_SUCCESS;
326 enum mod_hdcp_status mod_hdcp_hdcp1_link_maintenance(struct mod_hdcp *hdcp)
328 struct psp_context *psp = hdcp->config.psp.handle;
329 struct ta_hdcp_shared_memory *hdcp_cmd;
331 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
333 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
335 hdcp_cmd->in_msg.hdcp1_get_encryption_status.session_handle = hdcp->auth.id;
337 hdcp_cmd->out_msg.hdcp1_get_encryption_status.protection_level = 0;
338 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_GET_ENCRYPTION_STATUS;
340 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
342 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
343 return MOD_HDCP_STATUS_HDCP1_LINK_MAINTENANCE_FAILURE;
345 return (hdcp_cmd->out_msg.hdcp1_get_encryption_status.protection_level == 1)
346 ? MOD_HDCP_STATUS_SUCCESS
347 : MOD_HDCP_STATUS_HDCP1_LINK_MAINTENANCE_FAILURE;
350 enum mod_hdcp_status mod_hdcp_hdcp1_get_link_encryption_status(struct mod_hdcp *hdcp,
351 enum mod_hdcp_encryption_status *encryption_status)
353 *encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF;
355 if (mod_hdcp_hdcp1_link_maintenance(hdcp) != MOD_HDCP_STATUS_SUCCESS)
356 return MOD_HDCP_STATUS_FAILURE;
358 *encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP1_ON;
360 return MOD_HDCP_STATUS_SUCCESS;
363 enum mod_hdcp_status mod_hdcp_hdcp2_create_session(struct mod_hdcp *hdcp)
365 struct psp_context *psp = hdcp->config.psp.handle;
366 struct ta_hdcp_shared_memory *hdcp_cmd;
367 struct mod_hdcp_display *display = get_first_added_display(hdcp);
369 if (!psp->hdcp_context.hdcp_initialized) {
370 DRM_ERROR("Failed to create hdcp session, HDCP TA is not initialized");
371 return MOD_HDCP_STATUS_FAILURE;
374 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
375 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
378 return MOD_HDCP_STATUS_DISPLAY_NOT_FOUND;
380 hdcp_cmd->in_msg.hdcp2_create_session_v2.display_handle = display->index;
382 if (hdcp->connection.link.adjust.hdcp2.force_type == MOD_HDCP_FORCE_TYPE_0)
383 hdcp_cmd->in_msg.hdcp2_create_session_v2.negotiate_content_type =
384 TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__FORCE_TYPE0;
385 else if (hdcp->connection.link.adjust.hdcp2.force_type == MOD_HDCP_FORCE_TYPE_1)
386 hdcp_cmd->in_msg.hdcp2_create_session_v2.negotiate_content_type =
387 TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__FORCE_TYPE1;
388 else if (hdcp->connection.link.adjust.hdcp2.force_type == MOD_HDCP_FORCE_TYPE_MAX)
389 hdcp_cmd->in_msg.hdcp2_create_session_v2.negotiate_content_type =
390 TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__MAX_SUPPORTED;
392 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_CREATE_SESSION_V2;
394 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
396 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
397 return MOD_HDCP_STATUS_HDCP2_CREATE_SESSION_FAILURE;
399 hdcp->auth.id = hdcp_cmd->out_msg.hdcp2_create_session_v2.session_handle;
401 return MOD_HDCP_STATUS_SUCCESS;
404 enum mod_hdcp_status mod_hdcp_hdcp2_destroy_session(struct mod_hdcp *hdcp)
406 struct psp_context *psp = hdcp->config.psp.handle;
407 struct ta_hdcp_shared_memory *hdcp_cmd;
410 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
411 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
413 hdcp_cmd->in_msg.hdcp2_destroy_session.session_handle = hdcp->auth.id;
414 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_DESTROY_SESSION;
416 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
418 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
419 return MOD_HDCP_STATUS_HDCP2_DESTROY_SESSION_FAILURE;
421 HDCP_TOP_HDCP2_DESTROY_SESSION_TRACE(hdcp);
422 for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++)
423 if (is_display_encryption_enabled(
424 &hdcp->displays[i])) {
425 hdcp->displays[i].state =
426 MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED;
427 HDCP_HDCP2_DISABLED_TRACE(hdcp,
428 hdcp->displays[i].index);
431 return MOD_HDCP_STATUS_SUCCESS;
434 enum mod_hdcp_status mod_hdcp_hdcp2_prepare_ake_init(struct mod_hdcp *hdcp)
436 struct psp_context *psp = hdcp->config.psp.handle;
437 struct ta_hdcp_shared_memory *hdcp_cmd;
438 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
439 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
441 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
442 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
444 msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
445 msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
447 hdcp2_message_init(hdcp, msg_in);
449 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
450 msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__AKE_INIT;
452 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
454 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
455 return MOD_HDCP_STATUS_HDCP2_PREP_AKE_INIT_FAILURE;
457 memcpy(&hdcp->auth.msg.hdcp2.ake_init[0], &msg_out->prepare.transmitter_message[0],
458 sizeof(hdcp->auth.msg.hdcp2.ake_init));
460 return MOD_HDCP_STATUS_SUCCESS;
463 enum mod_hdcp_status mod_hdcp_hdcp2_validate_ake_cert(struct mod_hdcp *hdcp)
465 struct psp_context *psp = hdcp->config.psp.handle;
466 struct ta_hdcp_shared_memory *hdcp_cmd;
467 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
468 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
470 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
471 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
473 msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
474 msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
476 hdcp2_message_init(hdcp, msg_in);
478 msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__AKE_SEND_CERT;
479 msg_in->process.msg1_desc.msg_size = TA_HDCP_HDCP2_MSG_ID_MAX_SIZE__AKE_SEND_CERT;
481 memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.ake_cert,
482 sizeof(hdcp->auth.msg.hdcp2.ake_cert));
484 msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__AKE_NO_STORED_KM;
485 msg_in->prepare.msg2_id = TA_HDCP_HDCP2_MSG_ID__AKE_STORED_KM;
487 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
489 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
491 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
492 return MOD_HDCP_STATUS_HDCP2_VALIDATE_AKE_CERT_FAILURE;
494 memcpy(hdcp->auth.msg.hdcp2.ake_no_stored_km, &msg_out->prepare.transmitter_message[0],
495 sizeof(hdcp->auth.msg.hdcp2.ake_no_stored_km));
497 memcpy(hdcp->auth.msg.hdcp2.ake_stored_km,
498 &msg_out->prepare.transmitter_message[sizeof(hdcp->auth.msg.hdcp2.ake_no_stored_km)],
499 sizeof(hdcp->auth.msg.hdcp2.ake_stored_km));
501 if (msg_out->process.msg1_status == TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS) {
502 hdcp->connection.is_km_stored = msg_out->process.is_km_stored ? 1 : 0;
503 hdcp->connection.is_repeater = msg_out->process.is_repeater ? 1 : 0;
504 return MOD_HDCP_STATUS_SUCCESS;
505 } else if (msg_out->process.msg1_status == TA_HDCP2_MSG_AUTHENTICATION_STATUS__RECEIVERID_REVOKED) {
506 hdcp->connection.is_hdcp2_revoked = 1;
507 return MOD_HDCP_STATUS_HDCP2_AKE_CERT_REVOKED;
510 return MOD_HDCP_STATUS_HDCP2_VALIDATE_AKE_CERT_FAILURE;
513 enum mod_hdcp_status mod_hdcp_hdcp2_validate_h_prime(struct mod_hdcp *hdcp)
515 struct psp_context *psp = hdcp->config.psp.handle;
516 struct ta_hdcp_shared_memory *hdcp_cmd;
517 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
518 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
520 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
521 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
523 msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
524 msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
526 hdcp2_message_init(hdcp, msg_in);
528 msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__AKE_SEND_H_PRIME;
529 msg_in->process.msg1_desc.msg_size = TA_HDCP_HDCP2_MSG_ID_MAX_SIZE__AKE_SEND_H_PRIME;
531 memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.ake_h_prime,
532 sizeof(hdcp->auth.msg.hdcp2.ake_h_prime));
534 if (!hdcp->connection.is_km_stored) {
535 msg_in->process.msg2_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__AKE_SEND_PAIRING_INFO;
536 msg_in->process.msg2_desc.msg_size = TA_HDCP_HDCP2_MSG_ID_MAX_SIZE__AKE_SEND_PAIRING_INFO;
537 memcpy(&msg_in->process.receiver_message[sizeof(hdcp->auth.msg.hdcp2.ake_h_prime)],
538 hdcp->auth.msg.hdcp2.ake_pairing_info, sizeof(hdcp->auth.msg.hdcp2.ake_pairing_info));
541 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
543 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
545 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
546 return MOD_HDCP_STATUS_HDCP2_VALIDATE_H_PRIME_FAILURE;
548 if (msg_out->process.msg1_status != TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS)
549 return MOD_HDCP_STATUS_HDCP2_VALIDATE_H_PRIME_FAILURE;
550 else if (!hdcp->connection.is_km_stored &&
551 msg_out->process.msg2_status != TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS)
552 return MOD_HDCP_STATUS_HDCP2_VALIDATE_PAIRING_INFO_FAILURE;
555 return MOD_HDCP_STATUS_SUCCESS;
558 enum mod_hdcp_status mod_hdcp_hdcp2_prepare_lc_init(struct mod_hdcp *hdcp)
560 struct psp_context *psp = hdcp->config.psp.handle;
561 struct ta_hdcp_shared_memory *hdcp_cmd;
562 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
563 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
565 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
566 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
568 msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
569 msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
571 hdcp2_message_init(hdcp, msg_in);
573 msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__LC_INIT;
575 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
577 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
579 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
580 return MOD_HDCP_STATUS_HDCP2_PREP_LC_INIT_FAILURE;
582 memcpy(hdcp->auth.msg.hdcp2.lc_init, &msg_out->prepare.transmitter_message[0],
583 sizeof(hdcp->auth.msg.hdcp2.lc_init));
585 return MOD_HDCP_STATUS_SUCCESS;
588 enum mod_hdcp_status mod_hdcp_hdcp2_validate_l_prime(struct mod_hdcp *hdcp)
590 struct psp_context *psp = hdcp->config.psp.handle;
591 struct ta_hdcp_shared_memory *hdcp_cmd;
592 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
593 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
595 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
596 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
598 msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
599 msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
601 hdcp2_message_init(hdcp, msg_in);
603 msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__LC_SEND_L_PRIME;
604 msg_in->process.msg1_desc.msg_size = TA_HDCP_HDCP2_MSG_ID_MAX_SIZE__LC_SEND_L_PRIME;
606 memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.lc_l_prime,
607 sizeof(hdcp->auth.msg.hdcp2.lc_l_prime));
609 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
611 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
613 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
614 return MOD_HDCP_STATUS_HDCP2_VALIDATE_L_PRIME_FAILURE;
616 if (msg_out->process.msg1_status != TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS)
617 return MOD_HDCP_STATUS_HDCP2_VALIDATE_L_PRIME_FAILURE;
619 return MOD_HDCP_STATUS_SUCCESS;
622 enum mod_hdcp_status mod_hdcp_hdcp2_prepare_eks(struct mod_hdcp *hdcp)
624 struct psp_context *psp = hdcp->config.psp.handle;
625 struct ta_hdcp_shared_memory *hdcp_cmd;
626 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
627 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
629 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
630 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
632 msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
633 msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
635 hdcp2_message_init(hdcp, msg_in);
637 msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__SKE_SEND_EKS;
639 if (is_dp_hdcp(hdcp))
640 msg_in->prepare.msg2_id = TA_HDCP_HDCP2_MSG_ID__SIGNAL_CONTENT_STREAM_TYPE_DP;
642 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
643 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
645 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
646 return MOD_HDCP_STATUS_HDCP2_PREP_EKS_FAILURE;
648 memcpy(hdcp->auth.msg.hdcp2.ske_eks, &msg_out->prepare.transmitter_message[0],
649 sizeof(hdcp->auth.msg.hdcp2.ske_eks));
650 msg_out->prepare.msg1_desc.msg_size = sizeof(hdcp->auth.msg.hdcp2.ske_eks);
652 if (is_dp_hdcp(hdcp)) {
653 memcpy(hdcp->auth.msg.hdcp2.content_stream_type_dp,
654 &msg_out->prepare.transmitter_message[sizeof(hdcp->auth.msg.hdcp2.ske_eks)],
655 sizeof(hdcp->auth.msg.hdcp2.content_stream_type_dp));
658 return MOD_HDCP_STATUS_SUCCESS;
661 enum mod_hdcp_status mod_hdcp_hdcp2_enable_encryption(struct mod_hdcp *hdcp)
663 struct psp_context *psp = hdcp->config.psp.handle;
664 struct ta_hdcp_shared_memory *hdcp_cmd;
665 struct mod_hdcp_display *display = get_first_added_display(hdcp);
667 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
668 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
671 return MOD_HDCP_STATUS_DISPLAY_NOT_FOUND;
673 hdcp_cmd->in_msg.hdcp2_set_encryption.session_handle = hdcp->auth.id;
675 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_SET_ENCRYPTION;
676 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
678 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
679 return MOD_HDCP_STATUS_HDCP2_ENABLE_ENCRYPTION_FAILURE;
681 if (!is_dp_mst_hdcp(hdcp)) {
682 display->state = MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED;
683 HDCP_HDCP2_ENABLED_TRACE(hdcp, display->index);
686 return MOD_HDCP_STATUS_SUCCESS;
689 enum mod_hdcp_status mod_hdcp_hdcp2_validate_rx_id_list(struct mod_hdcp *hdcp)
691 struct psp_context *psp = hdcp->config.psp.handle;
692 struct ta_hdcp_shared_memory *hdcp_cmd;
693 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
694 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
696 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
697 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
699 msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
700 msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
702 hdcp2_message_init(hdcp, msg_in);
704 msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__REPEATERAUTH_SEND_RECEIVERID_LIST;
705 msg_in->process.msg1_desc.msg_size = sizeof(hdcp->auth.msg.hdcp2.rx_id_list);
706 memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.rx_id_list,
707 sizeof(hdcp->auth.msg.hdcp2.rx_id_list));
709 msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__REPEATERAUTH_SEND_ACK;
711 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
713 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
715 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
716 return MOD_HDCP_STATUS_HDCP2_VALIDATE_RX_ID_LIST_FAILURE;
718 memcpy(hdcp->auth.msg.hdcp2.repeater_auth_ack, &msg_out->prepare.transmitter_message[0],
719 sizeof(hdcp->auth.msg.hdcp2.repeater_auth_ack));
721 if (msg_out->process.msg1_status == TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS) {
722 hdcp->connection.is_km_stored = msg_out->process.is_km_stored ? 1 : 0;
723 hdcp->connection.is_repeater = msg_out->process.is_repeater ? 1 : 0;
724 return MOD_HDCP_STATUS_SUCCESS;
725 } else if (msg_out->process.msg1_status == TA_HDCP2_MSG_AUTHENTICATION_STATUS__RECEIVERID_REVOKED) {
726 hdcp->connection.is_hdcp2_revoked = 1;
727 return MOD_HDCP_STATUS_HDCP2_RX_ID_LIST_REVOKED;
731 return MOD_HDCP_STATUS_HDCP2_VALIDATE_RX_ID_LIST_FAILURE;
734 enum mod_hdcp_status mod_hdcp_hdcp2_enable_dp_stream_encryption(struct mod_hdcp *hdcp)
736 struct psp_context *psp = hdcp->config.psp.handle;
737 struct ta_hdcp_shared_memory *hdcp_cmd;
738 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
741 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
742 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
744 msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
746 hdcp2_message_init(hdcp, msg_in);
749 for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++) {
750 if (hdcp->displays[i].state != MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED ||
751 hdcp->displays[i].adjust.disable)
753 hdcp_cmd->in_msg.hdcp2_enable_dp_stream_encryption.display_handle = hdcp->displays[i].index;
754 hdcp_cmd->in_msg.hdcp2_enable_dp_stream_encryption.session_handle = hdcp->auth.id;
756 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_ENABLE_DP_STREAM_ENCRYPTION;
757 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
759 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
762 hdcp->displays[i].state = MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED;
763 HDCP_HDCP2_ENABLED_TRACE(hdcp, hdcp->displays[i].index);
766 return (hdcp_cmd->hdcp_status == TA_HDCP_STATUS__SUCCESS) ? MOD_HDCP_STATUS_SUCCESS
767 : MOD_HDCP_STATUS_HDCP2_ENABLE_STREAM_ENCRYPTION;
770 enum mod_hdcp_status mod_hdcp_hdcp2_prepare_stream_management(struct mod_hdcp *hdcp)
773 struct psp_context *psp = hdcp->config.psp.handle;
774 struct ta_hdcp_shared_memory *hdcp_cmd;
775 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
776 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
778 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
779 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
781 msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
782 msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
784 hdcp2_message_init(hdcp, msg_in);
786 msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__REPEATERAUTH_STREAM_MANAGE;
789 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
790 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
792 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
793 return MOD_HDCP_STATUS_HDCP2_PREPARE_STREAM_MANAGEMENT_FAILURE;
795 hdcp->auth.msg.hdcp2.stream_manage_size = msg_out->prepare.msg1_desc.msg_size;
797 memcpy(hdcp->auth.msg.hdcp2.repeater_auth_stream_manage, &msg_out->prepare.transmitter_message[0],
798 sizeof(hdcp->auth.msg.hdcp2.repeater_auth_stream_manage));
800 return MOD_HDCP_STATUS_SUCCESS;
803 enum mod_hdcp_status mod_hdcp_hdcp2_validate_stream_ready(struct mod_hdcp *hdcp)
805 struct psp_context *psp = hdcp->config.psp.handle;
806 struct ta_hdcp_shared_memory *hdcp_cmd;
807 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
808 struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
810 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
811 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
813 msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
814 msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
816 hdcp2_message_init(hdcp, msg_in);
818 msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__REPEATERAUTH_STREAM_READY;
820 msg_in->process.msg1_desc.msg_size = sizeof(hdcp->auth.msg.hdcp2.repeater_auth_stream_ready);
822 memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.repeater_auth_stream_ready,
823 sizeof(hdcp->auth.msg.hdcp2.repeater_auth_stream_ready));
825 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
826 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
828 return (hdcp_cmd->hdcp_status == TA_HDCP_STATUS__SUCCESS) &&
829 (msg_out->process.msg1_status == TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS)
830 ? MOD_HDCP_STATUS_SUCCESS
831 : MOD_HDCP_STATUS_HDCP2_VALIDATE_STREAM_READY_FAILURE;
834 enum mod_hdcp_status mod_hdcp_hdcp2_get_link_encryption_status(struct mod_hdcp *hdcp,
835 enum mod_hdcp_encryption_status *encryption_status)
837 struct psp_context *psp = hdcp->config.psp.handle;
838 struct ta_hdcp_shared_memory *hdcp_cmd;
840 hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
842 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
844 hdcp_cmd->in_msg.hdcp2_get_encryption_status.session_handle = hdcp->auth.id;
845 hdcp_cmd->out_msg.hdcp2_get_encryption_status.protection_level = 0;
846 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_GET_ENCRYPTION_STATUS;
847 *encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF;
849 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
851 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
852 return MOD_HDCP_STATUS_FAILURE;
854 if (hdcp_cmd->out_msg.hdcp2_get_encryption_status.protection_level == 1) {
855 if (hdcp_cmd->out_msg.hdcp2_get_encryption_status.hdcp2_type == TA_HDCP2_CONTENT_TYPE__TYPE1)
856 *encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE1_ON;
858 *encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP2_TYPE0_ON;
861 return MOD_HDCP_STATUS_SUCCESS;