Linux Audio

Check our new training course

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