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