Misc: hdcp : Add smcinvoke support for hdcp driver

Change-Id: I76b0e8f24df7f3e36288b1383fc7203bb295c181
Signed-off-by:Sarthak Patidar <quic_spatidar@quicinc.com>
This commit is contained in:
Sarthak Patidar
2023-05-19 05:45:12 -07:00
parent 3a48ee6708
commit 1efb70736f
22 changed files with 3816 additions and 1512 deletions

View File

@@ -23,7 +23,7 @@ SSG_SRC_FILES := \
$(wildcard $(LOCAL_PATH)/*/*) \
$(wildcard $(LOCAL_PATH)/*/*/*) \
$(wildcard $(LOCAL_PATH)/*/*/*/*)
LOCAL_MODULE_DDK_BUILD := true
# This is set once per LOCAL_PATH, not per (kernel) module
KBUILD_OPTIONS := SSG_ROOT=$(SEC_KERNEL_DIR)
KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM)

View File

@@ -14,28 +14,41 @@ ddk_headers(
"include/linux/ITrustedCameraDriver.h",
"include/linux/CTrustedCameraDriver.h",
"linux/misc/qseecom_kernel.h",
"linux/misc/qseecom_priv.h"
"linux/misc/qseecom_priv.h",
]),
includes = ["include/linux", "linux", "include"]
includes = [
"include",
"include/linux",
"linux",
],
)
ddk_headers(
name = "securemsm_kernel_headers",
hdrs = [
"linux/misc/qseecom_kernel.h",
"linux/misc/qseecom_priv.h"
"linux/misc/qseecom_priv.h",
],
includes = ["linux"]
includes = ["linux"],
)
ddk_headers(
name = "hdcp_qseecom_dlkm",
hdrs = glob([
":smcinvoke_kernel_headers",
"linux/*.h",
"linux/misc/qseecom_kernel.h",
"hdcp_qseecom/*.h",
"config/*.h"
"include/linux/*h",
"include/smci/uid/*h",
"include/smci/interface/*h",
"linux/misc/*.h",
"config/*.h",
]),
includes = [".","linux","config"]
includes = [
".",
"config",
"include",
"linux",
],
)
ddk_headers(

2
Kbuild
View File

@@ -35,7 +35,7 @@ obj-$(CONFIG_CRYPTO_DEV_QCRYPTO) += qcrypto-msm_dlkm.o
qcrypto-msm_dlkm-objs := crypto-qti/qcrypto.o
obj-$(CONFIG_HDCP_QSEECOM) += hdcp_qseecom_dlkm.o
hdcp_qseecom_dlkm-objs := hdcp/hdcp_qseecom.o
hdcp_qseecom_dlkm-objs := hdcp/hdcp_main.o hdcp/hdcp_smcinvoke.o hdcp/hdcp_qseecom.o
obj-$(CONFIG_HW_RANDOM_MSM_LEGACY) += qrng_dlkm.o
qrng_dlkm-objs := qrng/msm_rng.o

123
hdcp/hdcp1.h Normal file
View File

@@ -0,0 +1,123 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#pragma once
// AUTOGENERATED FILE: DO NOT EDIT
#include <linux/types.h>
#include "smcinvoke_object.h"
#define HDCP1_PROVISION 0
#define HDCP1_VERIFY 1
#define HDCP1_SET_ENCRYPTION 2
#define HDCP1_SET_ENCRYPTION_V2 3
#define HDCP1_SET_KEY 4
#define HDCP1_SET_KEY_V2 5
#define HDCP1_SET_MODE 6
static inline int32_t hdcp1_release(struct Object self)
{
return Object_invoke(self, Object_OP_release, 0, 0);
}
static inline int32_t hdcp1_retain(struct Object self)
{
return Object_invoke(self, Object_OP_retain, 0, 0);
}
static inline int32_t hdcp1_provision(struct Object self, uint32_t keyFormat_val,
const void *key_ptr, size_t key_len,
const void *dps_ptr, size_t dps_len)
{
union ObjectArg a[3] = {{{0, 0}}};
a[0].b = (struct ObjectBuf) {&keyFormat_val, sizeof(uint32_t)};
a[1].bi = (struct ObjectBufIn) {key_ptr, key_len * 1};
a[2].bi = (struct ObjectBufIn) {dps_ptr, dps_len * 1};
return Object_invoke(self, HDCP1_PROVISION, a,
ObjectCounts_pack(3, 0, 0, 0));
}
static inline int32_t hdcp1_verify(struct Object self, uint32_t deviceType_val)
{
union ObjectArg a[1] = {{{0, 0}}};
a[0].b = (struct ObjectBuf) {&deviceType_val, sizeof(uint32_t)};
return Object_invoke(self, HDCP1_VERIFY, a,
ObjectCounts_pack(1, 0, 0, 0));
}
static inline int32_t hdcp1_set_encryption(struct Object self, uint32_t enable_val)
{
union ObjectArg a[1] = {{{0, 0}}};
a[0].b = (struct ObjectBuf) {&enable_val, sizeof(uint32_t)};
return Object_invoke(self, HDCP1_SET_ENCRYPTION, a,
ObjectCounts_pack(1, 0, 0, 0));
}
static inline int32_t hdcp1_set_encryption_v2(struct Object self, uint32_t enable_val,
uint32_t deviceType_val)
{
union ObjectArg a[1] = {{{0, 0}}};
struct {
uint32_t m_enable;
uint32_t m_deviceType;
} i;
a[0].b = (struct ObjectBuf) {&i, 8};
i.m_enable = enable_val;
i.m_deviceType = deviceType_val;
return Object_invoke(self, HDCP1_SET_ENCRYPTION_V2, a,
ObjectCounts_pack(1, 0, 0, 0));
}
static inline int32_t hdcp1_set_key(struct Object self, void *ksv_ptr, size_t ksv_len,
size_t *ksv_lenout)
{
union ObjectArg a[1] = {{{0, 0}}};
int32_t result = 0;
a[0].b = (struct ObjectBuf) {ksv_ptr, ksv_len * 1};
result = Object_invoke(self, HDCP1_SET_KEY, a,
ObjectCounts_pack(0, 1, 0, 0));
*ksv_lenout = a[0].b.size / 1;
return result;
}
static inline int32_t hdcp1_set_key_v2(struct Object self, void *ksv_ptr,
size_t ksv_len, size_t *ksv_lenout,
uint32_t deviceType_val)
{
union ObjectArg a[2] = {{{0, 0}}};
int32_t result = 0;
a[1].b = (struct ObjectBuf) {ksv_ptr, ksv_len * 1};
a[0].b = (struct ObjectBuf) {&deviceType_val, sizeof(uint32_t)};
result = Object_invoke(self, HDCP1_SET_KEY_V2, a,
ObjectCounts_pack(1, 1, 0, 0));
*ksv_lenout = a[1].b.size / 1;
return result;
}
static inline int32_t hdcp1_set_mode(struct Object self, int32_t mode_val)
{
union ObjectArg a[1] = {{{0, 0}}};
a[0].b = (struct ObjectBuf) {&mode_val, sizeof(int32_t)};
return Object_invoke(self, HDCP1_SET_MODE, a,
ObjectCounts_pack(1, 0, 0, 0));
}

27
hdcp/hdcp1_ops.h Normal file
View File

@@ -0,0 +1,27 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#pragma once
// AUTOGENERATED FILE: DO NOT EDIT
#include <linux/types.h>
#include "smcinvoke_object.h"
#define IHDCP1OPS_NOTIFY_TOPOLOGY_CHANGE 0
static inline int32_t hdcp1_ops_release(struct Object self)
{
return Object_invoke(self, Object_OP_release, 0, 0);
}
static inline int32_t hdcp1_ops_retain(struct Object self)
{
return Object_invoke(self, Object_OP_retain, 0, 0);
}
static inline int32_t hdcp1_ops_notify_topology_change(struct Object self)
{
return Object_invoke(self, IHDCP1OPS_NOTIFY_TOPOLOGY_CHANGE, 0, 0);
}

303
hdcp/hdcp2p2.h Normal file
View File

@@ -0,0 +1,303 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#pragma once
// AUTOGENERATED FILE: DO NOT EDIT
#include <linux/types.h>
#include "smcinvoke_object.h"
#define HDCP2P2_PROVISION_KEY 0
#define HDCP2P2_VERIFY_KEY 1
#define HDCP2P2_TX_INIT 2
#define HDCP2P2_TX_DEINIT 3
#define HDCP2P2_RCVD_MSG 4
#define HDCP2P2_SEND_TIMEOUT 5
#define HDCP2P2_SET_HW_KEY 6
#define HDCP2P2_QUERY_STREAM_TYPE 7
#define HDCP2P2_INIT 8
#define HDCP2P2_DEINIT 9
#define HDCP2P2_VERSION 10
#define HDCP2P2_SESSION_INIT 11
#define HDCP2P2_SESSION_DEINIT 12
#define HDCP2P2_START_AUTH 13
#define HDCP2P2_SESSION_OPEN_STREAM 14
#define HDCP2P2_SESSION_CLOSE_STREAM 15
#define HDCP2P2_FORCE_ENCRYPTION 16
#define HDCP2P2_DELETE_PAIRING_INFO 17
static inline int32_t hdcp2p2_release(struct Object self)
{
return Object_invoke(self, Object_OP_release, 0, 0);
}
static inline int32_t hdcp2p2_retain(struct Object self)
{
return Object_invoke(self, Object_OP_retain, 0, 0);
}
static inline int32_t hdcp2p2_provision_key(struct Object self, const void *key_ptr,
size_t key_len,
const void *dps_ptr,
size_t dps_len)
{
union ObjectArg a[2] = {{{0, 0}}};
a[0].bi = (struct ObjectBufIn) {key_ptr, key_len * 1};
a[1].bi = (struct ObjectBufIn) {dps_ptr, dps_len * 1};
return Object_invoke(self, HDCP2P2_PROVISION_KEY, a,
ObjectCounts_pack(2, 0, 0, 0));
}
static inline int32_t hdcp2p2_verify_key(struct Object self)
{
return Object_invoke(self, HDCP2P2_VERIFY_KEY, 0, 0);
}
static inline int32_t hdcp2p2_tx_init(struct Object self, uint32_t sessionid_val,
uint32_t *ctxhandle_ptr)
{
union ObjectArg a[2] = {{{0, 0}}};
a[0].b = (struct ObjectBuf) {&sessionid_val, sizeof(uint32_t)};
a[1].b = (struct ObjectBuf) {ctxhandle_ptr, sizeof(uint32_t)};
return Object_invoke(self, HDCP2P2_TX_INIT, a,
ObjectCounts_pack(1, 1, 0, 0));
}
static inline int32_t hdcp2p2_tx_deinit(struct Object self, uint32_t ctxhandle_val)
{
union ObjectArg a[1] = {{{0, 0}}};
a[0].b = (struct ObjectBuf) {&ctxhandle_val, sizeof(uint32_t)};
return Object_invoke(self, HDCP2P2_TX_DEINIT, a,
ObjectCounts_pack(1, 0, 0, 0));
}
static inline int32_t hdcp2p2_rcvd_msg(
struct Object self, const void *reqMsg_ptr, size_t reqMsg_len,
uint32_t ctxhandle_val, void *resMsg_ptr, size_t resMsg_len,
size_t *resMsg_lenout, uint32_t *timeout_ptr, uint32_t *flag_ptr)
{
union ObjectArg a[4] = {{{0, 0}}};
int32_t result = 0;
struct {
uint32_t m_timeout;
uint32_t m_flag;
} o;
a[2].b = (struct ObjectBuf) {&o, 8};
a[0].bi = (struct ObjectBufIn) {reqMsg_ptr, reqMsg_len * 1};
a[1].b = (struct ObjectBuf) {&ctxhandle_val, sizeof(uint32_t)};
a[3].b = (struct ObjectBuf) {resMsg_ptr, resMsg_len * 1};
result = Object_invoke(self, HDCP2P2_RCVD_MSG, a,
ObjectCounts_pack(2, 2, 0, 0));
*resMsg_lenout = a[3].b.size / 1;
*timeout_ptr = o.m_timeout;
*flag_ptr = o.m_flag;
return result;
}
static inline int32_t hdcp2p2_send_timeout(struct Object self, uint32_t ctxhandle_val,
void *resMsg_ptr, size_t resMsg_len,
size_t *resMsg_lenout,
uint32_t *timeout_ptr)
{
union ObjectArg a[3] = {{{0, 0}}};
int32_t result = 0;
a[0].b = (struct ObjectBuf) {&ctxhandle_val, sizeof(uint32_t)};
a[1].b = (struct ObjectBuf) {resMsg_ptr, resMsg_len * 1};
a[2].b = (struct ObjectBuf) {timeout_ptr, sizeof(uint32_t)};
result = Object_invoke(self, HDCP2P2_SEND_TIMEOUT, a,
ObjectCounts_pack(1, 2, 0, 0));
*resMsg_lenout = a[1].b.size / 1;
return result;
}
static inline int32_t hdcp2p2_set_hw_key(struct Object self, uint32_t ctxhandle_val)
{
union ObjectArg a[1] = {{{0, 0}}};
a[0].b = (struct ObjectBuf) {&ctxhandle_val, sizeof(uint32_t)};
return Object_invoke(self, HDCP2P2_SET_HW_KEY, a,
ObjectCounts_pack(1, 0, 0, 0));
}
static inline int32_t hdcp2p2_query_stream_type(
struct Object self, uint32_t ctxhandle_val, void *resMsg_ptr, size_t resMsg_len,
size_t *resMsg_lenout, uint32_t *timeout_ptr)
{
union ObjectArg a[3] = {{{0, 0}}};
int32_t result = 0;
a[0].b = (struct ObjectBuf) {&ctxhandle_val, sizeof(uint32_t)};
a[1].b = (struct ObjectBuf) {resMsg_ptr, resMsg_len * 1};
a[2].b = (struct ObjectBuf) {timeout_ptr, sizeof(uint32_t)};
result = Object_invoke(self, HDCP2P2_QUERY_STREAM_TYPE, a,
ObjectCounts_pack(1, 2, 0, 0));
*resMsg_lenout = a[1].b.size / 1;
return result;
}
static inline int32_t hdcp2p2_init(struct Object self, uint32_t clientVersion_val,
uint32_t *appversion_ptr)
{
union ObjectArg a[2] = {{{0, 0}}};
a[0].b = (struct ObjectBuf) {&clientVersion_val, sizeof(uint32_t)};
a[1].b = (struct ObjectBuf) {appversion_ptr, sizeof(uint32_t)};
return Object_invoke(self, HDCP2P2_INIT, a,
ObjectCounts_pack(1, 1, 0, 0));
}
static inline int32_t hdcp2p2_deinit(struct Object self)
{
return Object_invoke(self, HDCP2P2_DEINIT, 0, 0);
}
static inline int32_t hdcp2p2_version(struct Object self, uint32_t *appversion_ptr)
{
union ObjectArg a[1] = {{{0, 0}}};
a[0].b = (struct ObjectBuf) {appversion_ptr, sizeof(uint32_t)};
return Object_invoke(self, HDCP2P2_VERSION, a,
ObjectCounts_pack(0, 1, 0, 0));
}
static inline int32_t hdcp2p2_session_init(struct Object self, uint32_t deviceId_val,
uint32_t *sessionId_ptr)
{
union ObjectArg a[2] = {{{0, 0}}};
a[0].b = (struct ObjectBuf) {&deviceId_val, sizeof(uint32_t)};
a[1].b = (struct ObjectBuf) {sessionId_ptr, sizeof(uint32_t)};
return Object_invoke(self, HDCP2P2_SESSION_INIT, a,
ObjectCounts_pack(1, 1, 0, 0));
}
static inline int32_t hdcp2p2_session_deinit(struct Object self,
uint32_t sessionId_val)
{
union ObjectArg a[1] = {{{0, 0}}};
a[0].b = (struct ObjectBuf) {&sessionId_val, sizeof(uint32_t)};
return Object_invoke(self, HDCP2P2_SESSION_DEINIT, a,
ObjectCounts_pack(1, 0, 0, 0));
}
static inline int32_t hdcp2p2_start_auth(struct Object self, uint32_t ctxhandle_val,
void *resMsg_ptr, size_t resMsg_len,
size_t *resMsg_lenout,
uint32_t *timeout_ptr,
uint32_t *flag_ptr,
uint32_t *tzctxhandle_ptr)
{
union ObjectArg a[3] = {{{0, 0}}};
int32_t result = 0;
struct {
uint32_t m_timeout;
uint32_t m_flag;
uint32_t m_tzctxhandle;
} o;
a[1].b = (struct ObjectBuf) {&o, 12};
a[0].b = (struct ObjectBuf) {&ctxhandle_val, sizeof(uint32_t)};
a[2].b = (struct ObjectBuf) {resMsg_ptr, resMsg_len * 1};
result = Object_invoke(self, HDCP2P2_START_AUTH, a,
ObjectCounts_pack(1, 2, 0, 0));
*resMsg_lenout = a[2].b.size / 1;
*timeout_ptr = o.m_timeout;
*flag_ptr = o.m_flag;
*tzctxhandle_ptr = o.m_tzctxhandle;
return result;
}
static inline int32_t hdcp2p2_session_open_stream(struct Object self,
uint32_t sessionid_val,
uint32_t vcpayloadid_val,
uint32_t stream_number_val,
uint32_t streamMediaType_val,
uint32_t *resStreamId_ptr)
{
union ObjectArg a[2] = {{{0, 0}}};
struct {
uint32_t m_sessionid;
uint32_t m_vcpayloadid;
uint32_t m_stream_number;
uint32_t m_streamMediaType;
} i;
a[0].b = (struct ObjectBuf) {&i, 16};
i.m_sessionid = sessionid_val;
i.m_vcpayloadid = vcpayloadid_val;
i.m_stream_number = stream_number_val;
i.m_streamMediaType = streamMediaType_val;
a[1].b = (struct ObjectBuf) {resStreamId_ptr, sizeof(uint32_t)};
return Object_invoke(self, HDCP2P2_SESSION_OPEN_STREAM, a,
ObjectCounts_pack(1, 1, 0, 0));
}
static inline int32_t hdcp2p2_session_close_stream(struct Object self,
uint32_t sessionid_val,
uint32_t streamId_val)
{
union ObjectArg a[1] = {{{0, 0}}};
struct {
uint32_t m_sessionid;
uint32_t m_streamId;
} i;
a[0].b = (struct ObjectBuf) {&i, 8};
i.m_sessionid = sessionid_val;
i.m_streamId = streamId_val;
return Object_invoke(self, HDCP2P2_SESSION_CLOSE_STREAM, a,
ObjectCounts_pack(1, 0, 0, 0));
}
static inline int32_t hdcp2p2_force_encryption(struct Object self,
uint32_t ctxhandle_val,
uint32_t enable_val)
{
union ObjectArg a[1] = {{{0, 0}}};
struct {
uint32_t m_ctxhandle;
uint32_t m_enable;
} i;
a[0].b = (struct ObjectBuf) {&i, 8};
i.m_ctxhandle = ctxhandle_val;
i.m_enable = enable_val;
return Object_invoke(self, HDCP2P2_FORCE_ENCRYPTION, a,
ObjectCounts_pack(1, 0, 0, 0));
}
static inline int32_t hdcp2p2_delete_pairing_info(struct Object self)
{
return Object_invoke(self, HDCP2P2_DELETE_PAIRING_INFO, 0, 0);
}

316
hdcp/hdcp_main.c Normal file
View File

@@ -0,0 +1,316 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#include "hdcp_main.h"
#include "hdcp_qseecom.h"
#include "hdcp_smcinvoke.h"
struct hdcp_ta_interface ta_interface;
static DEFINE_MUTEX(hdcp1_mutex_g);
static DEFINE_MUTEX(hdcp2_mutex_g);
void select_interface(bool use_smcinvoke)
{
if (use_smcinvoke) {
ta_interface.trusted_app_hdcp1_init = &hdcp1_init_smcinvoke;
ta_interface.trusted_app_hdcp1_feature_supported = &hdcp1_feature_supported_smcinvoke;
ta_interface.trusted_app_hdcp1_set_enc = &hdcp1_set_enc_smcinvoke;
ta_interface.trusted_app_hdcp1_ops_notify = &hdcp1_ops_notify_smcinvoke;
ta_interface.trusted_app_hdcp1_start = &hdcp1_start_smcinvoke;
ta_interface.trusted_app_hdcp1_stop = &hdcp1_stop_smcinvoke;
ta_interface.trusted_app_hdcp2_init = &hdcp2_init_smcinvoke;
ta_interface.trusted_app_hdcp2_deinit = &hdcp2_deinit_smcinvoke;
ta_interface.trusted_app_hdcp2_app_start = &hdcp2_app_start_smcinvoke;
ta_interface.trusted_app_hdcp2_app_start_auth = &hdcp2_app_start_auth_smcinvoke;
ta_interface.trusted_app_hdcp2_app_process_msg = &hdcp2_app_process_msg_smcinvoke;
ta_interface.trusted_app_hdcp2_app_enable_encryption = &hdcp2_app_enable_encryption_smcinvoke;
ta_interface.trusted_app_hdcp2_app_query_stream = &hdcp2_app_query_stream_smcinvoke;
ta_interface.trusted_app_hdcp2_app_stop = &hdcp2_app_stop_smcinvoke;
ta_interface.trusted_app_hdcp2_feature_supported = &hdcp2_feature_supported_smcinvoke;
ta_interface.trusted_app_hdcp2_force_encryption = &hdcp2_force_encryption_smcinvoke;
ta_interface.trusted_app_hdcp2_open_stream = &hdcp2_open_stream_smcinvoke;
ta_interface.trusted_app_hdcp2_close_stream = &hdcp2_close_stream_smcinvoke;
ta_interface.trusted_app_hdcp2_update_app_data = &hdcp2_update_app_data_smcinvoke;
} else {
ta_interface.trusted_app_hdcp1_init = &hdcp1_init_qseecom;
ta_interface.trusted_app_hdcp1_feature_supported = &hdcp1_feature_supported_qseecom;
ta_interface.trusted_app_hdcp1_set_enc = &hdcp1_set_enc_qseecom;
ta_interface.trusted_app_hdcp1_ops_notify = &hdcp1_ops_notify_qseecom;
ta_interface.trusted_app_hdcp1_start = &hdcp1_start_qseecom;
ta_interface.trusted_app_hdcp1_stop = &hdcp1_stop_qseecom;
ta_interface.trusted_app_hdcp2_init = &hdcp2_init_qseecom;
ta_interface.trusted_app_hdcp2_deinit = &hdcp2_deinit_qseecom;
ta_interface.trusted_app_hdcp2_app_start = &hdcp2_app_start_qseecom;
ta_interface.trusted_app_hdcp2_app_start_auth = &hdcp2_app_start_auth_qseecom;
ta_interface.trusted_app_hdcp2_app_process_msg = &hdcp2_app_process_msg_qseecom;
ta_interface.trusted_app_hdcp2_app_enable_encryption = &hdcp2_app_enable_encryption_qseecom;
ta_interface.trusted_app_hdcp2_app_query_stream = &hdcp2_app_query_stream_qseecom;
ta_interface.trusted_app_hdcp2_app_stop = &hdcp2_app_stop_qseecom;
ta_interface.trusted_app_hdcp2_feature_supported = &hdcp2_feature_supported_qseecom;
ta_interface.trusted_app_hdcp2_force_encryption = &hdcp2_force_encryption_qseecom;
ta_interface.trusted_app_hdcp2_open_stream = &hdcp2_open_stream_qseecom;
ta_interface.trusted_app_hdcp2_close_stream = &hdcp2_close_stream_qseecom;
ta_interface.trusted_app_hdcp2_update_app_data = &hdcp2_update_app_data_qseecom;
}
}
int hdcp1_count_ones(u8 *array, u8 len)
{
int i, j, count = 0;
for (i = 0; i < len; i++)
for (j = 0; j < 8; j++)
count += (((array[i] >> j) & 0x1) ? 1 : 0);
return count;
}
int hdcp1_validate_aksv(u32 aksv_msb, u32 aksv_lsb)
{
int const number_of_ones = 20;
u8 aksv[5] = {0};
pr_debug("AKSV=%02x%08x\n", aksv_msb, aksv_lsb);
aksv[0] = aksv_lsb & 0xFF;
aksv[1] = (aksv_lsb >> 8) & 0xFF;
aksv[2] = (aksv_lsb >> 16) & 0xFF;
aksv[3] = (aksv_lsb >> 24) & 0xFF;
aksv[4] = aksv_msb & 0xFF;
/* check there are 20 ones in AKSV */
if (hdcp1_count_ones(aksv, 5) != number_of_ones) {
pr_err("AKSV bit count failed\n");
return -EINVAL;
}
return 0;
}
bool hdcp2_feature_supported(void *data)
{
int ret = 0;
mutex_lock(&hdcp2_mutex_g);
ret = ta_interface.trusted_app_hdcp2_feature_supported(data);
mutex_unlock(&hdcp2_mutex_g);
return ret;
}
EXPORT_SYMBOL(hdcp2_feature_supported);
int hdcp2_force_encryption(void *ctx, uint32_t enable)
{
int ret = 0;
mutex_lock(&hdcp2_mutex_g);
ret = ta_interface.trusted_app_hdcp2_force_encryption(ctx, enable);
mutex_unlock(&hdcp2_mutex_g);
return ret;
}
EXPORT_SYMBOL(hdcp2_force_encryption);
int hdcp2_app_comm(void *ctx, enum hdcp2_app_cmd cmd,
struct hdcp2_app_data *app_data)
{
int ret = 0;
uint32_t req_len = 0;
if (!ctx || !app_data) {
pr_err("invalid input\n");
return -EINVAL;
}
req_len = app_data->request.length;
mutex_lock(&hdcp2_mutex_g);
switch (cmd) {
case HDCP2_CMD_START:
ret = ta_interface.trusted_app_hdcp2_app_start(ctx, req_len);
break;
case HDCP2_CMD_START_AUTH:
ret = ta_interface.trusted_app_hdcp2_app_start_auth(ctx, req_len);
break;
case HDCP2_CMD_PROCESS_MSG:
ret = ta_interface.trusted_app_hdcp2_app_process_msg(ctx, req_len);
break;
case HDCP2_CMD_TIMEOUT:
ret = ta_interface.trusted_app_hdcp2_app_timeout(ctx, req_len);
break;
case HDCP2_CMD_EN_ENCRYPTION:
ret = ta_interface.trusted_app_hdcp2_app_enable_encryption(ctx, req_len);
break;
case HDCP2_CMD_QUERY_STREAM:
ret = ta_interface.trusted_app_hdcp2_app_query_stream(ctx, req_len);
break;
case HDCP2_CMD_STOP:
ret = ta_interface.trusted_app_hdcp2_app_stop(ctx);
break;
default:
goto error;
}
if (ret)
goto error;
ret = ta_interface.trusted_app_hdcp2_update_app_data(ctx, app_data);
error:
mutex_unlock(&hdcp2_mutex_g);
return ret;
}
EXPORT_SYMBOL(hdcp2_app_comm);
int hdcp2_open_stream(void *ctx, uint8_t vc_payload_id, uint8_t stream_number,
uint32_t *stream_id)
{
int ret = 0;
mutex_lock(&hdcp2_mutex_g);
ret = ta_interface.trusted_app_hdcp2_open_stream(ctx, vc_payload_id, stream_number,
stream_id);
mutex_unlock(&hdcp2_mutex_g);
return ret;
}
EXPORT_SYMBOL(hdcp2_open_stream);
int hdcp2_close_stream(void *ctx, uint32_t stream_id)
{
int ret = 0;
mutex_lock(&hdcp2_mutex_g);
ret = ta_interface.trusted_app_hdcp2_close_stream(ctx, stream_id);
mutex_unlock(&hdcp2_mutex_g);
return ret;
}
EXPORT_SYMBOL(hdcp2_close_stream);
void *hdcp2_init(u32 device_type)
{
void *data = NULL;
mutex_lock(&hdcp2_mutex_g);
data = ta_interface.trusted_app_hdcp2_init(device_type);
mutex_unlock(&hdcp2_mutex_g);
return data;
}
EXPORT_SYMBOL(hdcp2_init);
void hdcp2_deinit(void *ctx)
{
ta_interface.trusted_app_hdcp2_deinit(ctx);
}
EXPORT_SYMBOL(hdcp2_deinit);
void *hdcp1_init(void)
{
void *data = NULL;
mutex_lock(&hdcp1_mutex_g);
data = ta_interface.trusted_app_hdcp1_init();
mutex_unlock(&hdcp1_mutex_g);
return data;
}
EXPORT_SYMBOL(hdcp1_init);
void hdcp1_deinit(void *data)
{
kfree(data);
}
EXPORT_SYMBOL(hdcp1_deinit);
bool hdcp1_feature_supported(void *data)
{
bool supported = false;
mutex_lock(&hdcp1_mutex_g);
supported = ta_interface.trusted_app_hdcp1_feature_supported(data);
mutex_unlock(&hdcp1_mutex_g);
return supported;
}
EXPORT_SYMBOL(hdcp1_feature_supported);
int hdcp1_set_enc(void *data, bool enable)
{
int ret = 0;
mutex_lock(&hdcp1_mutex_g);
ret = ta_interface.trusted_app_hdcp1_set_enc(data, enable);
mutex_unlock(&hdcp1_mutex_g);
return ret;
}
EXPORT_SYMBOL(hdcp1_set_enc);
int hdcp1_ops_notify(void *data, void *topo, bool is_authenticated)
{
int ret = 0;
ret = ta_interface.trusted_app_hdcp1_ops_notify(data, topo, is_authenticated);
return ret;
}
EXPORT_SYMBOL(hdcp1_ops_notify);
int hdcp1_start(void *data, u32 *aksv_msb, u32 *aksv_lsb)
{
int ret = 0;
mutex_lock(&hdcp1_mutex_g);
ret = ta_interface.trusted_app_hdcp1_start(data, aksv_msb, aksv_lsb);
mutex_unlock(&hdcp1_mutex_g);
return ret;
}
EXPORT_SYMBOL(hdcp1_start);
void hdcp1_stop(void *data)
{
mutex_lock(&hdcp1_mutex_g);
ta_interface.trusted_app_hdcp1_stop(data);
mutex_unlock(&hdcp1_mutex_g);
}
EXPORT_SYMBOL(hdcp1_stop);
static int __init hdcp_module_init(void)
{
struct device_node *np = NULL;
bool use_smcinvoke = false;
np = of_find_compatible_node(NULL, NULL, "qcom,hdcp");
if (!np) {
/*select qseecom interface as default if hdcp node
*is not present in dtsi
*/
select_interface(use_smcinvoke);
return 0;
}
use_smcinvoke = of_property_read_bool(np, "qcom,use-smcinvoke");
select_interface(use_smcinvoke);
return 0;
}
static void __exit hdcp_module_exit(void)
{
}
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("HDCP driver");
module_init(hdcp_module_init);
module_exit(hdcp_module_exit);

