From f74f403d2877c56384c9d3d8aa21806bf7c574c4 Mon Sep 17 00:00:00 2001 From: Asish Bhattacharya Date: Sat, 6 Mar 2021 07:42:09 +0530 Subject: [PATCH] scm: enable audio memory api This api is called once at boot. Change-Id: Ic00d313d3f269195f7ea9647da6f641a4c014305 Signed-off-by: Asish Bhattacharya --- drivers/firmware/qcom_scm-smc.c | 29 +++++++++++++++++++++++++++++ drivers/firmware/qcom_scm.c | 7 +++++++ drivers/firmware/qcom_scm.h | 2 ++ include/linux/qcom_scm.h | 3 +++ 4 files changed, 41 insertions(+) diff --git a/drivers/firmware/qcom_scm-smc.c b/drivers/firmware/qcom_scm-smc.c index c4253f2b38f3..af61bddab777 100644 --- a/drivers/firmware/qcom_scm-smc.c +++ b/drivers/firmware/qcom_scm-smc.c @@ -16,6 +16,7 @@ #include #include +#include #include "qcom_scm.h" @@ -2347,6 +2348,34 @@ int __qcom_scm_invoke_callback_response(struct device *dev, phys_addr_t out_buf, return ret; } + +#define TZ_SVC_MEMORY_PROTECTION 12 /* Memory protection service. */ + +#define TZ_MPU_LOCK_AUDIO_BUFFER \ + TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_SIP, TZ_SVC_MEMORY_PROTECTION, 0x06) + +#define TZ_MPU_LOCK_AUDIO_BUFFER_PARAM_ID \ + TZ_SYSCALL_CREATE_PARAM_ID_2( \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_VAL) +int __qcom_scm_mem_protect_audio(struct device *dev, phys_addr_t paddr, + size_t size) +{ + int ret; + struct qcom_scm_desc desc = { + .svc = TZ_SVC_MEMORY_PROTECTION, + .cmd = 0x6, + .owner = TZ_OWNER_SIP, + }; + + desc.args[0] = paddr; + desc.args[1] = size; + desc.arginfo = QCOM_SCM_ARGS(2); + + ret = qcom_scm_call(dev, &desc); + + return ret; +} + int __qcom_scm_qseecom_do(struct device *dev, u32 cmd_id, struct scm_desc *desc, bool retry) { diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index 106cc1609caf..40719f95c6bd 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -509,6 +509,13 @@ int qcom_scm_iommu_secure_unmap(u64 sec_id, int cbndx, unsigned long iova, } EXPORT_SYMBOL(qcom_scm_iommu_secure_unmap); +int qcom_scm_mem_protect_audio(phys_addr_t paddr, size_t size) +{ + return __qcom_scm_mem_protect_audio(__scm ? __scm->dev : NULL, + paddr, size); +} +EXPORT_SYMBOL(qcom_scm_mem_protect_audio); + /** * qcom_scm_assign_mem_regions() - Make a secure call to reassign memory * ownership of several memory regions diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h index 9406a82f23bc..98577f2aa1a7 100644 --- a/drivers/firmware/qcom_scm.h +++ b/drivers/firmware/qcom_scm.h @@ -274,6 +274,8 @@ extern int __qcom_scm_invoke_callback_response(struct device *dev, u64 *response_type, unsigned int *data); extern void __qcom_scm_init(void); +extern int __qcom_scm_mem_protect_audio(struct device *dev, phys_addr_t paddr, + size_t size); #ifdef CONFIG_QCOM_RTIC diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index cb799791f626..1306f1fbe2de 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -202,6 +202,7 @@ extern int qcom_scm_invoke_callback_response(phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *response_type, unsigned int *data); extern bool qcom_scm_is_available(void); +extern int qcom_scm_mem_protect_audio(phys_addr_t paddr, size_t size); #else #include @@ -378,5 +379,7 @@ static inline int qcom_scm_invoke_callback_response(phys_addr_t out_buf, size_t out_buf_size, int32_t *result, u64 *request_type, unsigned int *data) { return -ENODEV; } static inline bool qcom_scm_is_available(void) { return false; } +static inline int qcom_scm_mem_protect_audio(phys_addr_t paddr, size_t size) + { return -ENODEV; } #endif #endif