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