108
hdcp/hdcp_main.h Normal file
View File

@@ -0,0 +1,108 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#ifndef __HDCP_MAIN_H__
#define __HDCP_MAIN_H__
#include <linux/cdev.h>
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/hdcp_qseecom.h>
#include <linux/io.h>
#include <linux/ion.h>
#include <linux/kernel.h>
#include <linux/kthread.h>
#include <linux/list.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/sched.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <misc/qseecom_kernel.h>
#define HDCP2P2_APP_NAME "hdcp2p2"
#define HDCP1_APP_NAME "hdcp1"
#define HDCP1OPS_APP_NAME "ops"
#define HDCPSRM_APP_NAME "hdcpsrm"
#define QSEECOM_SBUFF_SIZE 0x1000
#define MAX_REC_ID_LIST_SIZE 160
#define MAX_TX_MESSAGE_SIZE 129
#define MAX_RX_MESSAGE_SIZE 534
#define MAX_TOPOLOGY_ELEMS 32
#define HDCP1_NOTIFY_TOPOLOGY 1
#define HDCP1_AKSV_SIZE 8
#define HDCP_CLIENT_MAKE_VERSION(maj, min, patch) \
((((maj)&0xFF) << 16) | (((min)&0xFF) << 8) | ((patch)&0xFF))
#define HCDP_TXMTR_GET_MAJOR_VERSION(v) (((v) >> 16) & 0xFF)
#define HCDP_TXMTR_GET_MINOR_VERSION(v) (((v) >> 8) & 0xFF)
#define HCDP_TXMTR_GET_PATCH_VERSION(v) ((v)&0xFF)
#define HDCP_CLIENT_MAJOR_VERSION 2
#define HDCP_CLIENT_MINOR_VERSION 1
#define HDCP_CLIENT_PATCH_VERSION 0
#define HDCP_SUCCESS 0
/* Wait 200ms after authentication */
#define SLEEP_FORCE_ENCRYPTION_MS 200
#define SLEEP_SET_HW_KEY_MS 300
/* flags set by tz in response message */
#define HDCP_TXMTR_SUBSTATE_INIT 0
#define HDCP_TXMTR_SUBSTATE_WAITING_FOR_RECIEVERID_LIST 1
#define HDCP_TXMTR_SUBSTATE_PROCESSED_RECIEVERID_LIST 2
#define HDCP_TXMTR_SUBSTATE_WAITING_FOR_STREAM_READY_MESSAGE 3
#define HDCP_TXMTR_SUBSTATE_REPEATER_AUTH_COMPLETE 4
enum hdcp_state {
HDCP_STATE_INIT = 0x00,
HDCP_STATE_APP_LOADED = 0x01,
HDCP_STATE_SESSION_INIT = 0x02,
HDCP_STATE_TXMTR_INIT = 0x04,
HDCP_STATE_AUTHENTICATED = 0x08,
HDCP_STATE_ERROR = 0x10
};
struct hdcp_ta_interface
{
void *(*trusted_app_hdcp1_init)(void);
bool (*trusted_app_hdcp1_feature_supported)(void *data);
int (*trusted_app_hdcp1_set_enc)(void *data,bool enable);
int (*trusted_app_hdcp1_ops_notify)(void *data, void *topo,
bool is_authenticated);
int (*trusted_app_hdcp1_start)(void *data, u32 *aksv_msb,
u32 *aksv_lsb);
void (*trusted_app_hdcp1_stop)(void *data);
void *(*trusted_app_hdcp2_init)(u32 device_type);
void (*trusted_app_hdcp2_deinit)(void *ctx);
int (*trusted_app_hdcp2_app_start)(void *ctx, uint32_t req_len);
int (*trusted_app_hdcp2_app_start_auth)(void *ctx, uint32_t req_len);
int (*trusted_app_hdcp2_app_process_msg)(void *ctx, uint32_t req_len);
int (*trusted_app_hdcp2_app_timeout)(void *ctx, uint32_t req_len);
int (*trusted_app_hdcp2_app_enable_encryption)(void *ctx, uint32_t req_len);
int (*trusted_app_hdcp2_app_query_stream)(void *ctx, uint32_t req_len);
int (*trusted_app_hdcp2_app_stop)(void *ctx);
bool (*trusted_app_hdcp2_feature_supported)(void *ctx);
int (*trusted_app_hdcp2_force_encryption)(void *ctx, uint32_t enable);
int (*trusted_app_hdcp2_open_stream)(void *ctx, uint8_t vc_payload_id,
uint8_t stream_number, uint32_t *stream_id);
int (*trusted_app_hdcp2_close_stream)(void *ctx, uint32_t stream_id);
int (*trusted_app_hdcp2_update_app_data)(void *ctx,
struct hdcp2_app_data *app_data);
};
int hdcp1_validate_aksv(u32 aksv_msb, u32 aksv_lsb);
#endif /* __HDCP_MAIN_H__ */

