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 <stdlib.h>
10 #include <string.h>
11 
12 #include <lib/smccc.h>
13 
14 #include <cdn_dp.h>
15 
16 __asm__(
17 	".pushsection .text.hdcp_handler, \"ax\", %progbits\n"
18 	".global hdcp_handler\n"
19 	".balign 4\n"
20 	"hdcp_handler:\n"
21 	".incbin \"" HDCPFW "\"\n"
22 	".type hdcp_handler, %function\n"
23 	".size hdcp_handler, .- hdcp_handler\n"
24 	".popsection\n"
25 );
26 
27 static uint64_t *hdcp_key_pdata;
28 static struct cdn_dp_hdcp_key_1x key;
29 
30 int hdcp_handler(struct cdn_dp_hdcp_key_1x *key);
31 
dp_hdcp_ctrl(uint64_t type)32 uint64_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;
44 		assert(0); /* Unreachable */
45 	default:
46 		return SMC_UNK;
47 	}
48 }
49 
dp_hdcp_store_key(uint64_t x1,uint64_t x2,uint64_t x3,uint64_t x4,uint64_t x5,uint64_t x6)50 uint64_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 }
71