Commit 3445545b authored by Will Deacon's avatar Will Deacon
Browse files

iommu/io-pgtable: Introduce tlb_flush_walk() and tlb_flush_leaf()



In preparation for deferring TLB flushes to iommu_tlb_sync(), introduce
two new synchronous invalidation helpers to the io-pgtable API, which
allow the unmap() code to force invalidation in cases where it cannot be
deferred (e.g. when replacing a table with a block or when TLBI_ON_MAP
is set).

Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent 56f8af5e
Loading
Loading
Loading
Loading
+19 −5
Original line number Diff line number Diff line
@@ -20,7 +20,17 @@ enum io_pgtable_fmt {
 * struct iommu_flush_ops - IOMMU callbacks for TLB and page table management.
 *
 * @tlb_flush_all:  Synchronously invalidate the entire TLB context.
 * @tlb_add_flush: Queue up a TLB invalidation for a virtual address range.
 * @tlb_flush_walk: Synchronously invalidate all intermediate TLB state
 *                  (sometimes referred to as the "walk cache") for a virtual
 *                  address range.
 * @tlb_flush_leaf: Synchronously invalidate all leaf TLB state for a virtual
 *                  address range.
 * @tlb_add_flush:  Optional callback to queue up leaf TLB invalidation for a
 *                  virtual address range.  This function exists purely as an
 *                  optimisation for IOMMUs that cannot batch TLB invalidation
 *                  operations efficiently and are therefore better suited to
 *                  issuing them early rather than deferring them until
 *                  iommu_tlb_sync().
 * @tlb_sync:       Ensure any queued TLB invalidation has taken effect, and
 *                  any corresponding page table updates are visible to the
 *                  IOMMU.
@@ -30,6 +40,10 @@ enum io_pgtable_fmt {
 */
struct iommu_flush_ops {
	void (*tlb_flush_all)(void *cookie);
	void (*tlb_flush_walk)(unsigned long iova, size_t size, size_t granule,
			       void *cookie);
	void (*tlb_flush_leaf)(unsigned long iova, size_t size, size_t granule,
			       void *cookie);
	void (*tlb_add_flush)(unsigned long iova, size_t size, size_t granule,
			      bool leaf, void *cookie);
	void (*tlb_sync)(void *cookie);