Loading drivers/firmware/qcom_scm-smc.c +33 −1 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2015,2020 The Linux Foundation. All rights reserved. /* Copyright (c) 2015,2020-2021 The Linux Foundation. All rights reserved. */ #include <linux/io.h> Loading Loading @@ -2020,6 +2020,38 @@ int __qcom_scm_request_encrypted_log(struct device *dev, phys_addr_t buf, return ret ? : desc.res[0]; } int __qcom_scm_invoke_smc_legacy(struct device *dev, phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data) { int ret; struct qcom_scm_desc desc = { .svc = QCOM_SCM_SVC_SMCINVOKE, .cmd = QCOM_SCM_SMCINVOKE_INVOKE_LEGACY, .owner = ARM_SMCCC_OWNER_TRUSTED_OS }; desc.args[0] = in_buf; desc.args[1] = in_buf_size; desc.args[2] = out_buf; desc.args[3] = out_buf_size; desc.arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_RW, QCOM_SCM_VAL, QCOM_SCM_RW, QCOM_SCM_VAL); ret = qcom_scm_call(dev, &desc); if (result) *result = desc.res[1]; if (response_type) *response_type = desc.res[0]; if (data) *data = desc.res[2]; return ret; } int __qcom_scm_invoke_smc(struct device *dev, phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data) Loading drivers/firmware/qcom_scm.c +9 −0 Original line number Diff line number Diff line Loading @@ -980,6 +980,15 @@ int qcom_scm_request_encrypted_log(phys_addr_t buf, size_t len, } EXPORT_SYMBOL(qcom_scm_request_encrypted_log); int qcom_scm_invoke_smc_legacy(phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data) { return __qcom_scm_invoke_smc_legacy(__scm->dev, in_buf, in_buf_size, out_buf, out_buf_size, result, response_type, data); } EXPORT_SYMBOL(qcom_scm_invoke_smc_legacy); int qcom_scm_invoke_smc(phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data) Loading drivers/firmware/qcom_scm.h +5 −1 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* Copyright (c) 2010-2015,2020 The Linux Foundation. All rights reserved. /* Copyright (c) 2010-2015,2020-2021 The Linux Foundation. All rights reserved. */ #ifndef __QCOM_SCM_INT_H #define __QCOM_SCM_INT_H Loading Loading @@ -260,8 +260,12 @@ extern int __qcom_scm_request_encrypted_log(struct device *dev, phys_addr_t buf, extern int __qcom_scm_ice_restore_cfg(struct device *dev); #define QCOM_SCM_SVC_SMCINVOKE 0x06 #define QCOM_SCM_SMCINVOKE_INVOKE_LEGACY 0x00 #define QCOM_SCM_SMCINVOKE_INVOKE 0x02 #define QCOM_SCM_SMCINVOKE_CB_RSP 0x01 extern int __qcom_scm_invoke_smc_legacy(struct device *dev, phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data); extern int __qcom_scm_invoke_smc(struct device *dev, phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data); Loading drivers/soc/qcom/smcinvoke.c +16 −5 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include <linux/kref.h> #include <linux/signal.h> #include <linux/msm_ion.h> #include <linux/of_platform.h> #include <linux/qcom_scm.h> #include <asm/cacheflush.h> Loading Loading @@ -50,6 +51,7 @@ /* TZ defined values - Start */ #define SMCINVOKE_INVOKE_PARAM_ID 0x224 #define SMCINVOKE_CB_RSP_PARAM_ID 0x22 #define SMCINVOKE_INVOKE_CMD_LEGACY 0x32000600 #define SMCINVOKE_INVOKE_CMD 0x32000602 #define SMCINVOKE_CB_RSP_CMD 0x32000601 #define SMCINVOKE_RESULT_INBOUND_REQ_NEEDED 3 Loading Loading @@ -144,6 +146,7 @@ static uint16_t g_last_cb_server_id = CBOBJ_SERVER_ID_START; static uint16_t g_last_mem_rgn_id, g_last_mem_map_obj_id; static size_t g_max_cb_buf_size = SMCINVOKE_TZ_MIN_BUF_SIZE; static unsigned int cb_reqs_inflight; static bool legacy_smc_call; static long smcinvoke_ioctl(struct file *, unsigned int, unsigned long); static int smcinvoke_open(struct inode *, struct file *); Loading Loading @@ -1228,6 +1231,9 @@ static int prepare_send_scm_msg(const uint8_t *in_buf, phys_addr_t in_paddr, if ((in_buf_len % PAGE_SIZE) != 0 || (out_buf_len % PAGE_SIZE) != 0) return -EINVAL; if (legacy_smc_call) cmd = SMCINVOKE_INVOKE_CMD_LEGACY; else cmd = SMCINVOKE_INVOKE_CMD; /* * purpose of lock here is to ensure that any CB obj that may be going Loading @@ -1241,11 +1247,14 @@ static int prepare_send_scm_msg(const uint8_t *in_buf, phys_addr_t in_paddr, while (1) { mutex_lock(&g_smcinvoke_lock); if (cmd == SMCINVOKE_INVOKE_CMD) if (cmd == SMCINVOKE_INVOKE_CMD_LEGACY) ret = qcom_scm_invoke_smc_legacy(in_paddr, in_buf_len, out_paddr, out_buf_len, &req->result, &response_type, &data); else if (cmd == SMCINVOKE_INVOKE_CMD) ret = qcom_scm_invoke_smc(in_paddr, in_buf_len, out_paddr, out_buf_len, &req->result, &response_type, &data); &req->result, &response_type, &data); else ret = qcom_scm_invoke_callback_response( virt_to_phys(out_buf), out_buf_len, Loading Loading @@ -2071,6 +2080,8 @@ static int smcinvoke_probe(struct platform_device *pdev) pr_err("dma_set_mask_and_coherent failed %d\n", rc); goto exit_destroy_device; } legacy_smc_call = of_property_read_bool((&pdev->dev)->of_node, "qcom,support-legacy_smc"); return 0; Loading include/linux/qcom_scm.h +6 −0 Original line number Diff line number Diff line Loading @@ -192,6 +192,9 @@ extern int qcom_scm_register_qsee_log_buf(phys_addr_t buf, size_t len); extern int qcom_scm_query_encrypted_log_feature(u64 *enabled); extern int qcom_scm_request_encrypted_log(phys_addr_t buf, size_t len, uint32_t log_id); extern int qcom_scm_invoke_smc_legacy(phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data); extern int qcom_scm_invoke_smc(phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data); Loading Loading @@ -365,6 +368,9 @@ static inline int qcom_scm_query_encrypted_log_feature(u64 *enabled) static inline int qcom_scm_request_encrypted_log(phys_addr_t buf, size_t len, uint32_t log_id) { return -ENODEV; } static inline int qcom_scm_invoke_smc_legacy(phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *request_type, unsigned int *data) { return -ENODEV; } static inline int qcom_scm_invoke_smc(phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *request_type, unsigned int *data) { return -ENODEV; } Loading Loading
drivers/firmware/qcom_scm-smc.c +33 −1 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2015,2020 The Linux Foundation. All rights reserved. /* Copyright (c) 2015,2020-2021 The Linux Foundation. All rights reserved. */ #include <linux/io.h> Loading Loading @@ -2020,6 +2020,38 @@ int __qcom_scm_request_encrypted_log(struct device *dev, phys_addr_t buf, return ret ? : desc.res[0]; } int __qcom_scm_invoke_smc_legacy(struct device *dev, phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data) { int ret; struct qcom_scm_desc desc = { .svc = QCOM_SCM_SVC_SMCINVOKE, .cmd = QCOM_SCM_SMCINVOKE_INVOKE_LEGACY, .owner = ARM_SMCCC_OWNER_TRUSTED_OS }; desc.args[0] = in_buf; desc.args[1] = in_buf_size; desc.args[2] = out_buf; desc.args[3] = out_buf_size; desc.arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_RW, QCOM_SCM_VAL, QCOM_SCM_RW, QCOM_SCM_VAL); ret = qcom_scm_call(dev, &desc); if (result) *result = desc.res[1]; if (response_type) *response_type = desc.res[0]; if (data) *data = desc.res[2]; return ret; } int __qcom_scm_invoke_smc(struct device *dev, phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data) Loading
drivers/firmware/qcom_scm.c +9 −0 Original line number Diff line number Diff line Loading @@ -980,6 +980,15 @@ int qcom_scm_request_encrypted_log(phys_addr_t buf, size_t len, } EXPORT_SYMBOL(qcom_scm_request_encrypted_log); int qcom_scm_invoke_smc_legacy(phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data) { return __qcom_scm_invoke_smc_legacy(__scm->dev, in_buf, in_buf_size, out_buf, out_buf_size, result, response_type, data); } EXPORT_SYMBOL(qcom_scm_invoke_smc_legacy); int qcom_scm_invoke_smc(phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data) Loading
drivers/firmware/qcom_scm.h +5 −1 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* Copyright (c) 2010-2015,2020 The Linux Foundation. All rights reserved. /* Copyright (c) 2010-2015,2020-2021 The Linux Foundation. All rights reserved. */ #ifndef __QCOM_SCM_INT_H #define __QCOM_SCM_INT_H Loading Loading @@ -260,8 +260,12 @@ extern int __qcom_scm_request_encrypted_log(struct device *dev, phys_addr_t buf, extern int __qcom_scm_ice_restore_cfg(struct device *dev); #define QCOM_SCM_SVC_SMCINVOKE 0x06 #define QCOM_SCM_SMCINVOKE_INVOKE_LEGACY 0x00 #define QCOM_SCM_SMCINVOKE_INVOKE 0x02 #define QCOM_SCM_SMCINVOKE_CB_RSP 0x01 extern int __qcom_scm_invoke_smc_legacy(struct device *dev, phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data); extern int __qcom_scm_invoke_smc(struct device *dev, phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data); Loading
drivers/soc/qcom/smcinvoke.c +16 −5 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include <linux/kref.h> #include <linux/signal.h> #include <linux/msm_ion.h> #include <linux/of_platform.h> #include <linux/qcom_scm.h> #include <asm/cacheflush.h> Loading Loading @@ -50,6 +51,7 @@ /* TZ defined values - Start */ #define SMCINVOKE_INVOKE_PARAM_ID 0x224 #define SMCINVOKE_CB_RSP_PARAM_ID 0x22 #define SMCINVOKE_INVOKE_CMD_LEGACY 0x32000600 #define SMCINVOKE_INVOKE_CMD 0x32000602 #define SMCINVOKE_CB_RSP_CMD 0x32000601 #define SMCINVOKE_RESULT_INBOUND_REQ_NEEDED 3 Loading Loading @@ -144,6 +146,7 @@ static uint16_t g_last_cb_server_id = CBOBJ_SERVER_ID_START; static uint16_t g_last_mem_rgn_id, g_last_mem_map_obj_id; static size_t g_max_cb_buf_size = SMCINVOKE_TZ_MIN_BUF_SIZE; static unsigned int cb_reqs_inflight; static bool legacy_smc_call; static long smcinvoke_ioctl(struct file *, unsigned int, unsigned long); static int smcinvoke_open(struct inode *, struct file *); Loading Loading @@ -1228,6 +1231,9 @@ static int prepare_send_scm_msg(const uint8_t *in_buf, phys_addr_t in_paddr, if ((in_buf_len % PAGE_SIZE) != 0 || (out_buf_len % PAGE_SIZE) != 0) return -EINVAL; if (legacy_smc_call) cmd = SMCINVOKE_INVOKE_CMD_LEGACY; else cmd = SMCINVOKE_INVOKE_CMD; /* * purpose of lock here is to ensure that any CB obj that may be going Loading @@ -1241,11 +1247,14 @@ static int prepare_send_scm_msg(const uint8_t *in_buf, phys_addr_t in_paddr, while (1) { mutex_lock(&g_smcinvoke_lock); if (cmd == SMCINVOKE_INVOKE_CMD) if (cmd == SMCINVOKE_INVOKE_CMD_LEGACY) ret = qcom_scm_invoke_smc_legacy(in_paddr, in_buf_len, out_paddr, out_buf_len, &req->result, &response_type, &data); else if (cmd == SMCINVOKE_INVOKE_CMD) ret = qcom_scm_invoke_smc(in_paddr, in_buf_len, out_paddr, out_buf_len, &req->result, &response_type, &data); &req->result, &response_type, &data); else ret = qcom_scm_invoke_callback_response( virt_to_phys(out_buf), out_buf_len, Loading Loading @@ -2071,6 +2080,8 @@ static int smcinvoke_probe(struct platform_device *pdev) pr_err("dma_set_mask_and_coherent failed %d\n", rc); goto exit_destroy_device; } legacy_smc_call = of_property_read_bool((&pdev->dev)->of_node, "qcom,support-legacy_smc"); return 0; Loading
include/linux/qcom_scm.h +6 −0 Original line number Diff line number Diff line Loading @@ -192,6 +192,9 @@ extern int qcom_scm_register_qsee_log_buf(phys_addr_t buf, size_t len); extern int qcom_scm_query_encrypted_log_feature(u64 *enabled); extern int qcom_scm_request_encrypted_log(phys_addr_t buf, size_t len, uint32_t log_id); extern int qcom_scm_invoke_smc_legacy(phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data); extern int qcom_scm_invoke_smc(phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data); Loading Loading @@ -365,6 +368,9 @@ static inline int qcom_scm_query_encrypted_log_feature(u64 *enabled) static inline int qcom_scm_request_encrypted_log(phys_addr_t buf, size_t len, uint32_t log_id) { return -ENODEV; } static inline int qcom_scm_invoke_smc_legacy(phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *request_type, unsigned int *data) { return -ENODEV; } static inline int qcom_scm_invoke_smc(phys_addr_t in_buf, size_t in_buf_size, phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *request_type, unsigned int *data) { return -ENODEV; } Loading