OSDN Git Service

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