xref: /linux-6.15/include/linux/swiotlb.h (revision b5d7ccb7)
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