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

Commit 8482ee5e authored by Russell King's avatar Russell King Committed by Thierry Reding
Browse files

iommu/tegra-smmu: Factor out common PTE setting



Factor out the common PTE setting code into a separate function.

Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
parent b98e34f0
Loading
Loading
Loading
Loading
+17 −20
Original line number Original line Diff line number Diff line
@@ -541,12 +541,24 @@ static void tegra_smmu_pte_put_use(struct tegra_smmu_as *as, unsigned long iova)
	}
	}
}
}


static void tegra_smmu_set_pte(struct tegra_smmu_as *as, unsigned long iova,
			       u32 *pte, struct page *pte_page, u32 val)
{
	struct tegra_smmu *smmu = as->smmu;
	unsigned long offset = offset_in_page(pte);

	*pte = val;

	smmu->soc->ops->flush_dcache(pte_page, offset, 4);
	smmu_flush_ptc(smmu, pte_page, offset);
	smmu_flush_tlb_group(smmu, as->id, iova);
	smmu_flush(smmu);
}

static int tegra_smmu_map(struct iommu_domain *domain, unsigned long iova,
static int tegra_smmu_map(struct iommu_domain *domain, unsigned long iova,
			  phys_addr_t paddr, size_t size, int prot)
			  phys_addr_t paddr, size_t size, int prot)
{
{
	struct tegra_smmu_as *as = to_smmu_as(domain);
	struct tegra_smmu_as *as = to_smmu_as(domain);
	struct tegra_smmu *smmu = as->smmu;
	unsigned long offset;
	struct page *page;
	struct page *page;
	u32 *pte;
	u32 *pte;


@@ -554,13 +566,8 @@ static int tegra_smmu_map(struct iommu_domain *domain, unsigned long iova,
	if (!pte)
	if (!pte)
		return -ENOMEM;
		return -ENOMEM;


	*pte = __phys_to_pfn(paddr) | SMMU_PTE_ATTR;
	tegra_smmu_set_pte(as, iova, pte, page,
	offset = offset_in_page(pte);
			   __phys_to_pfn(paddr) | SMMU_PTE_ATTR);

	smmu->soc->ops->flush_dcache(page, offset, 4);
	smmu_flush_ptc(smmu, page, offset);
	smmu_flush_tlb_group(smmu, as->id, iova);
	smmu_flush(smmu);


	return 0;
	return 0;
}
}
@@ -569,8 +576,6 @@ static size_t tegra_smmu_unmap(struct iommu_domain *domain, unsigned long iova,
			       size_t size)
			       size_t size)
{
{
	struct tegra_smmu_as *as = to_smmu_as(domain);
	struct tegra_smmu_as *as = to_smmu_as(domain);
	struct tegra_smmu *smmu = as->smmu;
	unsigned long offset;
	struct page *page;
	struct page *page;
	u32 *pte;
	u32 *pte;


@@ -578,15 +583,7 @@ static size_t tegra_smmu_unmap(struct iommu_domain *domain, unsigned long iova,
	if (!pte || !*pte)
	if (!pte || !*pte)
		return 0;
		return 0;


	*pte = 0;
	tegra_smmu_set_pte(as, iova, pte, page, 0);

	offset = offset_in_page(pte);

	smmu->soc->ops->flush_dcache(page, offset, 4);
	smmu_flush_ptc(smmu, page, offset);
	smmu_flush_tlb_group(smmu, as->id, iova);
	smmu_flush(smmu);

	tegra_smmu_pte_put_use(as, iova);
	tegra_smmu_pte_put_use(as, iova);


	return size;
	return size;