1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21648993fSJoerg Roedel #ifndef __LINUX_SWIOTLB_H 31648993fSJoerg Roedel #define __LINUX_SWIOTLB_H 41648993fSJoerg Roedel 538674442SThierry Reding #include <linux/dma-direction.h> 638674442SThierry Reding #include <linux/init.h> 71648993fSJoerg Roedel #include <linux/types.h> 8f51778dbSStephen Rothwell #include <linux/limits.h> 91648993fSJoerg Roedel 101648993fSJoerg Roedel struct device; 1138674442SThierry Reding struct page; 121648993fSJoerg Roedel struct scatterlist; 131648993fSJoerg Roedel 14ae7871beSGeert Uytterhoeven enum swiotlb_force { 15ae7871beSGeert Uytterhoeven SWIOTLB_NORMAL, /* Default - depending on HW DMA mask etc. */ 16ae7871beSGeert Uytterhoeven SWIOTLB_FORCE, /* swiotlb=force */ 17fff5d992SGeert Uytterhoeven SWIOTLB_NO_FORCE, /* swiotlb=noforce */ 18ae7871beSGeert Uytterhoeven }; 19ae7871beSGeert Uytterhoeven 200016fdeeSIan Campbell /* 210016fdeeSIan Campbell * Maximum allowable number of contiguous slabs to map, 220016fdeeSIan Campbell * must be a power of 2. What is the appropriate value ? 230016fdeeSIan Campbell * The complexity of {map,unmap}_single is linearly dependent on this value. 240016fdeeSIan Campbell */ 250016fdeeSIan Campbell #define IO_TLB_SEGSIZE 128 260016fdeeSIan Campbell 270016fdeeSIan Campbell /* 280016fdeeSIan Campbell * log of the size of each IO TLB slab. The number of slabs is command line 290016fdeeSIan Campbell * controllable. 300016fdeeSIan Campbell */ 310016fdeeSIan Campbell #define IO_TLB_SHIFT 11 32*b5d7ccb7SChristoph Hellwig #define IO_TLB_SIZE (1 << IO_TLB_SHIFT) 330016fdeeSIan Campbell 34e998879dSAshish Kalra /* default to 64MB */ 35e998879dSAshish Kalra #define IO_TLB_DEFAULT_SIZE (64UL<<20) 36e998879dSAshish Kalra 37ad32e8cbSFUJITA Tomonori extern void swiotlb_init(int verbose); 38ac2cbab2SYinghai Lu int swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose); 39f21ffe9fSKonrad Rzeszutek Wilk extern unsigned long swiotlb_nr_tbl(void); 40c729de8fSYinghai Lu unsigned long swiotlb_size_or_default(void); 4174838b75SKonrad Rzeszutek Wilk extern int swiotlb_late_init_with_tbl(char *tlb, unsigned long nslabs); 4261b82bbfSAndy Shevchenko extern int swiotlb_late_init_with_default_size(size_t default_size); 43c7753208STom Lendacky extern void __init swiotlb_update_mem_attributes(void); 441648993fSJoerg Roedel 45d7ef1533SKonrad Rzeszutek Wilk /* 46d7ef1533SKonrad Rzeszutek Wilk * Enumeration for sync targets 47d7ef1533SKonrad Rzeszutek Wilk */ 48d7ef1533SKonrad Rzeszutek Wilk enum dma_sync_target { 49d7ef1533SKonrad Rzeszutek Wilk SYNC_FOR_CPU = 0, 50d7ef1533SKonrad Rzeszutek Wilk SYNC_FOR_DEVICE = 1, 51d7ef1533SKonrad Rzeszutek Wilk }; 52e05ed4d1SAlexander Duyck 53fc0021aaSChristoph Hellwig phys_addr_t swiotlb_tbl_map_single(struct device *hwdev, phys_addr_t phys, 54fc0021aaSChristoph Hellwig size_t mapping_size, size_t alloc_size, 55fc0021aaSChristoph Hellwig enum dma_data_direction dir, unsigned long attrs); 56d7ef1533SKonrad Rzeszutek Wilk 5761ca08c3SAlexander Duyck extern void swiotlb_tbl_unmap_single(struct device *hwdev, 5861ca08c3SAlexander Duyck phys_addr_t tlb_addr, 593fc1ca00SLu Baolu size_t mapping_size, 603fc1ca00SLu Baolu size_t alloc_size, 613fc1ca00SLu Baolu enum dma_data_direction dir, 620443fa00SAlexander Duyck unsigned long attrs); 63d7ef1533SKonrad Rzeszutek Wilk 64fbfda893SAlexander Duyck extern void swiotlb_tbl_sync_single(struct device *hwdev, 65fbfda893SAlexander Duyck phys_addr_t tlb_addr, 66d7ef1533SKonrad Rzeszutek Wilk size_t size, enum dma_data_direction dir, 67d7ef1533SKonrad Rzeszutek Wilk enum dma_sync_target target); 68d7ef1533SKonrad Rzeszutek Wilk 694a47cbaeSChristoph Hellwig dma_addr_t swiotlb_map(struct device *dev, phys_addr_t phys, 704a47cbaeSChristoph Hellwig size_t size, enum dma_data_direction dir, unsigned long attrs); 714a47cbaeSChristoph Hellwig 725740afdbSFUJITA Tomonori #ifdef CONFIG_SWIOTLB 7355897af6SChristoph Hellwig extern enum swiotlb_force swiotlb_force; 7455897af6SChristoph Hellwig extern phys_addr_t io_tlb_start, io_tlb_end; 7555897af6SChristoph Hellwig 7655897af6SChristoph Hellwig static inline bool is_swiotlb_buffer(phys_addr_t paddr) 7755897af6SChristoph Hellwig { 7855897af6SChristoph Hellwig return paddr >= io_tlb_start && paddr < io_tlb_end; 7955897af6SChristoph Hellwig } 8055897af6SChristoph Hellwig 8155897af6SChristoph Hellwig void __init swiotlb_exit(void); 827453c549SKonrad Rzeszutek Wilk unsigned int swiotlb_max_segment(void); 83abe420bfSJoerg Roedel size_t swiotlb_max_mapping_size(struct device *dev); 84492366f7SJoerg Roedel bool is_swiotlb_active(void); 85e998879dSAshish Kalra void __init swiotlb_adjust_size(unsigned long new_size); 865740afdbSFUJITA Tomonori #else 8755897af6SChristoph Hellwig #define swiotlb_force SWIOTLB_NO_FORCE 8855897af6SChristoph Hellwig static inline bool is_swiotlb_buffer(phys_addr_t paddr) 8955897af6SChristoph Hellwig { 9055897af6SChristoph Hellwig return false; 9155897af6SChristoph Hellwig } 9255897af6SChristoph Hellwig static inline void swiotlb_exit(void) 9355897af6SChristoph Hellwig { 9455897af6SChristoph Hellwig } 9555897af6SChristoph Hellwig static inline unsigned int swiotlb_max_segment(void) 9655897af6SChristoph Hellwig { 9755897af6SChristoph Hellwig return 0; 9855897af6SChristoph Hellwig } 99abe420bfSJoerg Roedel static inline size_t swiotlb_max_mapping_size(struct device *dev) 100abe420bfSJoerg Roedel { 101abe420bfSJoerg Roedel return SIZE_MAX; 102abe420bfSJoerg Roedel } 103492366f7SJoerg Roedel 104492366f7SJoerg Roedel static inline bool is_swiotlb_active(void) 105492366f7SJoerg Roedel { 106492366f7SJoerg Roedel return false; 107492366f7SJoerg Roedel } 108e998879dSAshish Kalra 109e998879dSAshish Kalra static inline void swiotlb_adjust_size(unsigned long new_size) 110e998879dSAshish Kalra { 111e998879dSAshish Kalra } 11255897af6SChristoph Hellwig #endif /* CONFIG_SWIOTLB */ 1135740afdbSFUJITA Tomonori 114ad32e8cbSFUJITA Tomonori extern void swiotlb_print_info(void); 1157453c549SKonrad Rzeszutek Wilk extern void swiotlb_set_max_segment(unsigned int); 1169c5a3621SAkinobu Mita 1171648993fSJoerg Roedel #endif /* __LINUX_SWIOTLB_H */ 118