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

Commit 9dd2fe89 authored by Yu Zhao's avatar Yu Zhao Committed by David Woodhouse
Browse files

VT-d: cleanup iommu_flush_iotlb_psi and flush_unmaps



Make iommu_flush_iotlb_psi() and flush_unmaps() more readable.

Signed-off-by: default avatarYu Zhao <yu.zhao@intel.com>
Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent 6ba6c3a4
Loading
Loading
Loading
Loading
+17 −21
Original line number Diff line number Diff line
@@ -948,27 +948,22 @@ static void __iommu_flush_iotlb(struct intel_iommu *iommu, u16 did,
static void iommu_flush_iotlb_psi(struct intel_iommu *iommu, u16 did,
				  u64 addr, unsigned int pages)
{
	unsigned int mask;
	unsigned int mask = ilog2(__roundup_pow_of_two(pages));

	BUG_ON(addr & (~VTD_PAGE_MASK));
	BUG_ON(pages == 0);

	/* Fallback to domain selective flush if no PSI support */
	if (!cap_pgsel_inv(iommu->cap))
		return iommu->flush.flush_iotlb(iommu, did, 0, 0,
						DMA_TLB_DSI_FLUSH);

	/*
	 * Fallback to domain selective flush if no PSI support or the size is
	 * too big.
	 * PSI requires page size to be 2 ^ x, and the base address is naturally
	 * aligned to the size
	 */
	mask = ilog2(__roundup_pow_of_two(pages));
	/* Fallback to domain selective flush if size is too big */
	if (mask > cap_max_amask_val(iommu->cap))
		return iommu->flush.flush_iotlb(iommu, did, 0, 0,
	if (!cap_pgsel_inv(iommu->cap) || mask > cap_max_amask_val(iommu->cap))
		iommu->flush.flush_iotlb(iommu, did, 0, 0,
						DMA_TLB_DSI_FLUSH);

	return iommu->flush.flush_iotlb(iommu, did, addr, mask,
	else
		iommu->flush.flush_iotlb(iommu, did, addr, mask,
						DMA_TLB_PSI_FLUSH);
}

@@ -2260,16 +2255,17 @@ static void flush_unmaps(void)
		if (!iommu)
			continue;

		if (deferred_flush[i].next) {
		if (!deferred_flush[i].next)
			continue;

		iommu->flush.flush_iotlb(iommu, 0, 0, 0,
						 DMA_TLB_GLOBAL_FLUSH);
					 DMA_TLB_GLOBAL_FLUSH, 0);
		for (j = 0; j < deferred_flush[i].next; j++) {
			__free_iova(&deferred_flush[i].domain[j]->iovad,
					deferred_flush[i].iova[j]);
		}
		deferred_flush[i].next = 0;
	}
	}

	list_size = 0;
}