/* Copyright (c) 2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef __LINUX_IO_PGTABLE_FAST_H #define __LINUX_IO_PGTABLE_FAST_H #include typedef u64 av8l_fast_iopte; #define iopte_pmd_offset(pmds, iova) (pmds + (iova >> 12)) int av8l_fast_map_public(av8l_fast_iopte *ptep, phys_addr_t paddr, size_t size, int prot); void av8l_fast_unmap_public(av8l_fast_iopte *ptep, size_t size); /* events for notifiers passed to av8l_register_notify */ #define MAPPED_OVER_STALE_TLB 1 #define CONFIG_IOMMU_IO_PGTABLE_FAST_PROVE_TLB #ifdef CONFIG_IOMMU_IO_PGTABLE_FAST_PROVE_TLB /* * Doesn't matter what we use as long as bit 0 is unset. The reason why we * need a different value at all is that there are certain hardware * platforms with erratum that require that a PTE actually be zero'd out * and not just have its valid bit unset. */ #define AV8L_FAST_PTE_UNMAPPED_NEED_TLBI 0x0 void av8l_fast_clear_stale_ptes(av8l_fast_iopte *puds, bool skip_sync); void av8l_register_notify(struct notifier_block *nb); #else /* !CONFIG_IOMMU_IO_PGTABLE_FAST_PROVE_TLB */ #define AV8L_FAST_PTE_UNMAPPED_NEED_TLBI 0 static inline void av8l_fast_clear_stale_ptes(av8l_fast_iopte *puds, bool skip_sync) { } static inline void av8l_register_notify(struct notifier_block *nb) { } #endif /* CONFIG_IOMMU_IO_PGTABLE_FAST_PROVE_TLB */ #endif /* __LINUX_IO_PGTABLE_FAST_H */