Loading drivers/firmware/qcom_scm-smc.c +68 −0 Original line number Diff line number Diff line Loading @@ -2446,6 +2446,74 @@ int __qcom_scm_qseecom_do(struct device *dev, u32 cmd_id, struct scm_desc *desc, return _ret; } int __qcom_scm_paravirt_smmu_attach(struct device *dev, u64 sid, u64 asid, u64 ste_pa, u64 ste_size, u64 cd_pa, u64 cd_size) { struct qcom_scm_desc desc = { .svc = QCOM_SCM_SVC_SMMU_PROGRAM, .cmd = ARM_SMMU_PARAVIRT_CMD, .owner = ARM_SMCCC_OWNER_SIP, }; int ret; desc.args[0] = SMMU_PARAVIRT_OP_ATTACH; desc.args[1] = sid; desc.args[2] = asid; desc.args[3] = 0; desc.args[4] = ste_pa; desc.args[5] = ste_size; desc.args[6] = cd_pa; desc.args[7] = cd_size; desc.arginfo = ARM_SMMU_PARAVIRT_DESCARG; ret = qcom_scm_call(dev, &desc); return ret ? : desc.res[0]; } int __qcom_scm_paravirt_tlb_inv(struct device *dev, u64 asid) { struct qcom_scm_desc desc = { .svc = QCOM_SCM_SVC_SMMU_PROGRAM, .cmd = ARM_SMMU_PARAVIRT_CMD, .owner = ARM_SMCCC_OWNER_SIP, }; int ret; desc.args[0] = SMMU_PARAVIRT_OP_INVAL_ASID; desc.args[1] = 0; desc.args[2] = asid; desc.args[3] = 0; desc.args[4] = 0; desc.args[5] = 0; desc.args[6] = 0; desc.args[7] = 0; desc.arginfo = ARM_SMMU_PARAVIRT_DESCARG; ret = qcom_scm_call_atomic(dev, &desc); return ret ? : desc.res[0]; } int __qcom_scm_paravirt_smmu_detach(struct device *dev, u64 sid) { struct qcom_scm_desc desc = { .svc = QCOM_SCM_SVC_SMMU_PROGRAM, .cmd = ARM_SMMU_PARAVIRT_CMD, .owner = ARM_SMCCC_OWNER_SIP, }; int ret; desc.args[0] = SMMU_PARAVIRT_OP_DETACH; desc.args[1] = sid; desc.args[2] = 0; desc.args[3] = 0; desc.args[4] = 0; desc.args[5] = 0; desc.args[6] = 0; desc.args[7] = 0; desc.arginfo = ARM_SMMU_PARAVIRT_DESCARG; ret = qcom_scm_call(dev, &desc); return ret ? : desc.res[0]; } #ifdef CONFIG_QCOM_RTIC #define TZ_RTIC_ENABLE_MEM_PROTECTION 0x4 Loading drivers/firmware/qcom_scm.c +21 −0 Original line number Diff line number Diff line Loading @@ -475,6 +475,27 @@ void qcom_scm_deassert_ps_hold(void) } EXPORT_SYMBOL(qcom_scm_deassert_ps_hold); int qcom_scm_paravirt_smmu_attach(u64 sid, u64 asid, u64 ste_pa, u64 ste_size, u64 cd_pa, u64 cd_size) { return __qcom_scm_paravirt_smmu_attach(__scm ? __scm->dev : NULL, sid, asid, ste_pa, ste_size, cd_pa, cd_size); } EXPORT_SYMBOL(qcom_scm_paravirt_smmu_attach); int qcom_scm_paravirt_tlb_inv(u64 asid) { return __qcom_scm_paravirt_tlb_inv(__scm ? __scm->dev : NULL, asid); } EXPORT_SYMBOL(qcom_scm_paravirt_tlb_inv); int qcom_scm_paravirt_smmu_detach(u64 sid) { return __qcom_scm_paravirt_smmu_detach(__scm ? __scm->dev : NULL, sid); } EXPORT_SYMBOL(qcom_scm_paravirt_smmu_detach); void qcom_scm_mmu_sync(bool sync) { __qcom_scm_mmu_sync(__scm ? __scm->dev : NULL, sync); Loading drivers/firmware/qcom_scm.h +21 −0 Original line number Diff line number Diff line Loading @@ -241,6 +241,27 @@ extern int __qcom_scm_qseecom_do(struct device *dev, u32 cmd_id, #define QCOM_SCM_TSENS_INIT_ID 0x5 extern int __qcom_scm_tsens_reinit(struct device *dev, int *tsens_ret); //SMMU Paravirt driver #define SMMU_PARAVIRT_OP_ATTACH 0 #define SMMU_PARAVIRT_OP_DETACH 1 #define SMMU_PARAVIRT_OP_INVAL_ASID 2 #define SMMU_PARAVIRT_OP_INVAL_VA 3 #define SMMU_PARAVIRT_OP_ALL_S1_BYPASS 4 #define SMMU_PARAVIRT_OP_CFGI_CD_ALL 5 #define SMMU_PARAVIRT_OP_TLBI_NH_ALL 6 #define ARM_SMMU_PARAVIRT_CMD 0x6 #define ARM_SMMU_PARAVIRT_DESCARG 0x22200a extern int __qcom_scm_paravirt_smmu_attach(struct device *dev, u64 sid, u64 asid, u64 ste_pa, u64 ste_size, u64 cd_pa, u64 cd_size); extern int __qcom_scm_paravirt_tlb_inv(struct device *dev, u64 asid); extern int __qcom_scm_paravirt_smmu_detach(struct device *dev, u64 sid); // OEM Services and Function IDs #define QCOM_SCM_SVC_OEM_POWER 0x09 #define QCOM_SCM_OEM_POWER_REBOOT 0x22 Loading include/linux/qcom_scm.h +11 −0 Original line number Diff line number Diff line Loading @@ -126,6 +126,10 @@ extern int qcom_scm_iommu_secure_map(phys_addr_t sg_list_addr, size_t num_sg, unsigned long iova, size_t total_len); extern int qcom_scm_iommu_secure_unmap(u64 sec_id, int cbndx, unsigned long iova, size_t total_len); extern int qcom_scm_paravirt_smmu_attach(u64 sid, u64 asid, u64 ste_pa, u64 ste_size, u64 cd_pa, u64 cd_size); extern int qcom_scm_paravirt_tlb_inv(u64 asid); extern int qcom_scm_paravirt_smmu_detach(u64 sid); extern int qcom_scm_assign_mem_regions(struct qcom_scm_mem_map_info *mem_regions, size_t mem_regions_sz, u32 *srcvms, size_t src_sz, Loading Loading @@ -283,6 +287,13 @@ static inline int qcom_scm_iommu_secure_map(phys_addr_t sg_list_addr, unsigned long iova, size_t total_len) { return -ENODEV; } static inline int qcom_scm_iommu_secure_unmap(u64 sec_id, int cbndx, unsigned long iova, size_t total_len) { return -ENODEV; } static inline int qcom_scm_paravirt_smmu_attach(u64 sid, u64 asid, u64 ste_pa, u64 ste_size, u64 cd_pa, u64 cd_size) { return -ENODEV; } static inline int qcom_scm_paravirt_tlb_inv(u64 asid) { return -ENODEV; } static inline int qcom_scm_paravirt_smmu_detach(u64 sid) { return -ENODEV; } static inline int qcom_scm_assign_mem_regions(struct qcom_scm_mem_map_info *mem_regions, size_t mem_regions_sz, u32 *srcvms, size_t src_sz, Loading Loading
drivers/firmware/qcom_scm-smc.c +68 −0 Original line number Diff line number Diff line Loading @@ -2446,6 +2446,74 @@ int __qcom_scm_qseecom_do(struct device *dev, u32 cmd_id, struct scm_desc *desc, return _ret; } int __qcom_scm_paravirt_smmu_attach(struct device *dev, u64 sid, u64 asid, u64 ste_pa, u64 ste_size, u64 cd_pa, u64 cd_size) { struct qcom_scm_desc desc = { .svc = QCOM_SCM_SVC_SMMU_PROGRAM, .cmd = ARM_SMMU_PARAVIRT_CMD, .owner = ARM_SMCCC_OWNER_SIP, }; int ret; desc.args[0] = SMMU_PARAVIRT_OP_ATTACH; desc.args[1] = sid; desc.args[2] = asid; desc.args[3] = 0; desc.args[4] = ste_pa; desc.args[5] = ste_size; desc.args[6] = cd_pa; desc.args[7] = cd_size; desc.arginfo = ARM_SMMU_PARAVIRT_DESCARG; ret = qcom_scm_call(dev, &desc); return ret ? : desc.res[0]; } int __qcom_scm_paravirt_tlb_inv(struct device *dev, u64 asid) { struct qcom_scm_desc desc = { .svc = QCOM_SCM_SVC_SMMU_PROGRAM, .cmd = ARM_SMMU_PARAVIRT_CMD, .owner = ARM_SMCCC_OWNER_SIP, }; int ret; desc.args[0] = SMMU_PARAVIRT_OP_INVAL_ASID; desc.args[1] = 0; desc.args[2] = asid; desc.args[3] = 0; desc.args[4] = 0; desc.args[5] = 0; desc.args[6] = 0; desc.args[7] = 0; desc.arginfo = ARM_SMMU_PARAVIRT_DESCARG; ret = qcom_scm_call_atomic(dev, &desc); return ret ? : desc.res[0]; } int __qcom_scm_paravirt_smmu_detach(struct device *dev, u64 sid) { struct qcom_scm_desc desc = { .svc = QCOM_SCM_SVC_SMMU_PROGRAM, .cmd = ARM_SMMU_PARAVIRT_CMD, .owner = ARM_SMCCC_OWNER_SIP, }; int ret; desc.args[0] = SMMU_PARAVIRT_OP_DETACH; desc.args[1] = sid; desc.args[2] = 0; desc.args[3] = 0; desc.args[4] = 0; desc.args[5] = 0; desc.args[6] = 0; desc.args[7] = 0; desc.arginfo = ARM_SMMU_PARAVIRT_DESCARG; ret = qcom_scm_call(dev, &desc); return ret ? : desc.res[0]; } #ifdef CONFIG_QCOM_RTIC #define TZ_RTIC_ENABLE_MEM_PROTECTION 0x4 Loading
drivers/firmware/qcom_scm.c +21 −0 Original line number Diff line number Diff line Loading @@ -475,6 +475,27 @@ void qcom_scm_deassert_ps_hold(void) } EXPORT_SYMBOL(qcom_scm_deassert_ps_hold); int qcom_scm_paravirt_smmu_attach(u64 sid, u64 asid, u64 ste_pa, u64 ste_size, u64 cd_pa, u64 cd_size) { return __qcom_scm_paravirt_smmu_attach(__scm ? __scm->dev : NULL, sid, asid, ste_pa, ste_size, cd_pa, cd_size); } EXPORT_SYMBOL(qcom_scm_paravirt_smmu_attach); int qcom_scm_paravirt_tlb_inv(u64 asid) { return __qcom_scm_paravirt_tlb_inv(__scm ? __scm->dev : NULL, asid); } EXPORT_SYMBOL(qcom_scm_paravirt_tlb_inv); int qcom_scm_paravirt_smmu_detach(u64 sid) { return __qcom_scm_paravirt_smmu_detach(__scm ? __scm->dev : NULL, sid); } EXPORT_SYMBOL(qcom_scm_paravirt_smmu_detach); void qcom_scm_mmu_sync(bool sync) { __qcom_scm_mmu_sync(__scm ? __scm->dev : NULL, sync); Loading
drivers/firmware/qcom_scm.h +21 −0 Original line number Diff line number Diff line Loading @@ -241,6 +241,27 @@ extern int __qcom_scm_qseecom_do(struct device *dev, u32 cmd_id, #define QCOM_SCM_TSENS_INIT_ID 0x5 extern int __qcom_scm_tsens_reinit(struct device *dev, int *tsens_ret); //SMMU Paravirt driver #define SMMU_PARAVIRT_OP_ATTACH 0 #define SMMU_PARAVIRT_OP_DETACH 1 #define SMMU_PARAVIRT_OP_INVAL_ASID 2 #define SMMU_PARAVIRT_OP_INVAL_VA 3 #define SMMU_PARAVIRT_OP_ALL_S1_BYPASS 4 #define SMMU_PARAVIRT_OP_CFGI_CD_ALL 5 #define SMMU_PARAVIRT_OP_TLBI_NH_ALL 6 #define ARM_SMMU_PARAVIRT_CMD 0x6 #define ARM_SMMU_PARAVIRT_DESCARG 0x22200a extern int __qcom_scm_paravirt_smmu_attach(struct device *dev, u64 sid, u64 asid, u64 ste_pa, u64 ste_size, u64 cd_pa, u64 cd_size); extern int __qcom_scm_paravirt_tlb_inv(struct device *dev, u64 asid); extern int __qcom_scm_paravirt_smmu_detach(struct device *dev, u64 sid); // OEM Services and Function IDs #define QCOM_SCM_SVC_OEM_POWER 0x09 #define QCOM_SCM_OEM_POWER_REBOOT 0x22 Loading
include/linux/qcom_scm.h +11 −0 Original line number Diff line number Diff line Loading @@ -126,6 +126,10 @@ extern int qcom_scm_iommu_secure_map(phys_addr_t sg_list_addr, size_t num_sg, unsigned long iova, size_t total_len); extern int qcom_scm_iommu_secure_unmap(u64 sec_id, int cbndx, unsigned long iova, size_t total_len); extern int qcom_scm_paravirt_smmu_attach(u64 sid, u64 asid, u64 ste_pa, u64 ste_size, u64 cd_pa, u64 cd_size); extern int qcom_scm_paravirt_tlb_inv(u64 asid); extern int qcom_scm_paravirt_smmu_detach(u64 sid); extern int qcom_scm_assign_mem_regions(struct qcom_scm_mem_map_info *mem_regions, size_t mem_regions_sz, u32 *srcvms, size_t src_sz, Loading Loading @@ -283,6 +287,13 @@ static inline int qcom_scm_iommu_secure_map(phys_addr_t sg_list_addr, unsigned long iova, size_t total_len) { return -ENODEV; } static inline int qcom_scm_iommu_secure_unmap(u64 sec_id, int cbndx, unsigned long iova, size_t total_len) { return -ENODEV; } static inline int qcom_scm_paravirt_smmu_attach(u64 sid, u64 asid, u64 ste_pa, u64 ste_size, u64 cd_pa, u64 cd_size) { return -ENODEV; } static inline int qcom_scm_paravirt_tlb_inv(u64 asid) { return -ENODEV; } static inline int qcom_scm_paravirt_smmu_detach(u64 sid) { return -ENODEV; } static inline int qcom_scm_assign_mem_regions(struct qcom_scm_mem_map_info *mem_regions, size_t mem_regions_sz, u32 *srcvms, size_t src_sz, Loading