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