Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d39f0b8b authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "iommu/arm-smmu: add scm_call for secure page table memory for armv7"

parents 5861ac46 9a59a47b
Loading
Loading
Loading
Loading
+41 −24
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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);
@@ -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,