blob: a8773f4f6f81ae600ce793773f5a47ce5e508146 [file] [log] [blame]
Ziyuan Xu48890e22016-10-27 19:07:35 +08001/*
Antonio Nino Diaz3c817f42018-03-21 10:49:27 +00002 * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
Ziyuan Xu48890e22016-10-27 19:07:35 +08003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Daniel Boulby8942a1b2018-06-22 14:16:03 +01007#include <assert.h>
Antonio Nino Diaz4b32e622018-08-16 16:52:57 +01008#include <cdefs.h>
Ziyuan Xu48890e22016-10-27 19:07:35 +08009#include <stdlib.h>
Ziyuan Xu4060cfd2017-02-10 11:54:52 +080010#include <string.h>
Ziyuan Xu48890e22016-10-27 19:07:35 +080011
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000012#include <lib/smccc.h>
13
14#include <cdn_dp.h>
15
Ziyuan Xu48890e22016-10-27 19:07:35 +080016__asm__(
17 ".pushsection .text.hdcp_handler, \"ax\", %progbits\n"
18 ".global hdcp_handler\n"
19 ".balign 4\n"
20 "hdcp_handler:\n"
Joshua Watt4f2d8ac2019-12-13 13:44:55 -060021 ".incbin \"" HDCPFW "\"\n"
Ziyuan Xu48890e22016-10-27 19:07:35 +080022 ".type hdcp_handler, %function\n"
23 ".size hdcp_handler, .- hdcp_handler\n"
24 ".popsection\n"
25);
26
Ziyuan Xu4060cfd2017-02-10 11:54:52 +080027static uint64_t *hdcp_key_pdata;
28static struct cdn_dp_hdcp_key_1x key;
29
30int hdcp_handler(struct cdn_dp_hdcp_key_1x *key);
31
32uint64_t dp_hdcp_ctrl(uint64_t type)
33{
34 switch (type) {
35 case HDCP_KEY_DATA_START_TRANSFER:
36 memset(&key, 0x00, sizeof(key));
37 hdcp_key_pdata = (uint64_t *)&key;
38 return 0;
39 case HDCP_KEY_DATA_START_DECRYPT:
40 if (hdcp_key_pdata == (uint64_t *)(&key + 1))
41 return hdcp_handler(&key);
42 else
43 return PSCI_E_INVALID_PARAMS;
Daniel Boulby8942a1b2018-06-22 14:16:03 +010044 assert(0); /* Unreachable */
Ziyuan Xu4060cfd2017-02-10 11:54:52 +080045 default:
46 return SMC_UNK;
47 }
48}
49
50uint64_t dp_hdcp_store_key(uint64_t x1,
51 uint64_t x2,
52 uint64_t x3,
53 uint64_t x4,
54 uint64_t x5,
55 uint64_t x6)
56{
57 if (hdcp_key_pdata < (uint64_t *)&key ||
58 hdcp_key_pdata + 6 > (uint64_t *)(&key + 1))
59 return PSCI_E_INVALID_PARAMS;
60
61 hdcp_key_pdata[0] = x1;
62 hdcp_key_pdata[1] = x2;
63 hdcp_key_pdata[2] = x3;
64 hdcp_key_pdata[3] = x4;
65 hdcp_key_pdata[4] = x5;
66 hdcp_key_pdata[5] = x6;
67 hdcp_key_pdata += 6;
68
69 return 0;
70}