diff options
Diffstat (limited to 'include/linux/iova.h')
| -rw-r--r-- | include/linux/iova.h | 41 | 
1 files changed, 37 insertions, 4 deletions
diff --git a/include/linux/iova.h b/include/linux/iova.h index 19e81d5ccb6d..3920a19d8194 100644 --- a/include/linux/iova.h +++ b/include/linux/iova.h @@ -16,9 +16,6 @@  #include <linux/rbtree.h>  #include <linux/dma-mapping.h> -/* IO virtual address start page frame number */ -#define IOVA_START_PFN		(1) -  /* iova structure */  struct iova {  	struct rb_node	node; @@ -31,6 +28,8 @@ struct iova_domain {  	spinlock_t	iova_rbtree_lock; /* Lock to protect update of rbtree */  	struct rb_root	rbroot;		/* iova domain rbtree root */  	struct rb_node	*cached32_node; /* Save last alloced node */ +	unsigned long	granule;	/* pfn granularity for this domain */ +	unsigned long	start_pfn;	/* Lower limit for this domain */  	unsigned long	dma_32bit_pfn;  }; @@ -39,6 +38,39 @@ static inline unsigned long iova_size(struct iova *iova)  	return iova->pfn_hi - iova->pfn_lo + 1;  } +static inline unsigned long iova_shift(struct iova_domain *iovad) +{ +	return __ffs(iovad->granule); +} + +static inline unsigned long iova_mask(struct iova_domain *iovad) +{ +	return iovad->granule - 1; +} + +static inline size_t iova_offset(struct iova_domain *iovad, dma_addr_t iova) +{ +	return iova & iova_mask(iovad); +} + +static inline size_t iova_align(struct iova_domain *iovad, size_t size) +{ +	return ALIGN(size, iovad->granule); +} + +static inline dma_addr_t iova_dma_addr(struct iova_domain *iovad, struct iova *iova) +{ +	return (dma_addr_t)iova->pfn_lo << iova_shift(iovad); +} + +static inline unsigned long iova_pfn(struct iova_domain *iovad, dma_addr_t iova) +{ +	return iova >> iova_shift(iovad); +} + +int iommu_iova_cache_init(void); +void iommu_iova_cache_destroy(void); +  struct iova *alloc_iova_mem(void);  void free_iova_mem(struct iova *iova);  void free_iova(struct iova_domain *iovad, unsigned long pfn); @@ -49,7 +81,8 @@ struct iova *alloc_iova(struct iova_domain *iovad, unsigned long size,  struct iova *reserve_iova(struct iova_domain *iovad, unsigned long pfn_lo,  	unsigned long pfn_hi);  void copy_reserved_iova(struct iova_domain *from, struct iova_domain *to); -void init_iova_domain(struct iova_domain *iovad, unsigned long pfn_32bit); +void init_iova_domain(struct iova_domain *iovad, unsigned long granule, +	unsigned long start_pfn, unsigned long pfn_32bit);  struct iova *find_iova(struct iova_domain *iovad, unsigned long pfn);  void put_iova_domain(struct iova_domain *iovad);  struct iova *split_and_remove_iova(struct iova_domain *iovad,  | 
