xref: /rk3399_ARM-atf/plat/rockchip/rk3399/drivers/dp/cdn_dp.c (revision 93c78ed231a6ea30f1c30ecbbb0f245fa9d75075)
1c76631c5SZiyuan Xu /*
2085e80ecSAntonio Nino Diaz  * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
3c76631c5SZiyuan Xu  *
4c76631c5SZiyuan Xu  * SPDX-License-Identifier: BSD-3-Clause
5c76631c5SZiyuan Xu  */
6c76631c5SZiyuan Xu 
7*93c78ed2SAntonio Nino Diaz #include <cdefs.h>
810301bf7SZiyuan Xu #include <cdn_dp.h>
9085e80ecSAntonio Nino Diaz #include <smccc.h>
10c76631c5SZiyuan Xu #include <stdlib.h>
1110301bf7SZiyuan Xu #include <string.h>
12c76631c5SZiyuan Xu 
13c76631c5SZiyuan Xu __asm__(
14c76631c5SZiyuan Xu 	".pushsection .text.hdcp_handler, \"ax\", %progbits\n"
15c76631c5SZiyuan Xu 	".global hdcp_handler\n"
16c76631c5SZiyuan Xu 	".balign 4\n"
17c76631c5SZiyuan Xu 	"hdcp_handler:\n"
18c76631c5SZiyuan Xu 	".incbin \"" __XSTRING(HDCPFW) "\"\n"
19c76631c5SZiyuan Xu 	".type hdcp_handler, %function\n"
20c76631c5SZiyuan Xu 	".size hdcp_handler, .- hdcp_handler\n"
21c76631c5SZiyuan Xu 	".popsection\n"
22c76631c5SZiyuan Xu );
23c76631c5SZiyuan Xu 
2410301bf7SZiyuan Xu static uint64_t *hdcp_key_pdata;
2510301bf7SZiyuan Xu static struct cdn_dp_hdcp_key_1x key;
2610301bf7SZiyuan Xu 
2710301bf7SZiyuan Xu int hdcp_handler(struct cdn_dp_hdcp_key_1x *key);
2810301bf7SZiyuan Xu 
2910301bf7SZiyuan Xu uint64_t dp_hdcp_ctrl(uint64_t type)
3010301bf7SZiyuan Xu {
3110301bf7SZiyuan Xu 	switch (type) {
3210301bf7SZiyuan Xu 	case HDCP_KEY_DATA_START_TRANSFER:
3310301bf7SZiyuan Xu 		memset(&key, 0x00, sizeof(key));
3410301bf7SZiyuan Xu 		hdcp_key_pdata = (uint64_t *)&key;
3510301bf7SZiyuan Xu 		return 0;
3610301bf7SZiyuan Xu 	case HDCP_KEY_DATA_START_DECRYPT:
3710301bf7SZiyuan Xu 		if (hdcp_key_pdata == (uint64_t *)(&key + 1))
3810301bf7SZiyuan Xu 			return hdcp_handler(&key);
3910301bf7SZiyuan Xu 		else
4010301bf7SZiyuan Xu 			return PSCI_E_INVALID_PARAMS;
4110301bf7SZiyuan Xu 	default:
4210301bf7SZiyuan Xu 		return SMC_UNK;
4310301bf7SZiyuan Xu 	}
4410301bf7SZiyuan Xu }
4510301bf7SZiyuan Xu 
4610301bf7SZiyuan Xu uint64_t dp_hdcp_store_key(uint64_t x1,
4710301bf7SZiyuan Xu 			   uint64_t x2,
4810301bf7SZiyuan Xu 			   uint64_t x3,
4910301bf7SZiyuan Xu 			   uint64_t x4,
5010301bf7SZiyuan Xu 			   uint64_t x5,
5110301bf7SZiyuan Xu 			   uint64_t x6)
5210301bf7SZiyuan Xu {
5310301bf7SZiyuan Xu 	if (hdcp_key_pdata < (uint64_t *)&key ||
5410301bf7SZiyuan Xu 		hdcp_key_pdata + 6 > (uint64_t *)(&key + 1))
5510301bf7SZiyuan Xu 		return PSCI_E_INVALID_PARAMS;
5610301bf7SZiyuan Xu 
5710301bf7SZiyuan Xu 	hdcp_key_pdata[0] = x1;
5810301bf7SZiyuan Xu 	hdcp_key_pdata[1] = x2;
5910301bf7SZiyuan Xu 	hdcp_key_pdata[2] = x3;
6010301bf7SZiyuan Xu 	hdcp_key_pdata[3] = x4;
6110301bf7SZiyuan Xu 	hdcp_key_pdata[4] = x5;
6210301bf7SZiyuan Xu 	hdcp_key_pdata[5] = x6;
6310301bf7SZiyuan Xu 	hdcp_key_pdata += 6;
6410301bf7SZiyuan Xu 
6510301bf7SZiyuan Xu 	return 0;
6610301bf7SZiyuan Xu }
67