Merge tag 'drm-misc-next-fixes-2021-09-09' of git://anongit.freedesktop.org/drm/drm...
[linux-2.6-microblaze.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
48 static enum mod_hdcp_status remove_display_from_topology_v2(
49                 struct mod_hdcp *hdcp, uint8_t index)
50 {
51         struct psp_context *psp = hdcp->config.psp.handle;
52         struct ta_dtm_shared_memory *dtm_cmd;
53         struct mod_hdcp_display *display =
54                         get_active_display_at_index(hdcp, index);
55         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
56
57         dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.context.mem_context.shared_buf;
58
59         if (!display || !is_display_active(display))
60                 return MOD_HDCP_STATUS_DISPLAY_NOT_FOUND;
61
62         mutex_lock(&psp->dtm_context.mutex);
63
64         memset(dtm_cmd, 0, sizeof(struct ta_dtm_shared_memory));
65
66         dtm_cmd->cmd_id = TA_DTM_COMMAND__TOPOLOGY_UPDATE_V2;
67         dtm_cmd->dtm_in_message.topology_update_v2.display_handle = display->index;
68         dtm_cmd->dtm_in_message.topology_update_v2.is_active = 0;
69         dtm_cmd->dtm_status = TA_DTM_STATUS__GENERIC_FAILURE;
70
71         psp_dtm_invoke(psp, dtm_cmd->cmd_id);
72
73         if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS) {
74                 status = MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE;
75         } else {
76                 display->state = MOD_HDCP_DISPLAY_ACTIVE;
77                 HDCP_TOP_REMOVE_DISPLAY_TRACE(hdcp, display->index);
78         }
79
80         mutex_unlock(&psp->dtm_context.mutex);
81         return status;
82 }
83
84 static enum mod_hdcp_status remove_display_from_topology_v3(
85                 struct mod_hdcp *hdcp, uint8_t index)
86 {
87         struct psp_context *psp = hdcp->config.psp.handle;
88         struct ta_dtm_shared_memory *dtm_cmd;
89         struct mod_hdcp_display *display =
90                 get_active_display_at_index(hdcp, index);
91         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
92
93         dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.context.mem_context.shared_buf;
94
95         if (!display || !is_display_active(display))
96                 return MOD_HDCP_STATUS_DISPLAY_NOT_FOUND;
97
98         mutex_lock(&psp->dtm_context.mutex);
99
100         memset(dtm_cmd, 0, sizeof(struct ta_dtm_shared_memory));
101
102         dtm_cmd->cmd_id = TA_DTM_COMMAND__TOPOLOGY_UPDATE_V3;
103         dtm_cmd->dtm_in_message.topology_update_v3.display_handle = display->index;
104         dtm_cmd->dtm_in_message.topology_update_v3.is_active = 0;
105         dtm_cmd->dtm_status = TA_DTM_STATUS__GENERIC_FAILURE;
106
107         psp_dtm_invoke(psp, dtm_cmd->cmd_id);
108
109         if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS) {
110                 status = remove_display_from_topology_v2(hdcp, index);
111                 if (status != MOD_HDCP_STATUS_SUCCESS)
112                         display->state = MOD_HDCP_DISPLAY_INACTIVE;
113         } else {
114                 display->state = MOD_HDCP_DISPLAY_ACTIVE;
115                 HDCP_TOP_REMOVE_DISPLAY_TRACE(hdcp, display->index);
116         }
117
118         mutex_unlock(&psp->dtm_context.mutex);
119
120         return status;
121 }
122
123 static enum mod_hdcp_status add_display_to_topology_v2(
124                 struct mod_hdcp *hdcp, struct mod_hdcp_display *display)
125 {
126         struct psp_context *psp = hdcp->config.psp.handle;
127         struct ta_dtm_shared_memory *dtm_cmd;
128         struct mod_hdcp_link *link = &hdcp->connection.link;
129         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
130
131         if (!psp->dtm_context.context.initialized) {
132                 DRM_INFO("Failed to add display topology, DTM TA is not initialized.");
133                 display->state = MOD_HDCP_DISPLAY_INACTIVE;
134                 return MOD_HDCP_STATUS_FAILURE;
135         }
136
137         dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.context.mem_context.shared_buf;
138
139         mutex_lock(&psp->dtm_context.mutex);
140         memset(dtm_cmd, 0, sizeof(struct ta_dtm_shared_memory));
141
142         dtm_cmd->cmd_id = TA_DTM_COMMAND__TOPOLOGY_UPDATE_V2;
143         dtm_cmd->dtm_in_message.topology_update_v2.display_handle = display->index;
144         dtm_cmd->dtm_in_message.topology_update_v2.is_active = 1;
145         dtm_cmd->dtm_in_message.topology_update_v2.controller = display->controller;
146         dtm_cmd->dtm_in_message.topology_update_v2.ddc_line = link->ddc_line;
147         dtm_cmd->dtm_in_message.topology_update_v2.dig_be = link->dig_be;
148         dtm_cmd->dtm_in_message.topology_update_v2.dig_fe = display->dig_fe;
149         if (is_dp_hdcp(hdcp))
150                 dtm_cmd->dtm_in_message.topology_update_v2.is_assr = link->dp.assr_enabled;
151
152         dtm_cmd->dtm_in_message.topology_update_v2.dp_mst_vcid = display->vc_id;
153         dtm_cmd->dtm_in_message.topology_update_v2.max_hdcp_supported_version =
154                         TA_DTM_HDCP_VERSION_MAX_SUPPORTED__2_2;
155         dtm_cmd->dtm_status = TA_DTM_STATUS__GENERIC_FAILURE;
156
157         psp_dtm_invoke(psp, dtm_cmd->cmd_id);
158
159         if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS) {
160                 display->state = MOD_HDCP_DISPLAY_INACTIVE;
161                 status = MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE;
162         } else {
163                 HDCP_TOP_ADD_DISPLAY_TRACE(hdcp, display->index);
164         }
165
166         mutex_unlock(&psp->dtm_context.mutex);
167         return status;
168 }
169
170 static enum mod_hdcp_status add_display_to_topology_v3(
171                 struct mod_hdcp *hdcp, struct mod_hdcp_display *display)
172 {
173         struct psp_context *psp = hdcp->config.psp.handle;
174         struct ta_dtm_shared_memory *dtm_cmd;
175         struct mod_hdcp_link *link = &hdcp->connection.link;
176         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
177
178         if (!psp->dtm_context.context.initialized) {
179                 DRM_INFO("Failed to add display topology, DTM TA is not initialized.");
180                 display->state = MOD_HDCP_DISPLAY_INACTIVE;
181                 return MOD_HDCP_STATUS_FAILURE;
182         }
183
184         dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.context.mem_context.shared_buf;
185
186         mutex_lock(&psp->dtm_context.mutex);
187         memset(dtm_cmd, 0, sizeof(struct ta_dtm_shared_memory));
188
189         dtm_cmd->cmd_id = TA_DTM_COMMAND__TOPOLOGY_UPDATE_V3;
190         dtm_cmd->dtm_in_message.topology_update_v3.display_handle = display->index;
191         dtm_cmd->dtm_in_message.topology_update_v3.is_active = 1;
192         dtm_cmd->dtm_in_message.topology_update_v3.controller = display->controller;
193         dtm_cmd->dtm_in_message.topology_update_v3.ddc_line = link->ddc_line;
194         dtm_cmd->dtm_in_message.topology_update_v3.link_enc = link->link_enc_idx;
195         dtm_cmd->dtm_in_message.topology_update_v3.stream_enc = display->stream_enc_idx;
196         if (is_dp_hdcp(hdcp))
197                 dtm_cmd->dtm_in_message.topology_update_v3.is_assr = link->dp.assr_enabled;
198
199         dtm_cmd->dtm_in_message.topology_update_v3.dp_mst_vcid = display->vc_id;
200         dtm_cmd->dtm_in_message.topology_update_v3.max_hdcp_supported_version =
201                         TA_DTM_HDCP_VERSION_MAX_SUPPORTED__2_3;
202         dtm_cmd->dtm_in_message.topology_update_v3.encoder_type = TA_DTM_ENCODER_TYPE__DIG;
203         dtm_cmd->dtm_status = TA_DTM_STATUS__GENERIC_FAILURE;
204         dtm_cmd->dtm_in_message.topology_update_v3.phy_id = link->phy_idx;
205         dtm_cmd->dtm_in_message.topology_update_v3.link_hdcp_cap = link->hdcp_supported_informational;
206
207         psp_dtm_invoke(psp, dtm_cmd->cmd_id);
208
209         if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS) {
210                 status = add_display_to_topology_v2(hdcp, display);
211                 if (status != MOD_HDCP_STATUS_SUCCESS)
212                         display->state = MOD_HDCP_DISPLAY_INACTIVE;
213         } else {
214                 HDCP_TOP_ADD_DISPLAY_TRACE(hdcp, display->index);
215         }
216
217         mutex_unlock(&psp->dtm_context.mutex);
218
219         return status;
220 }
221
222 enum mod_hdcp_status mod_hdcp_remove_display_from_topology(
223                 struct mod_hdcp *hdcp, uint8_t index)
224 {
225         enum mod_hdcp_status status = MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE;
226
227         if (hdcp->config.psp.caps.dtm_v3_supported)
228                 status = remove_display_from_topology_v3(hdcp, index);
229         else
230                 status = remove_display_from_topology_v2(hdcp, index);
231
232         return status;
233 }
234
235 enum mod_hdcp_status mod_hdcp_add_display_to_topology(struct mod_hdcp *hdcp,
236                                                struct mod_hdcp_display *display)
237 {
238         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
239
240         if (hdcp->config.psp.caps.dtm_v3_supported)
241                 status = add_display_to_topology_v3(hdcp, display);
242         else
243                 status = add_display_to_topology_v2(hdcp, display);
244
245         return status;
246 }
247
248 enum mod_hdcp_status mod_hdcp_hdcp1_create_session(struct mod_hdcp *hdcp)
249 {
250
251         struct psp_context *psp = hdcp->config.psp.handle;
252         struct mod_hdcp_display *display = get_first_active_display(hdcp);
253         struct ta_hdcp_shared_memory *hdcp_cmd;
254         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
255
256         if (!psp->hdcp_context.context.initialized) {
257                 DRM_ERROR("Failed to create hdcp session. HDCP TA is not initialized.");
258                 return MOD_HDCP_STATUS_FAILURE;
259         }
260
261         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
262
263         mutex_lock(&psp->hdcp_context.mutex);
264         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
265
266         hdcp_cmd->in_msg.hdcp1_create_session.display_handle = display->index;
267         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_CREATE_SESSION;
268
269         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
270
271         hdcp->auth.id = hdcp_cmd->out_msg.hdcp1_create_session.session_handle;
272
273         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS) {
274                 status = MOD_HDCP_STATUS_HDCP1_CREATE_SESSION_FAILURE;
275         } else {
276                 hdcp->auth.msg.hdcp1.ainfo = hdcp_cmd->out_msg.hdcp1_create_session.ainfo_primary;
277                 memcpy(hdcp->auth.msg.hdcp1.aksv, hdcp_cmd->out_msg.hdcp1_create_session.aksv_primary,
278                        sizeof(hdcp->auth.msg.hdcp1.aksv));
279                 memcpy(hdcp->auth.msg.hdcp1.an, hdcp_cmd->out_msg.hdcp1_create_session.an_primary,
280                        sizeof(hdcp->auth.msg.hdcp1.an));
281         }
282
283         mutex_unlock(&psp->hdcp_context.mutex);
284         return status;
285 }
286
287 enum mod_hdcp_status mod_hdcp_hdcp1_destroy_session(struct mod_hdcp *hdcp)
288 {
289
290         struct psp_context *psp = hdcp->config.psp.handle;
291         struct ta_hdcp_shared_memory *hdcp_cmd;
292         uint8_t i = 0;
293         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
294
295         mutex_lock(&psp->hdcp_context.mutex);
296         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
297         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
298
299         hdcp_cmd->in_msg.hdcp1_destroy_session.session_handle = hdcp->auth.id;
300         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_DESTROY_SESSION;
301
302         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
303
304         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS) {
305                 status = MOD_HDCP_STATUS_HDCP1_DESTROY_SESSION_FAILURE;
306         } else {
307                 HDCP_TOP_HDCP1_DESTROY_SESSION_TRACE(hdcp);
308                 for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++)
309                         if (is_display_encryption_enabled(&hdcp->displays[i])) {
310                                 hdcp->displays[i].state =
311                                                         MOD_HDCP_DISPLAY_ACTIVE;
312                                 HDCP_HDCP1_DISABLED_TRACE(
313                                         hdcp, hdcp->displays[i].index);
314                         }
315         }
316
317         mutex_unlock(&psp->hdcp_context.mutex);
318         return status;
319 }
320
321 enum mod_hdcp_status mod_hdcp_hdcp1_validate_rx(struct mod_hdcp *hdcp)
322 {
323         struct psp_context *psp = hdcp->config.psp.handle;
324         struct ta_hdcp_shared_memory *hdcp_cmd;
325         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
326
327         mutex_lock(&psp->hdcp_context.mutex);
328         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
329         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
330
331         hdcp_cmd->in_msg.hdcp1_first_part_authentication.session_handle = hdcp->auth.id;
332
333         memcpy(hdcp_cmd->in_msg.hdcp1_first_part_authentication.bksv_primary, hdcp->auth.msg.hdcp1.bksv,
334                 TA_HDCP__HDCP1_KSV_SIZE);
335
336         hdcp_cmd->in_msg.hdcp1_first_part_authentication.r0_prime_primary = hdcp->auth.msg.hdcp1.r0p;
337         hdcp_cmd->in_msg.hdcp1_first_part_authentication.bcaps = hdcp->auth.msg.hdcp1.bcaps;
338         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_FIRST_PART_AUTHENTICATION;
339
340         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
341
342         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS) {
343                 status = MOD_HDCP_STATUS_HDCP1_VALIDATE_RX_FAILURE;
344         } else if (hdcp_cmd->out_msg.hdcp1_first_part_authentication.authentication_status ==
345             TA_HDCP_AUTHENTICATION_STATUS__HDCP1_FIRST_PART_COMPLETE) {
346                 /* needs second part of authentication */
347                 hdcp->connection.is_repeater = 1;
348         } else if (hdcp_cmd->out_msg.hdcp1_first_part_authentication.authentication_status ==
349                    TA_HDCP_AUTHENTICATION_STATUS__HDCP1_AUTHENTICATED) {
350                 hdcp->connection.is_repeater = 0;
351         } else if (hdcp_cmd->out_msg.hdcp1_first_part_authentication.authentication_status ==
352                    TA_HDCP_AUTHENTICATION_STATUS__HDCP1_KSV_REVOKED) {
353                 hdcp->connection.is_hdcp1_revoked = 1;
354                 status = MOD_HDCP_STATUS_HDCP1_BKSV_REVOKED;
355         } else
356                 status = MOD_HDCP_STATUS_HDCP1_VALIDATE_RX_FAILURE;
357
358         mutex_unlock(&psp->hdcp_context.mutex);
359         return status;
360 }
361
362 enum mod_hdcp_status mod_hdcp_hdcp1_enable_encryption(struct mod_hdcp *hdcp)
363 {
364         struct psp_context *psp = hdcp->config.psp.handle;
365         struct ta_hdcp_shared_memory *hdcp_cmd;
366         struct mod_hdcp_display *display = get_first_active_display(hdcp);
367         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
368
369         mutex_lock(&psp->hdcp_context.mutex);
370         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
371         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
372
373         hdcp_cmd->in_msg.hdcp1_enable_encryption.session_handle = hdcp->auth.id;
374         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_ENABLE_ENCRYPTION;
375
376         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
377
378         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS) {
379                 status = MOD_HDCP_STATUS_HDCP1_ENABLE_ENCRYPTION_FAILURE;
380         } else if (!is_dp_mst_hdcp(hdcp)) {
381                 display->state = MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED;
382                 HDCP_HDCP1_ENABLED_TRACE(hdcp, display->index);
383         }
384
385         mutex_unlock(&psp->hdcp_context.mutex);
386         return status;
387 }
388
389 enum mod_hdcp_status mod_hdcp_hdcp1_validate_ksvlist_vp(struct mod_hdcp *hdcp)
390 {
391         struct psp_context *psp = hdcp->config.psp.handle;
392         struct ta_hdcp_shared_memory *hdcp_cmd;
393         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
394
395         mutex_lock(&psp->hdcp_context.mutex);
396         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
397         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
398
399         hdcp_cmd->in_msg.hdcp1_second_part_authentication.session_handle = hdcp->auth.id;
400
401         hdcp_cmd->in_msg.hdcp1_second_part_authentication.ksv_list_size = hdcp->auth.msg.hdcp1.ksvlist_size;
402         memcpy(hdcp_cmd->in_msg.hdcp1_second_part_authentication.ksv_list, hdcp->auth.msg.hdcp1.ksvlist,
403                hdcp->auth.msg.hdcp1.ksvlist_size);
404
405         memcpy(hdcp_cmd->in_msg.hdcp1_second_part_authentication.v_prime, hdcp->auth.msg.hdcp1.vp,
406                sizeof(hdcp->auth.msg.hdcp1.vp));
407
408         hdcp_cmd->in_msg.hdcp1_second_part_authentication.bstatus_binfo =
409                 is_dp_hdcp(hdcp) ? hdcp->auth.msg.hdcp1.binfo_dp : hdcp->auth.msg.hdcp1.bstatus;
410         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_SECOND_PART_AUTHENTICATION;
411
412         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
413
414         if (hdcp_cmd->hdcp_status == TA_HDCP_STATUS__SUCCESS &&
415             hdcp_cmd->out_msg.hdcp1_second_part_authentication.authentication_status ==
416                     TA_HDCP_AUTHENTICATION_STATUS__HDCP1_AUTHENTICATED) {
417                 status = MOD_HDCP_STATUS_SUCCESS;
418         } else if (hdcp_cmd->out_msg.hdcp1_second_part_authentication.authentication_status ==
419                    TA_HDCP_AUTHENTICATION_STATUS__HDCP1_KSV_REVOKED) {
420                 hdcp->connection.is_hdcp1_revoked = 1;
421                 status = MOD_HDCP_STATUS_HDCP1_KSV_LIST_REVOKED;
422         } else {
423                 status = MOD_HDCP_STATUS_HDCP1_VALIDATE_KSV_LIST_FAILURE;
424         }
425
426         mutex_unlock(&psp->hdcp_context.mutex);
427         return status;
428 }
429
430 enum mod_hdcp_status mod_hdcp_hdcp1_enable_dp_stream_encryption(struct mod_hdcp *hdcp)
431 {
432
433         struct psp_context *psp = hdcp->config.psp.handle;
434         struct ta_hdcp_shared_memory *hdcp_cmd;
435         int i = 0;
436         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
437
438         mutex_lock(&psp->hdcp_context.mutex);
439         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
440
441         for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++) {
442
443                 if (hdcp->displays[i].adjust.disable || hdcp->displays[i].state != MOD_HDCP_DISPLAY_ACTIVE)
444                                 continue;
445
446                 memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
447
448                 hdcp_cmd->in_msg.hdcp1_enable_dp_stream_encryption.session_handle = hdcp->auth.id;
449                 hdcp_cmd->in_msg.hdcp1_enable_dp_stream_encryption.display_handle = hdcp->displays[i].index;
450                 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_ENABLE_DP_STREAM_ENCRYPTION;
451
452                 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
453
454                 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS) {
455                         status = MOD_HDCP_STATUS_HDCP1_ENABLE_STREAM_ENCRYPTION_FAILURE;
456                         break;
457                 }
458
459                 hdcp->displays[i].state = MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED;
460                 HDCP_HDCP1_ENABLED_TRACE(hdcp, hdcp->displays[i].index);
461         }
462
463         mutex_unlock(&psp->hdcp_context.mutex);
464         return status;
465 }
466
467 enum mod_hdcp_status mod_hdcp_hdcp1_link_maintenance(struct mod_hdcp *hdcp)
468 {
469         struct psp_context *psp = hdcp->config.psp.handle;
470         struct ta_hdcp_shared_memory *hdcp_cmd;
471         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
472
473         mutex_lock(&psp->hdcp_context.mutex);
474         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
475
476         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
477
478         hdcp_cmd->in_msg.hdcp1_get_encryption_status.session_handle = hdcp->auth.id;
479
480         hdcp_cmd->out_msg.hdcp1_get_encryption_status.protection_level = 0;
481         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP1_GET_ENCRYPTION_STATUS;
482
483         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
484
485         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS ||
486                         hdcp_cmd->out_msg.hdcp1_get_encryption_status.protection_level != 1)
487                 status = MOD_HDCP_STATUS_HDCP1_LINK_MAINTENANCE_FAILURE;
488
489         mutex_unlock(&psp->hdcp_context.mutex);
490         return status;
491 }
492
493 enum mod_hdcp_status mod_hdcp_hdcp2_create_session(struct mod_hdcp *hdcp)
494 {
495         struct psp_context *psp = hdcp->config.psp.handle;
496         struct ta_hdcp_shared_memory *hdcp_cmd;
497         struct mod_hdcp_display *display = get_first_active_display(hdcp);
498         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
499
500
501         if (!psp->hdcp_context.context.initialized) {
502                 DRM_ERROR("Failed to create hdcp session, HDCP TA is not initialized");
503                 return MOD_HDCP_STATUS_FAILURE;
504         }
505
506         if (!display)
507                 return MOD_HDCP_STATUS_DISPLAY_NOT_FOUND;
508
509         mutex_lock(&psp->hdcp_context.mutex);
510
511         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
512         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
513
514         hdcp_cmd->in_msg.hdcp2_create_session_v2.display_handle = display->index;
515
516         if (hdcp->connection.link.adjust.hdcp2.force_type == MOD_HDCP_FORCE_TYPE_0)
517                 hdcp_cmd->in_msg.hdcp2_create_session_v2.negotiate_content_type =
518                         TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__FORCE_TYPE0;
519         else if (hdcp->connection.link.adjust.hdcp2.force_type == MOD_HDCP_FORCE_TYPE_1)
520                 hdcp_cmd->in_msg.hdcp2_create_session_v2.negotiate_content_type =
521                         TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__FORCE_TYPE1;
522         else if (hdcp->connection.link.adjust.hdcp2.force_type == MOD_HDCP_FORCE_TYPE_MAX)
523                 hdcp_cmd->in_msg.hdcp2_create_session_v2.negotiate_content_type =
524                         TA_HDCP2_CONTENT_TYPE_NEGOTIATION_TYPE__MAX_SUPPORTED;
525
526         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_CREATE_SESSION_V2;
527
528         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
529
530
531         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
532                 status = MOD_HDCP_STATUS_HDCP2_CREATE_SESSION_FAILURE;
533         else
534                 hdcp->auth.id = hdcp_cmd->out_msg.hdcp2_create_session_v2.session_handle;
535
536         mutex_unlock(&psp->hdcp_context.mutex);
537         return status;
538 }
539
540 enum mod_hdcp_status mod_hdcp_hdcp2_destroy_session(struct mod_hdcp *hdcp)
541 {
542         struct psp_context *psp = hdcp->config.psp.handle;
543         struct ta_hdcp_shared_memory *hdcp_cmd;
544         uint8_t i = 0;
545         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
546
547         mutex_lock(&psp->hdcp_context.mutex);
548         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
549         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
550
551         hdcp_cmd->in_msg.hdcp2_destroy_session.session_handle = hdcp->auth.id;
552         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_DESTROY_SESSION;
553
554         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
555
556         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS) {
557                 status = MOD_HDCP_STATUS_HDCP2_DESTROY_SESSION_FAILURE;
558         } else {
559                 HDCP_TOP_HDCP2_DESTROY_SESSION_TRACE(hdcp);
560                 for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++)
561                         if (is_display_encryption_enabled(&hdcp->displays[i])) {
562                                 hdcp->displays[i].state =
563                                                         MOD_HDCP_DISPLAY_ACTIVE;
564                                 HDCP_HDCP2_DISABLED_TRACE(
565                                         hdcp, hdcp->displays[i].index);
566                         }
567         }
568
569         mutex_unlock(&psp->hdcp_context.mutex);
570         return status;
571 }
572
573 enum mod_hdcp_status mod_hdcp_hdcp2_prepare_ake_init(struct mod_hdcp *hdcp)
574 {
575         struct psp_context *psp = hdcp->config.psp.handle;
576         struct ta_hdcp_shared_memory *hdcp_cmd;
577         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
578         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
579         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
580
581         mutex_lock(&psp->hdcp_context.mutex);
582         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
583         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
584
585         msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
586         msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
587
588         hdcp2_message_init(hdcp, msg_in);
589
590         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
591         msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__AKE_INIT;
592
593         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
594
595         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
596                 status = MOD_HDCP_STATUS_HDCP2_PREP_AKE_INIT_FAILURE;
597         else
598                 memcpy(&hdcp->auth.msg.hdcp2.ake_init[0], &msg_out->prepare.transmitter_message[0],
599                        sizeof(hdcp->auth.msg.hdcp2.ake_init));
600
601         mutex_unlock(&psp->hdcp_context.mutex);
602         return status;
603 }
604
605 enum mod_hdcp_status mod_hdcp_hdcp2_validate_ake_cert(struct mod_hdcp *hdcp)
606 {
607         struct psp_context *psp = hdcp->config.psp.handle;
608         struct ta_hdcp_shared_memory *hdcp_cmd;
609         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
610         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
611         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
612
613         mutex_lock(&psp->hdcp_context.mutex);
614         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
615         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
616
617         msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
618         msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
619
620         hdcp2_message_init(hdcp, msg_in);
621
622         msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__AKE_SEND_CERT;
623         msg_in->process.msg1_desc.msg_size = TA_HDCP_HDCP2_MSG_ID_MAX_SIZE__AKE_SEND_CERT;
624
625         memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.ake_cert,
626                sizeof(hdcp->auth.msg.hdcp2.ake_cert));
627
628         msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__AKE_NO_STORED_KM;
629         msg_in->prepare.msg2_id = TA_HDCP_HDCP2_MSG_ID__AKE_STORED_KM;
630
631         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
632
633         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
634
635         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS) {
636                 status = MOD_HDCP_STATUS_HDCP2_VALIDATE_AKE_CERT_FAILURE;
637         } else {
638                 memcpy(hdcp->auth.msg.hdcp2.ake_no_stored_km,
639                        &msg_out->prepare.transmitter_message[0],
640                        sizeof(hdcp->auth.msg.hdcp2.ake_no_stored_km));
641
642                 memcpy(hdcp->auth.msg.hdcp2.ake_stored_km,
643                        &msg_out->prepare.transmitter_message[sizeof(hdcp->auth.msg.hdcp2.ake_no_stored_km)],
644                        sizeof(hdcp->auth.msg.hdcp2.ake_stored_km));
645
646                 if (msg_out->process.msg1_status ==
647                     TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS) {
648                         hdcp->connection.is_km_stored =
649                                 msg_out->process.is_km_stored ? 1 : 0;
650                         hdcp->connection.is_repeater =
651                                 msg_out->process.is_repeater ? 1 : 0;
652                         status = MOD_HDCP_STATUS_SUCCESS;
653                 } else if (msg_out->process.msg1_status ==
654                            TA_HDCP2_MSG_AUTHENTICATION_STATUS__RECEIVERID_REVOKED) {
655                         hdcp->connection.is_hdcp2_revoked = 1;
656                         status = MOD_HDCP_STATUS_HDCP2_AKE_CERT_REVOKED;
657                 }  else {
658                         status = MOD_HDCP_STATUS_HDCP2_VALIDATE_AKE_CERT_FAILURE;
659                 }
660         }
661         mutex_unlock(&psp->hdcp_context.mutex);
662         return status;
663 }
664
665 enum mod_hdcp_status mod_hdcp_hdcp2_validate_h_prime(struct mod_hdcp *hdcp)
666 {
667         struct psp_context *psp = hdcp->config.psp.handle;
668         struct ta_hdcp_shared_memory *hdcp_cmd;
669         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
670         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
671         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
672
673         mutex_lock(&psp->hdcp_context.mutex);
674         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
675         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
676
677         msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
678         msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
679
680         hdcp2_message_init(hdcp, msg_in);
681
682         msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__AKE_SEND_H_PRIME;
683         msg_in->process.msg1_desc.msg_size = TA_HDCP_HDCP2_MSG_ID_MAX_SIZE__AKE_SEND_H_PRIME;
684
685         memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.ake_h_prime,
686                sizeof(hdcp->auth.msg.hdcp2.ake_h_prime));
687
688         if (!hdcp->connection.is_km_stored) {
689                 msg_in->process.msg2_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__AKE_SEND_PAIRING_INFO;
690                 msg_in->process.msg2_desc.msg_size = TA_HDCP_HDCP2_MSG_ID_MAX_SIZE__AKE_SEND_PAIRING_INFO;
691                 memcpy(&msg_in->process.receiver_message[sizeof(hdcp->auth.msg.hdcp2.ake_h_prime)],
692                        hdcp->auth.msg.hdcp2.ake_pairing_info, sizeof(hdcp->auth.msg.hdcp2.ake_pairing_info));
693         }
694
695         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
696
697         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
698
699         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
700                 status = MOD_HDCP_STATUS_HDCP2_VALIDATE_H_PRIME_FAILURE;
701         else if (msg_out->process.msg1_status != TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS)
702                 status = MOD_HDCP_STATUS_HDCP2_VALIDATE_H_PRIME_FAILURE;
703         else if (!hdcp->connection.is_km_stored &&
704                    msg_out->process.msg2_status != TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS)
705                 status = MOD_HDCP_STATUS_HDCP2_VALIDATE_PAIRING_INFO_FAILURE;
706
707         mutex_unlock(&psp->hdcp_context.mutex);
708         return status;
709 }
710
711 enum mod_hdcp_status mod_hdcp_hdcp2_prepare_lc_init(struct mod_hdcp *hdcp)
712 {
713         struct psp_context *psp = hdcp->config.psp.handle;
714         struct ta_hdcp_shared_memory *hdcp_cmd;
715         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
716         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
717         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
718
719         mutex_lock(&psp->hdcp_context.mutex);
720         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
721         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
722
723         msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
724         msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
725
726         hdcp2_message_init(hdcp, msg_in);
727
728         msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__LC_INIT;
729
730         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
731
732         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
733
734         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
735                 status = MOD_HDCP_STATUS_HDCP2_PREP_LC_INIT_FAILURE;
736         else
737                 memcpy(hdcp->auth.msg.hdcp2.lc_init, &msg_out->prepare.transmitter_message[0],
738                        sizeof(hdcp->auth.msg.hdcp2.lc_init));
739
740         mutex_unlock(&psp->hdcp_context.mutex);
741         return status;
742 }
743
744 enum mod_hdcp_status mod_hdcp_hdcp2_validate_l_prime(struct mod_hdcp *hdcp)
745 {
746         struct psp_context *psp = hdcp->config.psp.handle;
747         struct ta_hdcp_shared_memory *hdcp_cmd;
748         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
749         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
750         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
751
752         mutex_lock(&psp->hdcp_context.mutex);
753         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
754         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
755
756         msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
757         msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
758
759         hdcp2_message_init(hdcp, msg_in);
760
761         msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__LC_SEND_L_PRIME;
762         msg_in->process.msg1_desc.msg_size = TA_HDCP_HDCP2_MSG_ID_MAX_SIZE__LC_SEND_L_PRIME;
763
764         memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.lc_l_prime,
765                sizeof(hdcp->auth.msg.hdcp2.lc_l_prime));
766
767         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
768
769         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
770
771         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS ||
772                         msg_out->process.msg1_status != TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS)
773                 status = MOD_HDCP_STATUS_HDCP2_VALIDATE_L_PRIME_FAILURE;
774
775         mutex_unlock(&psp->hdcp_context.mutex);
776         return status;
777 }
778
779 enum mod_hdcp_status mod_hdcp_hdcp2_prepare_eks(struct mod_hdcp *hdcp)
780 {
781         struct psp_context *psp = hdcp->config.psp.handle;
782         struct ta_hdcp_shared_memory *hdcp_cmd;
783         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
784         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
785         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
786
787         mutex_lock(&psp->hdcp_context.mutex);
788         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
789         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
790
791         msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
792         msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
793
794         hdcp2_message_init(hdcp, msg_in);
795
796         msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__SKE_SEND_EKS;
797
798         if (is_dp_hdcp(hdcp))
799                 msg_in->prepare.msg2_id = TA_HDCP_HDCP2_MSG_ID__SIGNAL_CONTENT_STREAM_TYPE_DP;
800
801         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
802         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
803
804         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS) {
805                 status = MOD_HDCP_STATUS_HDCP2_PREP_EKS_FAILURE;
806         } else {
807                 memcpy(hdcp->auth.msg.hdcp2.ske_eks,
808                        &msg_out->prepare.transmitter_message[0],
809                        sizeof(hdcp->auth.msg.hdcp2.ske_eks));
810                 msg_out->prepare.msg1_desc.msg_size =
811                         sizeof(hdcp->auth.msg.hdcp2.ske_eks);
812
813                 if (is_dp_hdcp(hdcp)) {
814                         memcpy(hdcp->auth.msg.hdcp2.content_stream_type_dp,
815                                &msg_out->prepare.transmitter_message[sizeof(hdcp->auth.msg.hdcp2.ske_eks)],
816                                sizeof(hdcp->auth.msg.hdcp2.content_stream_type_dp));
817                 }
818         }
819         mutex_unlock(&psp->hdcp_context.mutex);
820
821         return status;
822 }
823
824 enum mod_hdcp_status mod_hdcp_hdcp2_enable_encryption(struct mod_hdcp *hdcp)
825 {
826         struct psp_context *psp = hdcp->config.psp.handle;
827         struct ta_hdcp_shared_memory *hdcp_cmd;
828         struct mod_hdcp_display *display = get_first_active_display(hdcp);
829         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
830
831         if (!display)
832                 return MOD_HDCP_STATUS_DISPLAY_NOT_FOUND;
833
834         mutex_lock(&psp->hdcp_context.mutex);
835
836         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
837         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
838
839         hdcp_cmd->in_msg.hdcp2_set_encryption.session_handle = hdcp->auth.id;
840
841         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_SET_ENCRYPTION;
842         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
843
844         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS) {
845                 status = MOD_HDCP_STATUS_HDCP2_ENABLE_ENCRYPTION_FAILURE;
846         } else if (!is_dp_mst_hdcp(hdcp)) {
847                 display->state = MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED;
848                 HDCP_HDCP2_ENABLED_TRACE(hdcp, display->index);
849         }
850
851         mutex_unlock(&psp->hdcp_context.mutex);
852         return status;
853 }
854
855 enum mod_hdcp_status mod_hdcp_hdcp2_validate_rx_id_list(struct mod_hdcp *hdcp)
856 {
857         struct psp_context *psp = hdcp->config.psp.handle;
858         struct ta_hdcp_shared_memory *hdcp_cmd;
859         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
860         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
861         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
862
863         mutex_lock(&psp->hdcp_context.mutex);
864
865         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
866         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
867
868         msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
869         msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
870
871         hdcp2_message_init(hdcp, msg_in);
872
873         msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__REPEATERAUTH_SEND_RECEIVERID_LIST;
874         msg_in->process.msg1_desc.msg_size = sizeof(hdcp->auth.msg.hdcp2.rx_id_list);
875         memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.rx_id_list,
876                sizeof(hdcp->auth.msg.hdcp2.rx_id_list));
877
878         msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__REPEATERAUTH_SEND_ACK;
879
880         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
881
882         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
883
884         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS) {
885                 status = MOD_HDCP_STATUS_HDCP2_VALIDATE_RX_ID_LIST_FAILURE;
886         } else {
887                 memcpy(hdcp->auth.msg.hdcp2.repeater_auth_ack,
888                        &msg_out->prepare.transmitter_message[0],
889                        sizeof(hdcp->auth.msg.hdcp2.repeater_auth_ack));
890
891                 if (msg_out->process.msg1_status ==
892                     TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS) {
893                         hdcp->connection.is_km_stored = msg_out->process.is_km_stored ? 1 : 0;
894                         hdcp->connection.is_repeater = msg_out->process.is_repeater ? 1 : 0;
895                         status = MOD_HDCP_STATUS_SUCCESS;
896                 } else if (msg_out->process.msg1_status ==
897                            TA_HDCP2_MSG_AUTHENTICATION_STATUS__RECEIVERID_REVOKED) {
898                         hdcp->connection.is_hdcp2_revoked = 1;
899                         status = MOD_HDCP_STATUS_HDCP2_RX_ID_LIST_REVOKED;
900                 } else {
901                         status = MOD_HDCP_STATUS_HDCP2_VALIDATE_RX_ID_LIST_FAILURE;
902                 }
903         }
904         mutex_unlock(&psp->hdcp_context.mutex);
905         return status;
906 }
907
908 enum mod_hdcp_status mod_hdcp_hdcp2_enable_dp_stream_encryption(struct mod_hdcp *hdcp)
909 {
910         struct psp_context *psp = hdcp->config.psp.handle;
911         struct ta_hdcp_shared_memory *hdcp_cmd;
912         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
913         uint8_t i;
914         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
915
916         mutex_lock(&psp->hdcp_context.mutex);
917         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
918         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
919
920         msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
921
922         hdcp2_message_init(hdcp, msg_in);
923
924
925         for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++) {
926                 if (hdcp->displays[i].adjust.disable || hdcp->displays[i].state != MOD_HDCP_DISPLAY_ACTIVE)
927                                 continue;
928
929                 hdcp_cmd->in_msg.hdcp2_enable_dp_stream_encryption.display_handle = hdcp->displays[i].index;
930                 hdcp_cmd->in_msg.hdcp2_enable_dp_stream_encryption.session_handle = hdcp->auth.id;
931
932                 hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_ENABLE_DP_STREAM_ENCRYPTION;
933                 psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
934
935                 if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS)
936                         break;
937
938                 hdcp->displays[i].state = MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED;
939                 HDCP_HDCP2_ENABLED_TRACE(hdcp, hdcp->displays[i].index);
940         }
941
942         if (hdcp_cmd->hdcp_status == TA_HDCP_STATUS__SUCCESS)
943                 status = MOD_HDCP_STATUS_SUCCESS;
944         else
945                 status = MOD_HDCP_STATUS_HDCP2_ENABLE_STREAM_ENCRYPTION_FAILURE;
946
947         mutex_unlock(&psp->hdcp_context.mutex);
948         return status;
949 }
950
951 enum mod_hdcp_status mod_hdcp_hdcp2_prepare_stream_management(struct mod_hdcp *hdcp)
952 {
953
954         struct psp_context *psp = hdcp->config.psp.handle;
955         struct ta_hdcp_shared_memory *hdcp_cmd;
956         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
957         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
958         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
959
960         mutex_lock(&psp->hdcp_context.mutex);
961         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
962         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
963
964         msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
965         msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
966
967         hdcp2_message_init(hdcp, msg_in);
968
969         msg_in->prepare.msg1_id = TA_HDCP_HDCP2_MSG_ID__REPEATERAUTH_STREAM_MANAGE;
970
971
972         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
973         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
974
975         if (hdcp_cmd->hdcp_status != TA_HDCP_STATUS__SUCCESS) {
976                 status = MOD_HDCP_STATUS_HDCP2_PREPARE_STREAM_MANAGEMENT_FAILURE;
977         } else {
978                 hdcp->auth.msg.hdcp2.stream_manage_size = msg_out->prepare.msg1_desc.msg_size;
979
980                 memcpy(hdcp->auth.msg.hdcp2.repeater_auth_stream_manage,
981                        &msg_out->prepare.transmitter_message[0],
982                        sizeof(hdcp->auth.msg.hdcp2.repeater_auth_stream_manage));
983         }
984         mutex_unlock(&psp->hdcp_context.mutex);
985         return status;
986 }
987
988 enum mod_hdcp_status mod_hdcp_hdcp2_validate_stream_ready(struct mod_hdcp *hdcp)
989 {
990         struct psp_context *psp = hdcp->config.psp.handle;
991         struct ta_hdcp_shared_memory *hdcp_cmd;
992         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_input_v2 *msg_in;
993         struct ta_hdcp_cmd_hdcp2_process_prepare_authentication_message_output_v2 *msg_out;
994         enum mod_hdcp_status status = MOD_HDCP_STATUS_SUCCESS;
995
996         mutex_lock(&psp->hdcp_context.mutex);
997         hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.context.mem_context.shared_buf;
998         memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
999
1000         msg_in = &hdcp_cmd->in_msg.hdcp2_prepare_process_authentication_message_v2;
1001         msg_out = &hdcp_cmd->out_msg.hdcp2_prepare_process_authentication_message_v2;
1002
1003         hdcp2_message_init(hdcp, msg_in);
1004
1005         msg_in->process.msg1_desc.msg_id = TA_HDCP_HDCP2_MSG_ID__REPEATERAUTH_STREAM_READY;
1006
1007         msg_in->process.msg1_desc.msg_size = sizeof(hdcp->auth.msg.hdcp2.repeater_auth_stream_ready);
1008
1009         memcpy(&msg_in->process.receiver_message[0], hdcp->auth.msg.hdcp2.repeater_auth_stream_ready,
1010                sizeof(hdcp->auth.msg.hdcp2.repeater_auth_stream_ready));
1011
1012         hdcp_cmd->cmd_id = TA_HDCP_COMMAND__HDCP2_PREPARE_PROCESS_AUTHENTICATION_MSG_V2;
1013         psp_hdcp_invoke(psp, hdcp_cmd->cmd_id);
1014
1015         if (hdcp_cmd->hdcp_status == TA_HDCP_STATUS__SUCCESS &&
1016             msg_out->process.msg1_status == TA_HDCP2_MSG_AUTHENTICATION_STATUS__SUCCESS)
1017                 status = MOD_HDCP_STATUS_SUCCESS;
1018         else
1019                 status = MOD_HDCP_STATUS_HDCP2_VALIDATE_STREAM_READY_FAILURE;
1020
1021         mutex_unlock(&psp->hdcp_context.mutex);
1022         return status;
1023 }