GK SDK 源码库: XMIPCLinuxV100R005C00SPC030 (kernel/tools/open_source excluded)
This commit is contained in:
+70
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <cdefs.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <lib/smccc.h>
|
||||
|
||||
#include <cdn_dp.h>
|
||||
|
||||
__asm__(
|
||||
".pushsection .text.hdcp_handler, \"ax\", %progbits\n"
|
||||
".global hdcp_handler\n"
|
||||
".balign 4\n"
|
||||
"hdcp_handler:\n"
|
||||
".incbin \"" HDCPFW "\"\n"
|
||||
".type hdcp_handler, %function\n"
|
||||
".size hdcp_handler, .- hdcp_handler\n"
|
||||
".popsection\n"
|
||||
);
|
||||
|
||||
static uint64_t *hdcp_key_pdata;
|
||||
static struct cdn_dp_hdcp_key_1x key;
|
||||
|
||||
int hdcp_handler(struct cdn_dp_hdcp_key_1x *key);
|
||||
|
||||
uint64_t dp_hdcp_ctrl(uint64_t type)
|
||||
{
|
||||
switch (type) {
|
||||
case HDCP_KEY_DATA_START_TRANSFER:
|
||||
memset(&key, 0x00, sizeof(key));
|
||||
hdcp_key_pdata = (uint64_t *)&key;
|
||||
return 0;
|
||||
case HDCP_KEY_DATA_START_DECRYPT:
|
||||
if (hdcp_key_pdata == (uint64_t *)(&key + 1))
|
||||
return hdcp_handler(&key);
|
||||
else
|
||||
return PSCI_E_INVALID_PARAMS;
|
||||
assert(0); /* Unreachable */
|
||||
default:
|
||||
return SMC_UNK;
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t dp_hdcp_store_key(uint64_t x1,
|
||||
uint64_t x2,
|
||||
uint64_t x3,
|
||||
uint64_t x4,
|
||||
uint64_t x5,
|
||||
uint64_t x6)
|
||||
{
|
||||
if (hdcp_key_pdata < (uint64_t *)&key ||
|
||||
hdcp_key_pdata + 6 > (uint64_t *)(&key + 1))
|
||||
return PSCI_E_INVALID_PARAMS;
|
||||
|
||||
hdcp_key_pdata[0] = x1;
|
||||
hdcp_key_pdata[1] = x2;
|
||||
hdcp_key_pdata[2] = x3;
|
||||
hdcp_key_pdata[3] = x4;
|
||||
hdcp_key_pdata[4] = x5;
|
||||
hdcp_key_pdata[5] = x6;
|
||||
hdcp_key_pdata += 6;
|
||||
|
||||
return 0;
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef CDN_DP_H
|
||||
#define CDN_DP_H
|
||||
|
||||
#include <plat_private.h>
|
||||
|
||||
enum {
|
||||
CDN_DP_HDCP_1X_KSV_LEN = 5,
|
||||
CDN_DP_HDCP_KSV_LEN = 8,
|
||||
CDN_DP_HDCP_RESERVED_LEN = 10,
|
||||
CDN_DP_HDCP_UID_LEN = 16,
|
||||
CDN_DP_HDCP_SHA_LEN = 20,
|
||||
CDN_DP_HDCP_DPK_LEN = 280,
|
||||
CDN_DP_HDCP_1X_KEYS_LEN = 285,
|
||||
CDN_DP_HDCP_KEY_LEN = 326,
|
||||
};
|
||||
|
||||
struct cdn_dp_hdcp_key_1x {
|
||||
uint8_t ksv[CDN_DP_HDCP_KSV_LEN];
|
||||
uint8_t device_key[CDN_DP_HDCP_DPK_LEN];
|
||||
uint8_t sha1[CDN_DP_HDCP_SHA_LEN];
|
||||
uint8_t uid[CDN_DP_HDCP_UID_LEN];
|
||||
uint16_t seed;
|
||||
uint8_t reserved[CDN_DP_HDCP_RESERVED_LEN];
|
||||
};
|
||||
|
||||
#define HDCP_KEY_DATA_START_TRANSFER 0
|
||||
#define HDCP_KEY_DATA_START_DECRYPT 1
|
||||
#define HDCP_KEY_1X_STORE_DATA_ALIGN_SIZE (6 * 64) / 8
|
||||
|
||||
/* Checks the cdn_dp_hdcp_key_1x must be aligned on 6 x 64-bit word boundary */
|
||||
CASSERT(sizeof(struct cdn_dp_hdcp_key_1x) % HDCP_KEY_1X_STORE_DATA_ALIGN_SIZE, \
|
||||
assert_hdcp_key_1x_store_data_align_size_mismatch);
|
||||
|
||||
uint64_t dp_hdcp_ctrl(uint64_t type);
|
||||
|
||||
uint64_t dp_hdcp_store_key(uint64_t x1,
|
||||
uint64_t x2,
|
||||
uint64_t x3,
|
||||
uint64_t x4,
|
||||
uint64_t x5,
|
||||
uint64_t x6);
|
||||
|
||||
#endif /* CDN_DP_H */
|
||||
Reference in New Issue
Block a user