Loading drivers/iommu/io-pgtable-msm-secure.c +41 −24 Original line number Diff line number Diff line Loading @@ -47,6 +47,11 @@ struct msm_secure_io_pgtable { int msm_iommu_sec_pgtbl_init(void) { struct msm_scm_ptbl_init { unsigned int paddr; unsigned int size; unsigned int spare; } pinit = {0}; int psize[2] = {0, 0}; unsigned int spare = 0; int ret, ptbl_ret = 0; Loading @@ -55,7 +60,12 @@ int msm_iommu_sec_pgtbl_init(void) dma_addr_t paddr; unsigned long attrs = 0; if (is_scm_armv8()) { struct scm_desc desc = {0}; if (!is_scm_armv8()) { ret = scm_call(SCM_SVC_MP, IOMMU_SECURE_PTBL_SIZE, &spare, sizeof(spare), psize, sizeof(psize)); } else { struct scm_desc desc = {0}; desc.args[0] = spare; Loading @@ -64,12 +74,11 @@ int msm_iommu_sec_pgtbl_init(void) IOMMU_SECURE_PTBL_SIZE), &desc); psize[0] = desc.ret[0]; psize[1] = desc.ret[1]; } if (ret || psize[1]) { pr_err("scm call IOMMU_SECURE_PTBL_SIZE failed\n"); return ret; goto fail; } } /* Now allocate memory for the secure page tables */ attrs = DMA_ATTR_NO_KERNEL_MAPPING; dev.coherent_dma_mask = DMA_BIT_MASK(sizeof(dma_addr_t) * 8); Loading @@ -78,34 +87,42 @@ int msm_iommu_sec_pgtbl_init(void) if (!cpu_addr) { pr_err("%s: Failed to allocate %d bytes for PTBL\n", __func__, psize[0]); return -ENOMEM; ret = -ENOMEM; goto fail; } if (is_scm_armv8()) { struct scm_desc desc = {0}; pinit.paddr = (unsigned int)paddr; /* paddr may be a physical address > 4GB */ desc.args[0] = paddr; desc.args[1] = psize[0]; desc.args[2] = 0; desc.args[1] = pinit.size = psize[0]; desc.args[2] = pinit.spare; desc.arginfo = SCM_ARGS(3, SCM_RW, SCM_VAL, SCM_VAL); if (!is_scm_armv8()) { ret = scm_call(SCM_SVC_MP, IOMMU_SECURE_PTBL_INIT, &pinit, sizeof(pinit), &ptbl_ret, sizeof(ptbl_ret)); } else { ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, IOMMU_SECURE_PTBL_INIT), &desc); ptbl_ret = desc.ret[0]; } if (ret) { pr_err("scm call IOMMU_SECURE_PTBL_INIT failed\n"); return ret; goto fail_mem; } if (ptbl_ret) { pr_err("scm call IOMMU_SECURE_PTBL_INIT extended ret fail\n"); return ret; } goto fail_mem; } return 0; fail_mem: dma_free_attrs(&dev, psize[0], cpu_addr, paddr, attrs); fail: return ret; } EXPORT_SYMBOL(msm_iommu_sec_pgtbl_init); static int msm_secure_map(struct io_pgtable_ops *ops, unsigned long iova, Loading Loading
drivers/iommu/io-pgtable-msm-secure.c +41 −24 Original line number Diff line number Diff line Loading @@ -47,6 +47,11 @@ struct msm_secure_io_pgtable { int msm_iommu_sec_pgtbl_init(void) { struct msm_scm_ptbl_init { unsigned int paddr; unsigned int size; unsigned int spare; } pinit = {0}; int psize[2] = {0, 0}; unsigned int spare = 0; int ret, ptbl_ret = 0; Loading @@ -55,7 +60,12 @@ int msm_iommu_sec_pgtbl_init(void) dma_addr_t paddr; unsigned long attrs = 0; if (is_scm_armv8()) { struct scm_desc desc = {0}; if (!is_scm_armv8()) { ret = scm_call(SCM_SVC_MP, IOMMU_SECURE_PTBL_SIZE, &spare, sizeof(spare), psize, sizeof(psize)); } else { struct scm_desc desc = {0}; desc.args[0] = spare; Loading @@ -64,12 +74,11 @@ int msm_iommu_sec_pgtbl_init(void) IOMMU_SECURE_PTBL_SIZE), &desc); psize[0] = desc.ret[0]; psize[1] = desc.ret[1]; } if (ret || psize[1]) { pr_err("scm call IOMMU_SECURE_PTBL_SIZE failed\n"); return ret; goto fail; } } /* Now allocate memory for the secure page tables */ attrs = DMA_ATTR_NO_KERNEL_MAPPING; dev.coherent_dma_mask = DMA_BIT_MASK(sizeof(dma_addr_t) * 8); Loading @@ -78,34 +87,42 @@ int msm_iommu_sec_pgtbl_init(void) if (!cpu_addr) { pr_err("%s: Failed to allocate %d bytes for PTBL\n", __func__, psize[0]); return -ENOMEM; ret = -ENOMEM; goto fail; } if (is_scm_armv8()) { struct scm_desc desc = {0}; pinit.paddr = (unsigned int)paddr; /* paddr may be a physical address > 4GB */ desc.args[0] = paddr; desc.args[1] = psize[0]; desc.args[2] = 0; desc.args[1] = pinit.size = psize[0]; desc.args[2] = pinit.spare; desc.arginfo = SCM_ARGS(3, SCM_RW, SCM_VAL, SCM_VAL); if (!is_scm_armv8()) { ret = scm_call(SCM_SVC_MP, IOMMU_SECURE_PTBL_INIT, &pinit, sizeof(pinit), &ptbl_ret, sizeof(ptbl_ret)); } else { ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, IOMMU_SECURE_PTBL_INIT), &desc); ptbl_ret = desc.ret[0]; } if (ret) { pr_err("scm call IOMMU_SECURE_PTBL_INIT failed\n"); return ret; goto fail_mem; } if (ptbl_ret) { pr_err("scm call IOMMU_SECURE_PTBL_INIT extended ret fail\n"); return ret; } goto fail_mem; } return 0; fail_mem: dma_free_attrs(&dev, psize[0], cpu_addr, paddr, attrs); fail: return ret; } EXPORT_SYMBOL(msm_iommu_sec_pgtbl_init); static int msm_secure_map(struct io_pgtable_ops *ops, unsigned long iova, Loading