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