File diff suppressed because it is too large Load Diff

326
hdcp/hdcp_qseecom.h Normal file
View File

@@ -0,0 +1,326 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#ifndef __HDCP_QSEECOM_H__
#define __HDCP_QSEECOM_H__
#include <linux/hdcp_qseecom.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/types.h>
#include "hdcp_main.h"
struct hdcp1_qsee_handle {
struct qseecom_handle *qseecom_handle;
struct qseecom_handle *hdcpops_handle;
bool feature_supported;
uint32_t device_type;
enum hdcp_state hdcp_state;
char *app_name;
};
struct hdcp2_qsee_handle {
struct hdcp2_app_data app_data;
uint32_t tz_ctxhandle;
bool feature_supported;
enum hdcp_state hdcp_state;
struct qseecom_handle *qseecom_handle;
struct qseecom_handle *hdcpsrm_qseecom_handle;
uint32_t session_id;
bool legacy_app;
uint32_t device_type;
char *app_name;
unsigned char *req_buf;
unsigned char *res_buf;
int (*app_init)(struct hdcp2_qsee_handle *handle);
int (*tx_init)(struct hdcp2_qsee_handle *handle);
};
struct hdcp1_key_set_req {
uint32_t commandid;
} __packed;
struct hdcp1_key_set_rsp {
uint32_t commandid;
uint32_t ret;
uint8_t ksv[HDCP1_AKSV_SIZE];
} __packed;
struct hdcp1_ops_notify_req {
uint32_t commandid;
uint32_t device_type;
uint8_t recv_id_list[MAX_REC_ID_LIST_SIZE];
int32_t recv_id_len;
struct hdcp1_topology topology;
bool is_authenticated;
} __packed;
struct hdcp1_ops_notify_rsp {
uint32_t commandid;
uint32_t ret;
} __packed;
struct hdcp1_set_enc_req {
uint32_t commandid;
uint32_t enable;
} __packed;
struct hdcp1_set_enc_rsp {
uint32_t commandid;
uint32_t ret;
} __packed;
struct hdcp1_key_verify_req {
uint32_t commandid;
uint32_t key_type;
} __packed;
struct hdcp1_key_verify_rsp {
uint32_t commandId;
uint32_t ret;
} __packed;
struct hdcp_init_v1_req {
uint32_t commandid;
} __packed;
struct hdcp_init_v1_rsp {
uint32_t status;
uint32_t commandid;
uint32_t ctxhandle;
uint32_t timeout;
uint32_t msglen;
uint8_t message[MAX_TX_MESSAGE_SIZE];
} __packed;
struct hdcp_init_req {
uint32_t commandid;
uint32_t clientversion;
} __packed;
struct hdcp_init_rsp {
uint32_t status;
uint32_t commandid;
uint32_t appversion;
} __packed;
struct hdcp_session_init_req {
uint32_t commandid;
uint32_t deviceid;
} __packed;
struct hdcp_session_init_rsp {
uint32_t status;
uint32_t commandid;
uint32_t sessionid;
} __packed;
struct hdcp_tx_init_v1_req {
uint32_t commandid;
} __packed;
struct hdcp_tx_init_v1_rsp {
uint32_t status;
uint32_t commandid;
uint32_t ctxhandle;
uint32_t timeout;
uint32_t msglen;
uint8_t message[MAX_TX_MESSAGE_SIZE];
} __packed;
struct hdcp_tx_init_req {
uint32_t commandid;
uint32_t sessionid;
} __packed;
struct hdcp_tx_init_rsp {
uint32_t status;
uint32_t commandid;
uint32_t ctxhandle;
} __packed;
struct hdcp_version_req {
uint32_t commandid;
} __packed;
struct hdcp_version_rsp {
uint32_t status;
uint32_t commandId;
uint32_t appversion;
} __packed;
struct hdcp_session_open_stream_req {
uint32_t commandid;
uint32_t sessionid;
uint32_t vcpayloadid;
uint32_t stream_number;
uint32_t streamMediaType;
} __packed;
struct hdcp_session_open_stream_rsp {
uint32_t status;
uint32_t commandid;
uint32_t streamid;
} __packed;
struct hdcp_session_close_stream_req {
uint32_t commandid;
uint32_t sessionid;
uint32_t streamid;
} __packed;
struct hdcp_session_close_stream_rsp {
uint32_t status;
uint32_t commandid;
} __packed;
struct hdcp_force_encryption_req {
uint32_t commandid;
uint32_t ctxhandle;
uint32_t enable;
} __packed;
struct hdcp_force_encryption_rsp {
uint32_t status;
uint32_t commandid;
} __packed;
struct hdcp_tx_deinit_req {
uint32_t commandid;
uint32_t ctxhandle;
} __packed;
struct hdcp_tx_deinit_rsp {
uint32_t status;
uint32_t commandid;
} __packed;
struct hdcp_session_deinit_req {
uint32_t commandid;
uint32_t sessionid;
} __packed;
struct hdcp_session_deinit_rsp {
uint32_t status;
uint32_t commandid;
} __packed;
struct hdcp_deinit_req {
uint32_t commandid;
} __packed;
struct hdcp_deinit_rsp {
uint32_t status;
uint32_t commandid;
} __packed;
struct hdcp_query_stream_type_req {
uint32_t commandid;
uint32_t ctxhandle;
} __packed;
struct hdcp_query_stream_type_rsp {
uint32_t status;
uint32_t commandid;
uint32_t timeout;
uint32_t msglen;
uint8_t msg[MAX_TX_MESSAGE_SIZE];
} __packed;
struct hdcp_set_hw_key_req {
uint32_t commandid;
uint32_t ctxhandle;
} __packed;
struct hdcp_set_hw_key_rsp {
uint32_t status;
uint32_t commandid;
} __packed;
struct hdcp_send_timeout_req {
uint32_t commandid;
uint32_t ctxhandle;
} __packed;
struct hdcp_send_timeout_rsp {
uint32_t status;
uint32_t commandid;
uint32_t timeout;
uint32_t msglen;
uint8_t message[MAX_TX_MESSAGE_SIZE];
} __packed;
struct hdcp_start_auth_req {
uint32_t commandid;
uint32_t ctxHandle;
} __packed;
struct hdcp_start_auth_rsp {
uint32_t status;
uint32_t commandid;
uint32_t ctxhandle;
uint32_t timeout;
uint32_t msglen;
uint8_t message[MAX_TX_MESSAGE_SIZE];
} __packed;
struct hdcp_rcvd_msg_req {
uint32_t commandid;
uint32_t ctxhandle;
uint32_t msglen;
uint8_t msg[MAX_RX_MESSAGE_SIZE];
} __packed;
struct hdcp_rcvd_msg_rsp {
uint32_t status;
uint32_t commandid;
uint32_t state;
uint32_t timeout;
uint32_t flag;
uint32_t msglen;
uint8_t msg[MAX_TX_MESSAGE_SIZE];
} __packed;
struct hdcp_verify_key_req {
uint32_t commandid;
} __packed;
struct hdcp_verify_key_rsp {
uint32_t status;
uint32_t commandId;
} __packed;
#define HDCP1_SET_KEY 202
#define HDCP1_KEY_VERIFY 204
#define HDCP1_SET_ENC 205
/* DP device type */
#define DEVICE_TYPE_DP 0x8002
void *hdcp1_init_qseecom(void);
bool hdcp1_feature_supported_qseecom(void *data);
int hdcp1_set_enc_qseecom(void *data, bool enable);
int hdcp1_ops_notify_qseecom(void *data, void *topo, bool is_authenticated);
int hdcp1_start_qseecom(void *data, u32 *aksv_msb, u32 *aksv_lsb);
void hdcp1_stop_qseecom(void *data);
void *hdcp2_init_qseecom(u32 device_type);
void hdcp2_deinit_qseecom(void *ctx);
int hdcp2_app_start_qseecom(void *ctx, uint32_t req_len);
int hdcp2_app_start_auth_qseecom(void *ctx, uint32_t req_len);
int hdcp2_app_process_msg_qseecom(void *ctx, uint32_t req_len);
int hdcp2_app_timeout_qseecom(void *ctx, uint32_t req_len);
int hdcp2_app_enable_encryption_qseecom(void *ctx, uint32_t req_len);
int hdcp2_app_query_stream_qseecom(void *ctx, uint32_t req_len);
int hdcp2_app_stop_qseecom(void *ctx);
bool hdcp2_feature_supported_qseecom(void *ctx);
int hdcp2_force_encryption_qseecom(void *ctx, uint32_t enable);
int hdcp2_open_stream_qseecom(void *ctx, uint8_t vc_payload_id,
uint8_t stream_number, uint32_t *stream_id);
int hdcp2_close_stream_qseecom(void *ctx, uint32_t stream_id);
int hdcp2_update_app_data_qseecom(void *ctx, struct hdcp2_app_data *app_data);
#endif /* __HDCP_QSEECOM_H__ */

