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