73a75bb7c48f46de6f69514404987d66d1169178
[project/bcm63xx/atf.git] / plat / rockchip / rk3399 / drivers / dp / cdn_dp.c
1 /*
2 * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #include <assert.h>
8 #include <cdefs.h>
9 #include <cdn_dp.h>
10 #include <smccc.h>
11 #include <stdlib.h>
12 #include <string.h>
13
14 __asm__(
15 ".pushsection .text.hdcp_handler, \"ax\", %progbits\n"
16 ".global hdcp_handler\n"
17 ".balign 4\n"
18 "hdcp_handler:\n"
19 ".incbin \"" __XSTRING(HDCPFW) "\"\n"
20 ".type hdcp_handler, %function\n"
21 ".size hdcp_handler, .- hdcp_handler\n"
22 ".popsection\n"
23 );
24
25 static uint64_t *hdcp_key_pdata;
26 static struct cdn_dp_hdcp_key_1x key;
27
28 int hdcp_handler(struct cdn_dp_hdcp_key_1x *key);
29
30 uint64_t dp_hdcp_ctrl(uint64_t type)
31 {
32 switch (type) {
33 case HDCP_KEY_DATA_START_TRANSFER:
34 memset(&key, 0x00, sizeof(key));
35 hdcp_key_pdata = (uint64_t *)&key;
36 return 0;
37 case HDCP_KEY_DATA_START_DECRYPT:
38 if (hdcp_key_pdata == (uint64_t *)(&key + 1))
39 return hdcp_handler(&key);
40 else
41 return PSCI_E_INVALID_PARAMS;
42 assert(0); /* Unreachable */
43 default:
44 return SMC_UNK;
45 }
46 }
47
48 uint64_t dp_hdcp_store_key(uint64_t x1,
49 uint64_t x2,
50 uint64_t x3,
51 uint64_t x4,
52 uint64_t x5,
53 uint64_t x6)
54 {
55 if (hdcp_key_pdata < (uint64_t *)&key ||
56 hdcp_key_pdata + 6 > (uint64_t *)(&key + 1))
57 return PSCI_E_INVALID_PARAMS;
58
59 hdcp_key_pdata[0] = x1;
60 hdcp_key_pdata[1] = x2;
61 hdcp_key_pdata[2] = x3;
62 hdcp_key_pdata[3] = x4;
63 hdcp_key_pdata[4] = x5;
64 hdcp_key_pdata[5] = x6;
65 hdcp_key_pdata += 6;
66
67 return 0;
68 }