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