1#ifndef __IO_PGTABLE_H 2#define __IO_PGTABLE_H 3 4/* 5 * Public API for use by IOMMU drivers 6 */ 7enum io_pgtable_fmt { 8 ARM_32_LPAE_S1, 9 ARM_32_LPAE_S2, 10 ARM_64_LPAE_S1, 11 ARM_64_LPAE_S2, 12 IO_PGTABLE_NUM_FMTS, 13}; 14 15/** 16 * struct iommu_gather_ops - IOMMU callbacks for TLB and page table management. 17 * 18 * @tlb_flush_all: Synchronously invalidate the entire TLB context. 19 * @tlb_add_flush: Queue up a TLB invalidation for a virtual address range. 20 * @tlb_sync: Ensure any queue TLB invalidation has taken effect. 21 * @flush_pgtable: Ensure page table updates are visible to the IOMMU. 22 * 23 * Note that these can all be called in atomic context and must therefore 24 * not block. 25 */ 26struct iommu_gather_ops { 27 void (*tlb_flush_all)(void *cookie); 28 void (*tlb_add_flush)(unsigned long iova, size_t size, bool leaf, 29 void *cookie); 30 void (*tlb_sync)(void *cookie); 31 void (*flush_pgtable)(void *ptr, size_t size, void *cookie); 32}; 33 34/** 35 * struct io_pgtable_cfg - Configuration data for a set of page tables. 36 * 37 * @quirks: A bitmap of hardware quirks that require some special 38 * action by the low-level page table allocator. 39 * @pgsize_bitmap: A bitmap of page sizes supported by this set of page 40 * tables. 41 * @ias: Input address (iova) size, in bits. 42 * @oas: Output address (paddr) size, in bits. 43 * @tlb: TLB management callbacks for this set of tables. 44 */ 45struct io_pgtable_cfg { 46 #define IO_PGTABLE_QUIRK_ARM_NS (1 << 0) /* Set NS bit in PTEs */ 47 int quirks; 48 unsigned long pgsize_bitmap; 49 unsigned int ias; 50 unsigned int oas; 51 const struct iommu_gather_ops *tlb; 52 53 /* Low-level data specific to the table format */ 54 union { 55 struct { 56 u64 ttbr[2]; 57 u64 tcr; 58 u64 mair[2]; 59 } arm_lpae_s1_cfg; 60 61 struct { 62 u64 vttbr; 63 u64 vtcr; 64 } arm_lpae_s2_cfg; 65 }; 66}; 67 68/** 69 * struct io_pgtable_ops - Page table manipulation API for IOMMU drivers. 70 * 71 * @map: Map a physically contiguous memory region. 72 * @unmap: Unmap a physically contiguous memory region. 73 * @iova_to_phys: Translate iova to physical address. 74 * 75 * These functions map directly onto the iommu_ops member functions with 76 * the same names. 77 */ 78struct io_pgtable_ops { 79 int (*map)(struct io_pgtable_ops *ops, unsigned long iova, 80 phys_addr_t paddr, size_t size, int prot); 81 int (*unmap)(struct io_pgtable_ops *ops, unsigned long iova, 82 size_t size); 83 phys_addr_t (*iova_to_phys)(struct io_pgtable_ops *ops, 84 unsigned long iova); 85}; 86 87/** 88 * alloc_io_pgtable_ops() - Allocate a page table allocator for use by an IOMMU. 89 * 90 * @fmt: The page table format. 91 * @cfg: The page table configuration. This will be modified to represent 92 * the configuration actually provided by the allocator (e.g. the 93 * pgsize_bitmap may be restricted). 94 * @cookie: An opaque token provided by the IOMMU driver and passed back to 95 * the callback routines in cfg->tlb. 96 */ 97struct io_pgtable_ops *alloc_io_pgtable_ops(enum io_pgtable_fmt fmt, 98 struct io_pgtable_cfg *cfg, 99 void *cookie); 100 101/** 102 * free_io_pgtable_ops() - Free an io_pgtable_ops structure. The caller 103 * *must* ensure that the page table is no longer 104 * live, but the TLB can be dirty. 105 * 106 * @ops: The ops returned from alloc_io_pgtable_ops. 107 */ 108void free_io_pgtable_ops(struct io_pgtable_ops *ops); 109 110 111/* 112 * Internal structures for page table allocator implementations. 113 */ 114 115/** 116 * struct io_pgtable - Internal structure describing a set of page tables. 117 * 118 * @fmt: The page table format. 119 * @cookie: An opaque token provided by the IOMMU driver and passed back to 120 * any callback routines. 121 * @cfg: A copy of the page table configuration. 122 * @ops: The page table operations in use for this set of page tables. 123 */ 124struct io_pgtable { 125 enum io_pgtable_fmt fmt; 126 void *cookie; 127 struct io_pgtable_cfg cfg; 128 struct io_pgtable_ops ops; 129}; 130 131/** 132 * struct io_pgtable_init_fns - Alloc/free a set of page tables for a 133 * particular format. 134 * 135 * @alloc: Allocate a set of page tables described by cfg. 136 * @free: Free the page tables associated with iop. 137 */ 138struct io_pgtable_init_fns { 139 struct io_pgtable *(*alloc)(struct io_pgtable_cfg *cfg, void *cookie); 140 void (*free)(struct io_pgtable *iop); 141}; 142 143#endif /* __IO_PGTABLE_H */ 144