]> git.proxmox.com Git - mirror_ubuntu-kernels.git/blob - drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c
blk-mq-debugfs: Show active requests per queue for shared tags
[mirror_ubuntu-kernels.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 }