xref: /rk3399_ARM-atf/plat/rockchip/rk3399/drivers/dp/cdn_dp.c (revision 1a29aba3673b753664e97fcfed1e3d38f138b3b7)
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 }
69