From 49ec350a86101181beb31be39b10cb7fcbcce02a Mon Sep 17 00:00:00 2001 From: Siddharth Gupta Date: Mon, 30 Sep 2019 15:50:28 -0700 Subject: [PATCH] soc: qcom: Migrate SCM calls in msm_tz_smmu Adding APIs to change smmu pagetable format, and to prepare atos id. Migrating SCM calls in msm_tz_smmu to use the new APIs. Change-Id: I3aed64cd524e94cfa6d6ea168031eda62fd14fb0 Signed-off-by: Siddharth Gupta Signed-off-by: Elliot Berman --- drivers/firmware/qcom_scm-smc.c | 44 +++++++++++++++++++++++++++++++++ drivers/firmware/qcom_scm.c | 13 ++++++++++ drivers/firmware/qcom_scm.h | 6 +++++ include/linux/qcom_scm.h | 6 +++++ 4 files changed, 69 insertions(+) diff --git a/drivers/firmware/qcom_scm-smc.c b/drivers/firmware/qcom_scm-smc.c index 3ada61be5311..11cebd03c917 100644 --- a/drivers/firmware/qcom_scm-smc.c +++ b/drivers/firmware/qcom_scm-smc.c @@ -1137,6 +1137,28 @@ int __qcom_scm_kgsl_set_smmu_aperture(struct device *dev, return ret; } +int __qcom_scm_smmu_prepare_atos_id(struct device *dev, u64 dev_id, int cb_num, + int operation) +{ + int ret; + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_MP, + .cmd = QCOM_SCM_MP_SMMU_PREPARE_ATOS_ID, + .owner = ARM_SMCCC_OWNER_SIP + }; + + desc.args[0] = dev_id; + desc.args[1] = cb_num; + desc.args[2] = operation; + + desc.arginfo = QCOM_SCM_ARGS(3, QCOM_SCM_VAL, QCOM_SCM_VAL, + QCOM_SCM_VAL); + + ret = qcom_scm_call(dev, &desc); + + return ret; +} + int __qcom_scm_hdcp_req(struct device *dev, struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp) { @@ -1168,6 +1190,28 @@ int __qcom_scm_hdcp_req(struct device *dev, struct qcom_scm_hdcp_req *req, return ret; } +int __qcom_scm_smmu_change_pgtbl_format(struct device *dev, u64 dev_id, + int cbndx) +{ + int ret; + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_SMMU_PROGRAM, + .cmd = QCOM_SCM_SMMU_CHANGE_PGTBL_FORMAT, + .owner = ARM_SMCCC_OWNER_SIP + }; + + desc.args[0] = dev_id; + desc.args[1] = cbndx; + desc.args[2] = 1; /* Enable */ + + desc.arginfo = QCOM_SCM_ARGS(3, QCOM_SCM_VAL, QCOM_SCM_VAL, + QCOM_SCM_VAL); + + ret = qcom_scm_call(dev, &desc); + + return ret; +} + int __qcom_scm_qsmmu500_wait_safe_toggle(struct device *dev, bool en) { struct qcom_scm_desc desc = { diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index 58a5d435fada..b331b5f45426 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -504,6 +504,13 @@ int qcom_scm_kgsl_set_smmu_aperture(unsigned int num_context_bank) } EXPORT_SYMBOL(qcom_scm_kgsl_set_smmu_aperture); +int qcom_scm_smmu_prepare_atos_id(u64 dev_id, int cb_num, int operation) +{ + return __qcom_scm_smmu_prepare_atos_id(__scm->dev, dev_id, cb_num, + operation); +} +EXPORT_SYMBOL(qcom_scm_smmu_prepare_atos_id); + /** * qcom_scm_hdcp_available() - Check if secure environment supports HDCP. * @@ -546,6 +553,12 @@ int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp) } EXPORT_SYMBOL(qcom_scm_hdcp_req); +int qcom_scm_smmu_change_pgtbl_format(u64 dev_id, int cbndx) +{ + return __qcom_scm_smmu_change_pgtbl_format(__scm->dev, dev_id, cbndx); +} +EXPORT_SYMBOL(qcom_scm_smmu_change_pgtbl_format); + int qcom_scm_qsmmu500_wait_safe_toggle(bool en) { return __qcom_scm_qsmmu500_wait_safe_toggle(__scm->dev, en); diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h index 46e5bd640bb7..67bb055aa3fa 100644 --- a/drivers/firmware/qcom_scm.h +++ b/drivers/firmware/qcom_scm.h @@ -70,6 +70,7 @@ extern void __qcom_scm_mmu_sync(struct device *dev, bool sync); #define QCOM_SCM_MP_IOMMU_SECURE_UNMAP2_FLAT 0x13 #define QCOM_SCM_MP_ASSIGN 0x16 #define QCOM_SCM_MP_CP_SMMU_APERTURE_ID 0x1b +#define QCOM_SCM_MP_SMMU_PREPARE_ATOS_ID 0x21 extern int __qcom_scm_restore_sec_cfg(struct device *dev, u32 device_id, u32 spare); extern int __qcom_scm_iommu_secure_ptbl_size(struct device *dev, u32 spare, @@ -95,6 +96,8 @@ extern int __qcom_scm_assign_mem(struct device *dev, phys_addr_t dest, size_t dest_sz); extern int __qcom_scm_kgsl_set_smmu_aperture(struct device *dev, unsigned int num_context_bank); +extern int __qcom_scm_smmu_prepare_atos_id(struct device *dev, u64 dev_id, + int cb_num, int operation); #define QCOM_SCM_IOMMU_TLBINVAL_FLAG 0x00000001 #define QCOM_SCM_CP_APERTURE_REG 0x0 @@ -104,7 +107,10 @@ extern int __qcom_scm_hdcp_req(struct device *dev, struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp); #define QCOM_SCM_SVC_SMMU_PROGRAM 0x15 +#define QCOM_SCM_SMMU_CHANGE_PGTBL_FORMAT 0x01 #define QCOM_SCM_SMMU_CONFIG_ERRATA1 0x3 +extern int __qcom_scm_smmu_change_pgtbl_format(struct device *dev, u64 dev_id, + int cbndx); extern int __qcom_scm_qsmmu500_wait_safe_toggle(struct device *dev, bool enable); #define QCOM_SCM_SMMU_CONFIG_ERRATA1_CLIENT_ALL 0x2 diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index a3aead9fedf9..be1457df54b7 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -71,9 +71,11 @@ extern int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, extern bool qcom_scm_kgsl_set_smmu_aperture_available(void); extern int qcom_scm_kgsl_set_smmu_aperture( unsigned int num_context_bank); +extern int qcom_scm_smmu_prepare_atos_id(u64 dev_id, int cb_num, int operation); extern bool qcom_scm_hdcp_available(void); extern int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp); +extern int qcom_scm_smmu_change_pgtbl_format(u64 dev_id, int cbndx); extern int qcom_scm_qsmmu500_wait_safe_toggle(bool en); extern int qcom_scm_ice_restore_cfg(void); extern bool qcom_scm_is_available(void); @@ -132,9 +134,13 @@ static inline bool qcom_scm_kgsl_set_smmu_aperture_available(void) { return false; } static inline int qcom_scm_kgsl_set_smmu_aperture( unsigned int num_context_bank) { return -ENODEV; } +static inline int qcom_scm_smmu_prepare_atos_id(u64 dev_id, int cb_num, + int operation) { return -ENODEV; } static inline bool qcom_scm_hdcp_available(void) { return false; } static inline int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp) { return -ENODEV; } +static inline int qcom_scm_smmu_change_pgtbl_format(u64 dev_id, int cbndx) + { return -ENODEV; } static inline int qcom_scm_qsmmu500_wait_safe_toggle(bool en) { return -ENODEV; } static inline int qcom_scm_ice_restore_cfg(void) { return -ENODEV; }