1090
hdcp/hdcp_smcinvoke.c Normal file

File diff suppressed because it is too large Load Diff

62
hdcp/hdcp_smcinvoke.h Normal file
View File

@@ -0,0 +1,62 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#ifndef __HDCP_SMCINVOKE_H__
#define __HDCP_SMCINVOKE_H__
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <include/linux/smcinvoke_object.h>
#include "hdcp_main.h"
struct hdcp1_smcinvoke_handle {
struct Object hdcp1_app_obj;
struct Object hdcp1_appcontroller_obj;
struct Object hdcp1ops_app_obj;
struct Object hdcp1ops_appcontroller_obj;
bool feature_supported;
uint32_t device_type;
enum hdcp_state hdcp_state;
};
struct hdcp2_smcinvoke_handle {
struct hdcp2_app_data app_data;
uint32_t tz_ctxhandle;
bool feature_supported;
enum hdcp_state hdcp_state;
struct Object hdcp2_app_obj;
struct Object hdcp2_appcontroller_obj;
struct Object hdcpsrm_app_obj;
struct Object hdcpsrm_appcontroller_obj;
uint32_t session_id;
uint32_t device_type;
};
void *hdcp1_init_smcinvoke(void);
bool hdcp1_feature_supported_smcinvoke(void *data);
int hdcp1_set_enc_smcinvoke(void *data, bool enable);
int hdcp1_ops_notify_smcinvoke(void *data, void *topo, bool is_authenticated);
int hdcp1_start_smcinvoke(void *data, u32 *aksv_msb, u32 *aksv_lsb);
void hdcp1_stop_smcinvoke(void *data);
void *hdcp2_init_smcinvoke(u32 device_type);
void hdcp2_deinit_smcinvoke(void *ctx);
int hdcp2_app_start_smcinvoke(void *ctx, uint32_t req_len);
int hdcp2_app_start_auth_smcinvoke(void *ctx, uint32_t req_len);
int hdcp2_app_process_msg_smcinvoke(void *ctx, uint32_t req_len);
int hdcp2_app_timeout_smcinvoke(void *ctx, uint32_t req_len);
int hdcp2_app_enable_encryption_smcinvoke(void *ctx, uint32_t req_len);
int hdcp2_app_query_stream_smcinvoke(void *ctx, uint32_t req_len);
int hdcp2_app_stop_smcinvoke(void *ctx);
bool hdcp2_feature_supported_smcinvoke(void *ctx);
int hdcp2_force_encryption_smcinvoke(void *ctx, uint32_t enable);
int hdcp2_open_stream_smcinvoke(void *ctx, uint8_t vc_payload_id,
uint8_t stream_number, uint32_t *stream_id);
int hdcp2_close_stream_smcinvoke(void *ctx, uint32_t stream_id);
int hdcp2_update_app_data_smcinvoke(void *ctx, struct hdcp2_app_data *app_data);
#endif /* __HDCP_SMCINVOKE_H__ */

