diff --git a/drivers/firmware/qcom_scm_addon.c b/drivers/firmware/qcom_scm_addon.c index b5e2e1e92b2b08807301fd5fe0f89cf75e3af11a..bd640410b03e8cc4621a6bd4535748c35bc2d714 100644 --- a/drivers/firmware/qcom_scm_addon.c +++ b/drivers/firmware/qcom_scm_addon.c @@ -50,6 +50,13 @@ #define QCOM_SCM_BOOT_WDOG_DEBUG_PART 0x09 #define QCOM_SCM_BOOT_SPIN_CPU 0x0d +/* IDs for SHE */ +#define QCOM_SCM_SVC_SHE 0x21 +#define QCOM_SCM_SHE_ID 0x1 + +/* IDs for QCOM_SCM_INFO_BW_PROF_ID */ +#define QCOM_SCM_INFO_BW_PROF_ID 0x07 + static int __qcom_scm_get_feat_version(struct device *dev, u64 feat_id, u64 *version) { int ret; @@ -563,3 +570,49 @@ int qcom_scm_spin_cpu(void) return qcom_scm_call(__scm->dev, &desc, NULL); } EXPORT_SYMBOL_GPL(qcom_scm_spin_cpu); + +int qcom_scm_ddrbw_profiler(phys_addr_t in_buf, size_t in_buf_size, + phys_addr_t out_buf, size_t out_buf_size) +{ + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_INFO, + .cmd = QCOM_SCM_INFO_BW_PROF_ID, + .owner = ARM_SMCCC_OWNER_SIP, + }; + + 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); + + return qcom_scm_call(__scm ? __scm->dev : NULL, &desc, NULL); +} +EXPORT_SYMBOL_GPL(qcom_scm_ddrbw_profiler); + +/** + * qcom_scm_she_op() - request TZ SHE (Secure Hardware Extension) service + * to perform crypto operations based on SHE tables. + */ +int qcom_scm_she_op(u64 _arg1, u64 _arg2, u64 _arg3, u64 _arg4) +{ + int ret; + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_SHE, + .cmd = QCOM_SCM_SHE_ID, + .owner = ARM_SMCCC_OWNER_SIP, + .arginfo = QCOM_SCM_ARGS(4), + }; + struct qcom_scm_res res; + + desc.args[0] = _arg1; + desc.args[1] = _arg2; + desc.args[2] = _arg3; + desc.args[3] = _arg4; + + ret = qcom_scm_call(__scm ? __scm->dev : NULL, &desc, &res); + + return ret ? : res.result[0]; +} +EXPORT_SYMBOL_GPL(qcom_scm_she_op); diff --git a/include/linux/firmware/qcom/qcom_scm_addon.h b/include/linux/firmware/qcom/qcom_scm_addon.h index 5bfbb91e6cc5301d17d3ecadc925e3b8e614e32c..ff70b18f881c210684d28b92f6d6dea00a62c268 100644 --- a/include/linux/firmware/qcom/qcom_scm_addon.h +++ b/include/linux/firmware/qcom/qcom_scm_addon.h @@ -49,7 +49,9 @@ extern int qcom_scm_create_shm_bridge(u64 pfn_and_ns_perm_flags, u64 ipfn_and_s_perm_flags, u64 size_and_flags, u64 ns_vmids, u64 *handle); extern int qcom_scm_spin_cpu(void); - +extern int qcom_scm_ddrbw_profiler(phys_addr_t in_buf, size_t in_buf_size, + phys_addr_t out_buf, size_t out_buf_size); +extern int qcom_scm_she_op(u64 _arg1, u64 _arg2, u64 _arg3, u64 _arg4); #else static inline bool qcom_scm_dcvs_ca_available(void) { @@ -195,5 +197,15 @@ static inline int qcom_scm_spin_cpu(void) return -EPERM; } +static inline int qcom_scm_ddrbw_profiler(phys_addr_t in_buf, size_t in_buf_size, + phys_addr_t out_buf, size_t out_buf_size) +{ + return -EPERM; +} + +static inline int qcom_scm_she_op(u64 _arg1, u64 _arg2, u64 _arg3, u64 _arg4) +{ + return -EPERM; +} #endif #endif