swiotlb.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __LINUX_SWIOTLB_H
  3. #define __LINUX_SWIOTLB_H
  4. #include <linux/dma-direction.h>
  5. #include <linux/init.h>
  6. #include <linux/types.h>
  7. #include <linux/limits.h>
  8. struct device;
  9. struct page;
  10. struct scatterlist;
  11. enum swiotlb_force {
  12. SWIOTLB_NORMAL, /* Default - depending on HW DMA mask etc. */
  13. SWIOTLB_FORCE, /* swiotlb=force */
  14. SWIOTLB_NO_FORCE, /* swiotlb=noforce */
  15. };
  16. /*
  17. * Maximum allowable number of contiguous slabs to map,
  18. * must be a power of 2. What is the appropriate value ?
  19. * The complexity of {map,unmap}_single is linearly dependent on this value.
  20. */
  21. #define IO_TLB_SEGSIZE 128
  22. /*
  23. * log of the size of each IO TLB slab. The number of slabs is command line
  24. * controllable.
  25. */
  26. #define IO_TLB_SHIFT 11
  27. extern void swiotlb_init(int verbose);
  28. int swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose);
  29. extern unsigned long swiotlb_nr_tbl(void);
  30. unsigned long swiotlb_size_or_default(void);
  31. extern int swiotlb_late_init_with_tbl(char *tlb, unsigned long nslabs);
  32. extern void __init swiotlb_update_mem_attributes(void);
  33. /*
  34. * Enumeration for sync targets
  35. */
  36. enum dma_sync_target {
  37. SYNC_FOR_CPU = 0,
  38. SYNC_FOR_DEVICE = 1,
  39. };
  40. extern phys_addr_t swiotlb_tbl_map_single(struct device *hwdev,
  41. dma_addr_t tbl_dma_addr,
  42. phys_addr_t phys,
  43. size_t mapping_size,
  44. size_t alloc_size,
  45. enum dma_data_direction dir,
  46. unsigned long attrs);
  47. extern void swiotlb_tbl_unmap_single(struct device *hwdev,
  48. phys_addr_t tlb_addr,
  49. size_t mapping_size,
  50. size_t alloc_size,
  51. enum dma_data_direction dir,
  52. unsigned long attrs);
  53. extern void swiotlb_tbl_sync_single(struct device *hwdev,
  54. phys_addr_t tlb_addr,
  55. size_t size, enum dma_data_direction dir,
  56. enum dma_sync_target target);
  57. #ifdef CONFIG_SWIOTLB
  58. extern enum swiotlb_force swiotlb_force;
  59. extern phys_addr_t io_tlb_start, io_tlb_end;
  60. static inline bool is_swiotlb_buffer(phys_addr_t paddr)
  61. {
  62. return paddr >= io_tlb_start && paddr < io_tlb_end;
  63. }
  64. bool swiotlb_map(struct device *dev, phys_addr_t *phys, dma_addr_t *dma_addr,
  65. size_t size, enum dma_data_direction dir, unsigned long attrs);
  66. void __init swiotlb_exit(void);
  67. unsigned int swiotlb_max_segment(void);
  68. size_t swiotlb_max_mapping_size(struct device *dev);
  69. bool is_swiotlb_active(void);
  70. #else
  71. #define swiotlb_force SWIOTLB_NO_FORCE
  72. static inline bool is_swiotlb_buffer(phys_addr_t paddr)
  73. {
  74. return false;
  75. }
  76. static inline bool swiotlb_map(struct device *dev, phys_addr_t *phys,
  77. dma_addr_t *dma_addr, size_t size, enum dma_data_direction dir,
  78. unsigned long attrs)
  79. {
  80. return false;
  81. }
  82. static inline void swiotlb_exit(void)
  83. {
  84. }
  85. static inline unsigned int swiotlb_max_segment(void)
  86. {
  87. return 0;
  88. }
  89. static inline size_t swiotlb_max_mapping_size(struct device *dev)
  90. {
  91. return SIZE_MAX;
  92. }
  93. static inline bool is_swiotlb_active(void)
  94. {
  95. return false;
  96. }
  97. #endif /* CONFIG_SWIOTLB */
  98. extern void swiotlb_print_info(void);
  99. extern void swiotlb_set_max_segment(unsigned int);
  100. #endif /* __LINUX_SWIOTLB_H */