View File

@@ -9,6 +9,7 @@
#include <linux/types.h>
#include <linux/firmware.h>
#include <linux/qtee_shmbridge.h>
#include "smcinvoke.h"
/*
* Method bits are not modified by transport layers. These describe the
@@ -190,7 +191,6 @@ static inline void Object_replace(struct Object *loc, struct Object objNew)
int smcinvoke_release_from_kernel_client(int fd);
int get_root_fd(int *root_fd);
int process_invoke_request_from_kernel_client(
int fd, struct smcinvoke_cmd_req *req);

View File

@@ -0,0 +1,48 @@
/* SPDX-License-Identifier: GPL-2.0-only
*
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
/** @cond */
#pragma once
#include "smcinvoke_object.h"
#define IAppClient_ERROR_APP_NOT_FOUND INT32_C(10)
#define IAppClient_ERROR_APP_RESTART_FAILED INT32_C(11)
#define IAppClient_ERROR_APP_UNTRUSTED_CLIENT INT32_C(12)
#define IAppClient_ERROR_CLIENT_CRED_PARSING_FAILURE INT32_C(13)
#define IAppClient_ERROR_APP_LOAD_FAILED INT32_C(14)
#define IAppClient_OP_getAppObject 0
static inline int32_t
IAppClient_release(struct Object self)
{
return Object_invoke(self, Object_OP_release, 0, 0);
}
static inline int32_t
IAppClient_retain(struct Object self)
{
return Object_invoke(self, Object_OP_retain, 0, 0);
}
static inline int32_t
IAppClient_getAppObject(struct Object self, const void *appDistName_ptr, size_t appDistName_len,struct Object *obj_ptr)
{
int32_t result;
union ObjectArg a[2];
a[0].bi = (struct ObjectBufIn) { appDistName_ptr, appDistName_len * 1 };
result = Object_invoke(self, IAppClient_OP_getAppObject, a, ObjectCounts_pack(1, 0, 0, 1));
*obj_ptr = a[1].o;
return result;
}

