lkml.org 
[lkml]   [2023]   [Oct]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 12/15] firmware: qcom: scm: add support for SHM bridge operations
    Date
    From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

    Add low-level primitives for enabling SHM bridge support as well as
    creating and destroying SHM bridge pools to qcom-scm.

    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
    ---
    drivers/firmware/qcom/qcom_scm.c | 60 ++++++++++++++++++++++++++
    drivers/firmware/qcom/qcom_scm.h | 3 ++
    include/linux/firmware/qcom/qcom_scm.h | 6 +++
    3 files changed, 69 insertions(+)

    diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_scm.c
    index 318d7d398e5f..839773270a21 100644
    --- a/drivers/firmware/qcom/qcom_scm.c
    +++ b/drivers/firmware/qcom/qcom_scm.c
    @@ -1323,6 +1323,66 @@ bool qcom_scm_lmh_dcvsh_available(void)
    }
    EXPORT_SYMBOL_GPL(qcom_scm_lmh_dcvsh_available);

    +int qcom_scm_shm_bridge_enable(void)
    +{
    + struct qcom_scm_desc desc = {
    + .svc = QCOM_SCM_SVC_MP,
    + .cmd = QCOM_SCM_MP_SHM_BRIDGE_ENABLE,
    + .owner = ARM_SMCCC_OWNER_SIP
    + };
    +
    + struct qcom_scm_res res;
    +
    + if (!__qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_MP,
    + QCOM_SCM_MP_SHM_BRIDGE_ENABLE))
    + return -EOPNOTSUPP;
    +
    + return qcom_scm_call(__scm->dev, &desc, &res) ?: res.result[0];
    +}
    +EXPORT_SYMBOL_GPL(qcom_scm_shm_bridge_enable);
    +
    +int qcom_scm_shm_bridge_create(struct device *dev, u64 pfn_and_ns_perm_flags,
    + u64 ipfn_and_s_perm_flags, u64 size_and_flags,
    + u64 ns_vmids, u64 *handle)
    +{
    + struct qcom_scm_desc desc = {
    + .svc = QCOM_SCM_SVC_MP,
    + .cmd = QCOM_SCM_MP_SHM_BRIDGE_CREATE,
    + .owner = ARM_SMCCC_OWNER_SIP,
    + .args[0] = pfn_and_ns_perm_flags,
    + .args[1] = ipfn_and_s_perm_flags,
    + .args[2] = size_and_flags,
    + .args[3] = ns_vmids,
    + .arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_VAL, QCOM_SCM_VAL,
    + QCOM_SCM_VAL, QCOM_SCM_VAL),
    + };
    +
    + struct qcom_scm_res res;
    + int ret;
    +
    + ret = qcom_scm_call(__scm->dev, &desc, &res);
    +
    + if (handle && !ret)
    + *handle = res.result[1];
    +
    + return ret ?: res.result[0];
    +}
    +EXPORT_SYMBOL_GPL(qcom_scm_shm_bridge_create);
    +
    +int qcom_scm_shm_bridge_delete(struct device *dev, u64 handle)
    +{
    + struct qcom_scm_desc desc = {
    + .svc = QCOM_SCM_SVC_MP,
    + .cmd = QCOM_SCM_MP_SHM_BRIDGE_DELETE,
    + .owner = ARM_SMCCC_OWNER_SIP,
    + .args[0] = handle,
    + .arginfo = QCOM_SCM_ARGS(1, QCOM_SCM_VAL),
    + };
    +
    + return qcom_scm_call(__scm->dev, &desc, NULL);
    +}
    +EXPORT_SYMBOL_GPL(qcom_scm_shm_bridge_delete);
    +
    int qcom_scm_lmh_profile_change(u32 profile_id)
    {
    struct qcom_scm_desc desc = {
    diff --git a/drivers/firmware/qcom/qcom_scm.h b/drivers/firmware/qcom/qcom_scm.h
    index aa7d06939f8e..cb7273aa0a5e 100644
    --- a/drivers/firmware/qcom/qcom_scm.h
    +++ b/drivers/firmware/qcom/qcom_scm.h
    @@ -116,6 +116,9 @@ struct qcom_tzmem_pool *qcom_scm_get_tzmem_pool(void);
    #define QCOM_SCM_MP_IOMMU_SET_CP_POOL_SIZE 0x05
    #define QCOM_SCM_MP_VIDEO_VAR 0x08
    #define QCOM_SCM_MP_ASSIGN 0x16
    +#define QCOM_SCM_MP_SHM_BRIDGE_ENABLE 0x1c
    +#define QCOM_SCM_MP_SHM_BRIDGE_DELETE 0x1d
    +#define QCOM_SCM_MP_SHM_BRIDGE_CREATE 0x1e

    #define QCOM_SCM_SVC_OCMEM 0x0f
    #define QCOM_SCM_OCMEM_LOCK_CMD 0x01
    diff --git a/include/linux/firmware/qcom/qcom_scm.h b/include/linux/firmware/qcom/qcom_scm.h
    index ccaf28846054..9b6054813f59 100644
    --- a/include/linux/firmware/qcom/qcom_scm.h
    +++ b/include/linux/firmware/qcom/qcom_scm.h
    @@ -115,6 +115,12 @@ int qcom_scm_lmh_dcvsh(u32 payload_fn, u32 payload_reg, u32 payload_val,
    int qcom_scm_lmh_profile_change(u32 profile_id);
    bool qcom_scm_lmh_dcvsh_available(void);

    +int qcom_scm_shm_bridge_enable(void);
    +int qcom_scm_shm_bridge_create(struct device *dev, u64 pfn_and_ns_perm_flags,
    + u64 ipfn_and_s_perm_flags, u64 size_and_flags,
    + u64 ns_vmids, u64 *handle);
    +int qcom_scm_shm_bridge_delete(struct device *dev, u64 handle);
    +
    #ifdef CONFIG_QCOM_QSEECOM

    int qcom_scm_qseecom_app_get_id(const char *app_name, u32 *app_id);
    --
    2.39.2
    \
     
     \ /
      Last update: 2023-10-09 17:36    [W:8.235 / U:0.188 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site