1c76631c5SZiyuan Xu /* 2*085e80ecSAntonio 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 710301bf7SZiyuan Xu #include <cdn_dp.h> 8*085e80ecSAntonio Nino Diaz #include <smccc.h> 9c76631c5SZiyuan Xu #include <stdlib.h> 1010301bf7SZiyuan 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 2310301bf7SZiyuan Xu static uint64_t *hdcp_key_pdata; 2410301bf7SZiyuan Xu static struct cdn_dp_hdcp_key_1x key; 2510301bf7SZiyuan Xu 2610301bf7SZiyuan Xu int hdcp_handler(struct cdn_dp_hdcp_key_1x *key); 2710301bf7SZiyuan Xu 2810301bf7SZiyuan Xu uint64_t dp_hdcp_ctrl(uint64_t type) 2910301bf7SZiyuan Xu { 3010301bf7SZiyuan Xu switch (type) { 3110301bf7SZiyuan Xu case HDCP_KEY_DATA_START_TRANSFER: 3210301bf7SZiyuan Xu memset(&key, 0x00, sizeof(key)); 3310301bf7SZiyuan Xu hdcp_key_pdata = (uint64_t *)&key; 3410301bf7SZiyuan Xu return 0; 3510301bf7SZiyuan Xu case HDCP_KEY_DATA_START_DECRYPT: 3610301bf7SZiyuan Xu if (hdcp_key_pdata == (uint64_t *)(&key + 1)) 3710301bf7SZiyuan Xu return hdcp_handler(&key); 3810301bf7SZiyuan Xu else 3910301bf7SZiyuan Xu return PSCI_E_INVALID_PARAMS; 4010301bf7SZiyuan Xu default: 4110301bf7SZiyuan Xu return SMC_UNK; 4210301bf7SZiyuan Xu } 4310301bf7SZiyuan Xu } 4410301bf7SZiyuan Xu 4510301bf7SZiyuan Xu uint64_t dp_hdcp_store_key(uint64_t x1, 4610301bf7SZiyuan Xu uint64_t x2, 4710301bf7SZiyuan Xu uint64_t x3, 4810301bf7SZiyuan Xu uint64_t x4, 4910301bf7SZiyuan Xu uint64_t x5, 5010301bf7SZiyuan Xu uint64_t x6) 5110301bf7SZiyuan Xu { 5210301bf7SZiyuan Xu if (hdcp_key_pdata < (uint64_t *)&key || 5310301bf7SZiyuan Xu hdcp_key_pdata + 6 > (uint64_t *)(&key + 1)) 5410301bf7SZiyuan Xu return PSCI_E_INVALID_PARAMS; 5510301bf7SZiyuan Xu 5610301bf7SZiyuan Xu hdcp_key_pdata[0] = x1; 5710301bf7SZiyuan Xu hdcp_key_pdata[1] = x2; 5810301bf7SZiyuan Xu hdcp_key_pdata[2] = x3; 5910301bf7SZiyuan Xu hdcp_key_pdata[3] = x4; 6010301bf7SZiyuan Xu hdcp_key_pdata[4] = x5; 6110301bf7SZiyuan Xu hdcp_key_pdata[5] = x6; 6210301bf7SZiyuan Xu hdcp_key_pdata += 6; 6310301bf7SZiyuan Xu 6410301bf7SZiyuan Xu return 0; 6510301bf7SZiyuan Xu } 66