View File

@@ -0,0 +1,143 @@
/* SPDX-License-Identifier: GPL-2.0-only
*
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
/** @cond */
#pragma once
#include "smcinvoke_object.h"
#define IAppController_CBO_INTERFACE_WAIT UINT32_C(1)
#define IAppController_ERROR_APP_SUSPENDED INT32_C(10)
#define IAppController_ERROR_APP_BLOCKED_ON_LISTENER INT32_C(11)
#define IAppController_ERROR_APP_UNLOADED INT32_C(12)
#define IAppController_ERROR_APP_IN_USE INT32_C(13)
#define IAppController_ERROR_NOT_SUPPORTED INT32_C(14)
#define IAppController_ERROR_CBO_UNKNOWN INT32_C(15)
#define IAppController_ERROR_APP_UNLOAD_NOT_ALLOWED INT32_C(16)
#define IAppController_ERROR_APP_DISCONNECTED INT32_C(17)
#define IAppController_ERROR_USER_DISCONNECT_REJECTED INT32_C(18)
#define IAppController_ERROR_STILL_RUNNING INT32_C(19)
#define IAppController_OP_openSession 0
#define IAppController_OP_unload 1
#define IAppController_OP_getAppObject 2
#define IAppController_OP_installCBO 3
#define IAppController_OP_disconnect 4
#define IAppController_OP_restart 5
static inline int32_t
IAppController_release(struct Object self)
{
return Object_invoke(self, Object_OP_release, 0, 0);
}
static inline int32_t
IAppController_retain(struct Object self)
{
return Object_invoke(self, Object_OP_retain, 0, 0);
}
static inline int32_t
IAppController_openSession(struct Object self, uint32_t cancelCode_val, uint32_t connectionMethod_val, uint32_t connectionData_val, uint32_t paramTypes_val, uint32_t exParamTypes_val, const void *i1_ptr, size_t i1_len, const void *i2_ptr, size_t i2_len, const void *i3_ptr, size_t i3_len, const void *i4_ptr, size_t i4_len, void *o1_ptr, size_t o1_len, size_t *o1_lenout, void *o2_ptr, size_t o2_len, size_t *o2_lenout, void *o3_ptr, size_t o3_len, size_t *o3_lenout, void *o4_ptr, size_t o4_len, size_t *o4_lenout,struct Object imem1_val,struct Object imem2_val,struct Object imem3_val,struct Object imem4_val, uint32_t *memrefOutSz1_ptr, uint32_t *memrefOutSz2_ptr, uint32_t *memrefOutSz3_ptr, uint32_t *memrefOutSz4_ptr,struct Object *session_ptr, uint32_t *retValue_ptr, uint32_t *retOrigin_ptr)
{
union ObjectArg a[15];
struct {
uint32_t m_cancelCode;
uint32_t m_connectionMethod;
uint32_t m_connectionData;
uint32_t m_paramTypes;
uint32_t m_exParamTypes;
} i;
struct {
uint32_t m_memrefOutSz1;
uint32_t m_memrefOutSz2;
uint32_t m_memrefOutSz3;
uint32_t m_memrefOutSz4;
uint32_t m_retValue;
uint32_t m_retOrigin;
} o;
int32_t result;
a[0].b = (struct ObjectBuf) { &i, 20 };
a[5].b = (struct ObjectBuf) { &o, 24 };
i.m_cancelCode = cancelCode_val;
i.m_connectionMethod = connectionMethod_val;
i.m_connectionData = connectionData_val;
i.m_paramTypes = paramTypes_val;
i.m_exParamTypes = exParamTypes_val;
a[1].bi = (struct ObjectBufIn) { i1_ptr, i1_len * 1 };
a[2].bi = (struct ObjectBufIn) { i2_ptr, i2_len * 1 };
a[3].bi = (struct ObjectBufIn) { i3_ptr, i3_len * 1 };
a[4].bi = (struct ObjectBufIn) { i4_ptr, i4_len * 1 };
a[6].b = (struct ObjectBuf) { o1_ptr, o1_len * 1 };
a[7].b = (struct ObjectBuf) { o2_ptr, o2_len * 1 };
a[8].b = (struct ObjectBuf) { o3_ptr, o3_len * 1 };
a[9].b = (struct ObjectBuf) { o4_ptr, o4_len * 1 };
a[10].o = imem1_val;
a[11].o = imem2_val;
a[12].o = imem3_val;
a[13].o = imem4_val;
result = Object_invoke(self, IAppController_OP_openSession, a, ObjectCounts_pack(5, 5, 4, 1));
*o1_lenout = a[6].b.size / 1;
*o2_lenout = a[7].b.size / 1;
*o3_lenout = a[8].b.size / 1;
*o4_lenout = a[9].b.size / 1;
*memrefOutSz1_ptr = o.m_memrefOutSz1;
*memrefOutSz2_ptr = o.m_memrefOutSz2;
*memrefOutSz3_ptr = o.m_memrefOutSz3;
*memrefOutSz4_ptr = o.m_memrefOutSz4;
*session_ptr = a[14].o;
*retValue_ptr = o.m_retValue;
*retOrigin_ptr = o.m_retOrigin;
return result;
}
static inline int32_t
IAppController_unload(struct Object self)
{
return Object_invoke(self, IAppController_OP_unload, 0, 0);
}
static inline int32_t
IAppController_getAppObject(struct Object self,struct Object *obj_ptr)
{
union ObjectArg a[1];
int32_t result = Object_invoke(self, IAppController_OP_getAppObject, a, ObjectCounts_pack(0, 0, 0, 1));
*obj_ptr = a[0].o;
return result;
}
static inline int32_t
IAppController_installCBO(struct Object self, uint32_t uid_val,struct Object obj_val)
{
union ObjectArg a[2];
a[0].b = (struct ObjectBuf) { &uid_val, sizeof(uint32_t) };
a[1].o = obj_val;
return Object_invoke(self, IAppController_OP_installCBO, a, ObjectCounts_pack(1, 0, 1, 0));
}
static inline int32_t
IAppController_disconnect(struct Object self)
{
return Object_invoke(self, IAppController_OP_disconnect, 0, 0);
}
static inline int32_t
IAppController_restart(struct Object self)
{
return Object_invoke(self, IAppController_OP_restart, 0, 0);
}

