11648993fSJoerg Roedel #ifndef __LINUX_SWIOTLB_H 21648993fSJoerg Roedel #define __LINUX_SWIOTLB_H 31648993fSJoerg Roedel 41648993fSJoerg Roedel #include <linux/types.h> 51648993fSJoerg Roedel 61648993fSJoerg Roedel struct device; 71648993fSJoerg Roedel struct dma_attrs; 81648993fSJoerg Roedel struct scatterlist; 91648993fSJoerg Roedel 100016fdeeSIan Campbell /* 110016fdeeSIan Campbell * Maximum allowable number of contiguous slabs to map, 120016fdeeSIan Campbell * must be a power of 2. What is the appropriate value ? 130016fdeeSIan Campbell * The complexity of {map,unmap}_single is linearly dependent on this value. 140016fdeeSIan Campbell */ 150016fdeeSIan Campbell #define IO_TLB_SEGSIZE 128 160016fdeeSIan Campbell 170016fdeeSIan Campbell /* 180016fdeeSIan Campbell * log of the size of each IO TLB slab. The number of slabs is command line 190016fdeeSIan Campbell * controllable. 200016fdeeSIan Campbell */ 210016fdeeSIan Campbell #define IO_TLB_SHIFT 11 220016fdeeSIan Campbell 23*ad32e8cbSFUJITA Tomonori extern void swiotlb_init(int verbose); 241648993fSJoerg Roedel 251648993fSJoerg Roedel extern void 261648993fSJoerg Roedel *swiotlb_alloc_coherent(struct device *hwdev, size_t size, 271648993fSJoerg Roedel dma_addr_t *dma_handle, gfp_t flags); 281648993fSJoerg Roedel 291648993fSJoerg Roedel extern void 301648993fSJoerg Roedel swiotlb_free_coherent(struct device *hwdev, size_t size, 311648993fSJoerg Roedel void *vaddr, dma_addr_t dma_handle); 321648993fSJoerg Roedel 33f98eee8eSFUJITA Tomonori extern dma_addr_t swiotlb_map_page(struct device *dev, struct page *page, 34f98eee8eSFUJITA Tomonori unsigned long offset, size_t size, 35f98eee8eSFUJITA Tomonori enum dma_data_direction dir, 36f98eee8eSFUJITA Tomonori struct dma_attrs *attrs); 37f98eee8eSFUJITA Tomonori extern void swiotlb_unmap_page(struct device *hwdev, dma_addr_t dev_addr, 38f98eee8eSFUJITA Tomonori size_t size, enum dma_data_direction dir, 39f98eee8eSFUJITA Tomonori struct dma_attrs *attrs); 401648993fSJoerg Roedel 411648993fSJoerg Roedel extern int 421648993fSJoerg Roedel swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg, int nents, 431648993fSJoerg Roedel int direction); 441648993fSJoerg Roedel 451648993fSJoerg Roedel extern void 461648993fSJoerg Roedel swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents, 471648993fSJoerg Roedel int direction); 481648993fSJoerg Roedel 491648993fSJoerg Roedel extern int 501648993fSJoerg Roedel swiotlb_map_sg_attrs(struct device *hwdev, struct scatterlist *sgl, int nelems, 51160c1d8eSFUJITA Tomonori enum dma_data_direction dir, struct dma_attrs *attrs); 521648993fSJoerg Roedel 531648993fSJoerg Roedel extern void 541648993fSJoerg Roedel swiotlb_unmap_sg_attrs(struct device *hwdev, struct scatterlist *sgl, 55160c1d8eSFUJITA Tomonori int nelems, enum dma_data_direction dir, 56160c1d8eSFUJITA Tomonori struct dma_attrs *attrs); 571648993fSJoerg Roedel 581648993fSJoerg Roedel extern void 591648993fSJoerg Roedel swiotlb_sync_single_for_cpu(struct device *hwdev, dma_addr_t dev_addr, 60160c1d8eSFUJITA Tomonori size_t size, enum dma_data_direction dir); 611648993fSJoerg Roedel 621648993fSJoerg Roedel extern void 631648993fSJoerg Roedel swiotlb_sync_sg_for_cpu(struct device *hwdev, struct scatterlist *sg, 64160c1d8eSFUJITA Tomonori int nelems, enum dma_data_direction dir); 651648993fSJoerg Roedel 661648993fSJoerg Roedel extern void 671648993fSJoerg Roedel swiotlb_sync_single_for_device(struct device *hwdev, dma_addr_t dev_addr, 68160c1d8eSFUJITA Tomonori size_t size, enum dma_data_direction dir); 691648993fSJoerg Roedel 701648993fSJoerg Roedel extern void 711648993fSJoerg Roedel swiotlb_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg, 72160c1d8eSFUJITA Tomonori int nelems, enum dma_data_direction dir); 731648993fSJoerg Roedel 741648993fSJoerg Roedel extern void 751648993fSJoerg Roedel swiotlb_sync_single_range_for_cpu(struct device *hwdev, dma_addr_t dev_addr, 76160c1d8eSFUJITA Tomonori unsigned long offset, size_t size, 77160c1d8eSFUJITA Tomonori enum dma_data_direction dir); 781648993fSJoerg Roedel 791648993fSJoerg Roedel extern void 801648993fSJoerg Roedel swiotlb_sync_single_range_for_device(struct device *hwdev, dma_addr_t dev_addr, 811648993fSJoerg Roedel unsigned long offset, size_t size, 82160c1d8eSFUJITA Tomonori enum dma_data_direction dir); 831648993fSJoerg Roedel 841648993fSJoerg Roedel extern int 851648993fSJoerg Roedel swiotlb_dma_mapping_error(struct device *hwdev, dma_addr_t dma_addr); 861648993fSJoerg Roedel 871648993fSJoerg Roedel extern int 881648993fSJoerg Roedel swiotlb_dma_supported(struct device *hwdev, u64 mask); 891648993fSJoerg Roedel 905740afdbSFUJITA Tomonori #ifdef CONFIG_SWIOTLB 915740afdbSFUJITA Tomonori extern void __init swiotlb_free(void); 925740afdbSFUJITA Tomonori #else 935740afdbSFUJITA Tomonori static inline void swiotlb_free(void) { } 945740afdbSFUJITA Tomonori #endif 955740afdbSFUJITA Tomonori 96*ad32e8cbSFUJITA Tomonori extern void swiotlb_print_info(void); 971648993fSJoerg Roedel #endif /* __LINUX_SWIOTLB_H */ 98