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