View File

@@ -0,0 +1,105 @@
/* SPDX-License-Identifier: GPL-2.0-only
*
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#pragma once
#include "smcinvoke_object.h"
#include "IAppController.h"
#define IAppLoader_ERROR_INVALID_BUFFER INT32_C(10)
#define IAppLoader_ERROR_PIL_ROLLBACK_FAILURE INT32_C(11)
#define IAppLoader_ERROR_ELF_SIGNATURE_ERROR INT32_C(12)
#define IAppLoader_ERROR_METADATA_INVALID INT32_C(13)
#define IAppLoader_ERROR_MAX_NUM_APPS INT32_C(14)
#define IAppLoader_ERROR_NO_NAME_IN_METADATA INT32_C(15)
#define IAppLoader_ERROR_ALREADY_LOADED INT32_C(16)
#define IAppLoader_ERROR_EMBEDDED_IMAGE_NOT_FOUND INT32_C(17)
#define IAppLoader_ERROR_TZ_HEAP_MALLOC_FAILURE INT32_C(18)
#define IAppLoader_ERROR_TA_APP_REGION_MALLOC_FAILURE INT32_C(19)
#define IAppLoader_ERROR_CLIENT_CRED_PARSING_FAILURE INT32_C(20)
#define IAppLoader_ERROR_APP_UNTRUSTED_CLIENT INT32_C(21)
#define IAppLoader_ERROR_APP_NOT_LOADED INT32_C(22)
#define IAppLoader_ERROR_APP_MAX_CLIENT_CONNECTIONS INT32_C(23)
#define IAppLoader_ERROR_APP_BLACKLISTED INT32_C(24)
#define IAppLoader_OP_loadFromBuffer 0
#define IAppLoader_OP_loadFromRegion 1
#define IAppLoader_OP_loadEmbedded 2
#define IAppLoader_OP_connect 3
static inline int32_t
IAppLoader_release(struct Object self)
{
return Object_invoke(self, Object_OP_release, 0, 0);
}
static inline int32_t
IAppLoader_retain(struct Object self)
{
return Object_invoke(self, Object_OP_retain, 0, 0);
}
static inline int32_t
IAppLoader_loadFromBuffer(struct Object self, const void *appElf_ptr, size_t appElf_len,struct Object *appController_ptr)
{
union ObjectArg a[2];
int32_t result;
a[0].bi = (struct ObjectBufIn) { appElf_ptr, appElf_len * 1 };
result = Object_invoke(self, IAppLoader_OP_loadFromBuffer, a, ObjectCounts_pack(1, 0, 0, 1));
*appController_ptr = a[1].o;
return result;
}
static inline int32_t
IAppLoader_loadFromRegion(struct Object self,struct Object appElf_val,struct Object *appController_ptr)
{
union ObjectArg a[2];
int32_t result;
a[0].o = appElf_val;
result = Object_invoke(self, IAppLoader_OP_loadFromRegion, a, ObjectCounts_pack(0, 0, 1, 1));
*appController_ptr = a[1].o;
return result;
}
static inline int32_t
IAppLoader_loadEmbedded(struct Object self, const void *appName_ptr, size_t appName_len,struct Object *appController_ptr)
{
union ObjectArg a[2];
int32_t result;
a[0].bi = (struct ObjectBufIn) { appName_ptr, appName_len * 1 };
result = Object_invoke(self, IAppLoader_OP_loadEmbedded, a, ObjectCounts_pack(1, 0, 0, 1));
*appController_ptr = a[1].o;
return result;
}
static inline int32_t
IAppLoader_connect(struct Object self, const void *appName_ptr, size_t appName_len,struct Object *appController_ptr)
{
union ObjectArg a[2];
int32_t result;
a[0].bi = (struct ObjectBufIn) { appName_ptr, appName_len * 1 };
result = Object_invoke(self, IAppLoader_OP_connect, a, ObjectCounts_pack(1, 0, 0, 1));
*appController_ptr = a[1].o;
return result;
}

View File

@@ -0,0 +1,48 @@
/* SPDX-License-Identifier: GPL-2.0-only
*
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
/** @cond */
#pragma once
#include "smcinvoke_object.h"
/** 0 is not a valid service ID. */
#define IOpener_INVALID_ID UINT32_C(0)
#define IOpener_ERROR_NOT_FOUND INT32_C(10)
#define IOpener_ERROR_PRIVILEGE INT32_C(11)
#define IOpener_ERROR_NOT_SUPPORTED INT32_C(12)
#define IOpener_OP_open 0
static inline int32_t
IOpener_release(struct Object self)
{
return Object_invoke(self, Object_OP_release, 0, 0);
}
static inline int32_t
IOpener_retain(struct Object self)
{
return Object_invoke(self, Object_OP_retain, 0, 0);
}
static inline int32_t
IOpener_open(struct Object self, uint32_t id_val,struct Object *obj_ptr)
{
union ObjectArg a[2];
int32_t result;
a[0].b = (struct ObjectBuf) { &id_val, sizeof(uint32_t) };
result = Object_invoke(self, IOpener_OP_open, a, ObjectCounts_pack(1, 0, 0, 1));
*obj_ptr = a[1].o;
return result;
}

View File

@@ -0,0 +1,20 @@
/* SPDX-License-Identifier: GPL-2.0-only
*
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
/**
* @addtogroup CAppClient
* @{
Class CAppClient implements \link IAppClient \endlink interface.
This class provides an interface to obtain app-provided functionalities.
The class ID `AppClient` is not included in the default privilege set.
*/
#pragma once
#include <smcinvoke_object.h>
#define CAppClient_UID (0x97)

View File

@@ -0,0 +1,12 @@
/* SPDX-License-Identifier: GPL-2.0-only
*
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#pragma once
#include <include/linux/smcinvoke_object.h>
// This class provides an interface to load Secure Applications in QSEE
#define CAppLoader_UID (3)

View File

@@ -14,5 +14,6 @@ def define_pineapple():
"smmu_proxy_dlkm"
],
extra_options = [
"CONFIG_QCOM_SMCINVOKE"]
"CONFIG_QCOM_SMCINVOKE",
],
)

View File

@@ -1,7 +1,13 @@
load("//build/kernel/kleaf:kernel.bzl", "kernel_modules_install",
"ddk_module")
load(":securemsm_modules.bzl", "securemsm_modules",
"securemsm_modules_by_config")
load(
"//build/kernel/kleaf:kernel.bzl",
"ddk_module",
"kernel_modules_install",
)
load(
":securemsm_modules.bzl",
"securemsm_modules",
"securemsm_modules_by_config",
)
load("//build/bazel_common_rules/dist:dist.bzl", "copy_to_dist_dir")
def _replace_formatting_codes(target, variant, s):
@@ -11,9 +17,9 @@ def _replace_formatting_codes(target, variant, s):
def _console_print(target, variant, module, message):
if module:
print('{}: {}: securemsm-kernel: {}: {}'.format(target, variant, module, message))
print("{}: {}: securemsm-kernel: {}: {}".format(target, variant, module, message))
else:
print('{}: {}: securemsm-kernel: {} '.format(target, variant, message))
print("{}: {}: securemsm-kernel: {} ".format(target, variant, message))
def _get_options(target, variant, target_config_option, modules, extra_options):
all_options = {option: True for option in extra_options}
@@ -37,7 +43,7 @@ def _get_options(target, variant, target_config_option, modules, extra_options):
all_options[target_config_option] = True
if redundant_options:
_console_print(target, variant, None, 'INFO: The following options are already declared either by a module or the target, no need to redeclare: \n{}'.format('\n'.join(redundant_options)))
_console_print(target, variant, None, "INFO: The following options are already declared either by a module or the target, no need to redeclare: \n{}".format("\n".join(redundant_options)))
return all_options
@@ -51,7 +57,7 @@ def _get_module_srcs(target, variant, module, options):
globbed_srcs = native.glob(["{}{}".format(module_path, _replace_formatting_codes(target, variant, src)) for src in srcs])
if not globbed_srcs:
_console_print(target, variant, module["name"], 'WARNING: Module has no sources attached!')
_console_print(target, variant, module["name"], "WARNING: Module has no sources attached!")
return globbed_srcs
@@ -79,8 +85,7 @@ def define_target_variant_modules(target, variant, modules, extra_options = [],
deps = ["//msm-kernel:all_headers"] + [_replace_formatting_codes(target, variant, dep) for dep in module["deps"]],
hdrs = module["hdrs"],
local_defines = target_local_defines,
copts = module["copts"]
copts = module["copts"],
)
module_rules.append(rule_name)
@@ -95,11 +100,10 @@ def define_target_variant_modules(target, variant, modules, extra_options = [],
log = "info",
)
kernel_modules_install(
name = "{}_modules_install".format(kernel_build_variant),
kernel_build = "//msm-kernel:{}".format(kernel_build_variant),
kernel_modules = module_rules
kernel_modules = module_rules,
)
def define_consolidate_gki_modules(target, modules, extra_options = [], config_option = None):

View File

@@ -22,12 +22,11 @@ securemsm_modules_by_config = {}
def register_securemsm_module(name, path = None, config_option = None, default_srcs = [], config_srcs = {}, deps = [], srcs = [], copts = [], hdrs = []):
processed_config_srcs = {}
for config_src_name in config_srcs:
config_src = config_srcs[config_src_name]
if type(config_src) == "list":
processed_config_srcs[config_src_name] = { True: config_src }
processed_config_srcs[config_src_name] = {True: config_src}
else:
processed_config_srcs[config_src_name] = config_src
@@ -48,7 +47,6 @@ def register_securemsm_module(name, path = None, config_option = None, default_s
if config_option:
securemsm_modules_by_config[config_option] = name
# ------------------------------------ SECUREMSM MODULE DEFINITIONS ---------------------------------
register_securemsm_module(
name = "smcinvoke_dlkm",
@@ -59,7 +57,6 @@ register_securemsm_module(
"trace_smcinvoke.h",
"IQSEEComCompat.h",
"IQSEEComCompatAppLoader.h",
],
deps = [":smcinvoke_kernel_headers"],
hdrs = [":smcinvoke_kernel_headers"],
@@ -68,8 +65,10 @@ register_securemsm_module(
register_securemsm_module(
name = "qseecom_dlkm",
path = QSEECOM_PATH,
default_srcs = ["qseecom.c",
"ice.h"],
default_srcs = [
"qseecom.c",
"ice.h",
],
deps = [":securemsm_kernel_headers"],
srcs = ["config/sec-kernel_defconfig_qseecom.h"],
copts = ["-include", "config/sec-kernel_defconfig_qseecom.h"],
@@ -84,10 +83,31 @@ register_securemsm_module(
register_securemsm_module(
name = "hdcp_qseecom_dlkm",
path = HDCP_PATH,
default_srcs = ["hdcp_qseecom.c"],
deps = [":hdcp_qseecom_dlkm","%b_smcinvoke_dlkm"],
default_srcs = [
"hdcp_qseecom.c",
"hdcp_qseecom.h",
"hdcp_main.c",
"smcinvoke_object.h",
"hdcp_main.h",
"hdcp_smcinvoke.c",
"hdcp_smcinvoke.h",
"CAppClient.h",
"CAppLoader.h",
"IAppClient.h",
"IAppController.h",
"IAppLoader.h",
"IClientEnv.h",
"IOpener.h",
"hdcp1.h",
"hdcp1_ops.h",
"hdcp2p2.h",
],
deps = [":hdcp_qseecom_dlkm", "%b_smcinvoke_dlkm"],
srcs = ["config/sec-kernel_defconfig.h"],
copts = ["-include", "config/sec-kernel_defconfig.h"],
copts = [
"-include",
"config/sec-kernel_defconfig.h",
],
)
register_securemsm_module(