cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dma-map-ops.h (13036B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * This header is for implementations of dma_map_ops and related code.
      4 * It should not be included in drivers just using the DMA API.
      5 */
      6#ifndef _LINUX_DMA_MAP_OPS_H
      7#define _LINUX_DMA_MAP_OPS_H
      8
      9#include <linux/dma-mapping.h>
     10#include <linux/pgtable.h>
     11
     12struct cma;
     13
     14struct dma_map_ops {
     15	void *(*alloc)(struct device *dev, size_t size,
     16			dma_addr_t *dma_handle, gfp_t gfp,
     17			unsigned long attrs);
     18	void (*free)(struct device *dev, size_t size, void *vaddr,
     19			dma_addr_t dma_handle, unsigned long attrs);
     20	struct page *(*alloc_pages)(struct device *dev, size_t size,
     21			dma_addr_t *dma_handle, enum dma_data_direction dir,
     22			gfp_t gfp);
     23	void (*free_pages)(struct device *dev, size_t size, struct page *vaddr,
     24			dma_addr_t dma_handle, enum dma_data_direction dir);
     25	struct sg_table *(*alloc_noncontiguous)(struct device *dev, size_t size,
     26			enum dma_data_direction dir, gfp_t gfp,
     27			unsigned long attrs);
     28	void (*free_noncontiguous)(struct device *dev, size_t size,
     29			struct sg_table *sgt, enum dma_data_direction dir);
     30	int (*mmap)(struct device *, struct vm_area_struct *,
     31			void *, dma_addr_t, size_t, unsigned long attrs);
     32
     33	int (*get_sgtable)(struct device *dev, struct sg_table *sgt,
     34			void *cpu_addr, dma_addr_t dma_addr, size_t size,
     35			unsigned long attrs);
     36
     37	dma_addr_t (*map_page)(struct device *dev, struct page *page,
     38			unsigned long offset, size_t size,
     39			enum dma_data_direction dir, unsigned long attrs);
     40	void (*unmap_page)(struct device *dev, dma_addr_t dma_handle,
     41			size_t size, enum dma_data_direction dir,
     42			unsigned long attrs);
     43	/*
     44	 * map_sg should return a negative error code on error. See
     45	 * dma_map_sgtable() for a list of appropriate error codes
     46	 * and their meanings.
     47	 */
     48	int (*map_sg)(struct device *dev, struct scatterlist *sg, int nents,
     49			enum dma_data_direction dir, unsigned long attrs);
     50	void (*unmap_sg)(struct device *dev, struct scatterlist *sg, int nents,
     51			enum dma_data_direction dir, unsigned long attrs);
     52	dma_addr_t (*map_resource)(struct device *dev, phys_addr_t phys_addr,
     53			size_t size, enum dma_data_direction dir,
     54			unsigned long attrs);
     55	void (*unmap_resource)(struct device *dev, dma_addr_t dma_handle,
     56			size_t size, enum dma_data_direction dir,
     57			unsigned long attrs);
     58	void (*sync_single_for_cpu)(struct device *dev, dma_addr_t dma_handle,
     59			size_t size, enum dma_data_direction dir);
     60	void (*sync_single_for_device)(struct device *dev,
     61			dma_addr_t dma_handle, size_t size,
     62			enum dma_data_direction dir);
     63	void (*sync_sg_for_cpu)(struct device *dev, struct scatterlist *sg,
     64			int nents, enum dma_data_direction dir);
     65	void (*sync_sg_for_device)(struct device *dev, struct scatterlist *sg,
     66			int nents, enum dma_data_direction dir);
     67	void (*cache_sync)(struct device *dev, void *vaddr, size_t size,
     68			enum dma_data_direction direction);
     69	int (*dma_supported)(struct device *dev, u64 mask);
     70	u64 (*get_required_mask)(struct device *dev);
     71	size_t (*max_mapping_size)(struct device *dev);
     72	unsigned long (*get_merge_boundary)(struct device *dev);
     73};
     74
     75#ifdef CONFIG_DMA_OPS
     76#include <asm/dma-mapping.h>
     77
     78static inline const struct dma_map_ops *get_dma_ops(struct device *dev)
     79{
     80	if (dev->dma_ops)
     81		return dev->dma_ops;
     82	return get_arch_dma_ops(dev->bus);
     83}
     84
     85static inline void set_dma_ops(struct device *dev,
     86			       const struct dma_map_ops *dma_ops)
     87{
     88	dev->dma_ops = dma_ops;
     89}
     90#else /* CONFIG_DMA_OPS */
     91static inline const struct dma_map_ops *get_dma_ops(struct device *dev)
     92{
     93	return NULL;
     94}
     95static inline void set_dma_ops(struct device *dev,
     96			       const struct dma_map_ops *dma_ops)
     97{
     98}
     99#endif /* CONFIG_DMA_OPS */
    100
    101#ifdef CONFIG_DMA_CMA
    102extern struct cma *dma_contiguous_default_area;
    103
    104static inline struct cma *dev_get_cma_area(struct device *dev)
    105{
    106	if (dev && dev->cma_area)
    107		return dev->cma_area;
    108	return dma_contiguous_default_area;
    109}
    110
    111void dma_contiguous_reserve(phys_addr_t addr_limit);
    112int __init dma_contiguous_reserve_area(phys_addr_t size, phys_addr_t base,
    113		phys_addr_t limit, struct cma **res_cma, bool fixed);
    114
    115struct page *dma_alloc_from_contiguous(struct device *dev, size_t count,
    116				       unsigned int order, bool no_warn);
    117bool dma_release_from_contiguous(struct device *dev, struct page *pages,
    118				 int count);
    119struct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp);
    120void dma_free_contiguous(struct device *dev, struct page *page, size_t size);
    121
    122void dma_contiguous_early_fixup(phys_addr_t base, unsigned long size);
    123#else /* CONFIG_DMA_CMA */
    124static inline struct cma *dev_get_cma_area(struct device *dev)
    125{
    126	return NULL;
    127}
    128static inline void dma_contiguous_reserve(phys_addr_t limit)
    129{
    130}
    131static inline int dma_contiguous_reserve_area(phys_addr_t size,
    132		phys_addr_t base, phys_addr_t limit, struct cma **res_cma,
    133		bool fixed)
    134{
    135	return -ENOSYS;
    136}
    137static inline struct page *dma_alloc_from_contiguous(struct device *dev,
    138		size_t count, unsigned int order, bool no_warn)
    139{
    140	return NULL;
    141}
    142static inline bool dma_release_from_contiguous(struct device *dev,
    143		struct page *pages, int count)
    144{
    145	return false;
    146}
    147/* Use fallback alloc() and free() when CONFIG_DMA_CMA=n */
    148static inline struct page *dma_alloc_contiguous(struct device *dev, size_t size,
    149		gfp_t gfp)
    150{
    151	return NULL;
    152}
    153static inline void dma_free_contiguous(struct device *dev, struct page *page,
    154		size_t size)
    155{
    156	__free_pages(page, get_order(size));
    157}
    158#endif /* CONFIG_DMA_CMA*/
    159
    160#ifdef CONFIG_DMA_PERNUMA_CMA
    161void dma_pernuma_cma_reserve(void);
    162#else
    163static inline void dma_pernuma_cma_reserve(void) { }
    164#endif /* CONFIG_DMA_PERNUMA_CMA */
    165
    166#ifdef CONFIG_DMA_DECLARE_COHERENT
    167int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
    168		dma_addr_t device_addr, size_t size);
    169int dma_alloc_from_dev_coherent(struct device *dev, ssize_t size,
    170		dma_addr_t *dma_handle, void **ret);
    171int dma_release_from_dev_coherent(struct device *dev, int order, void *vaddr);
    172int dma_mmap_from_dev_coherent(struct device *dev, struct vm_area_struct *vma,
    173		void *cpu_addr, size_t size, int *ret);
    174#else
    175static inline int dma_declare_coherent_memory(struct device *dev,
    176		phys_addr_t phys_addr, dma_addr_t device_addr, size_t size)
    177{
    178	return -ENOSYS;
    179}
    180#define dma_alloc_from_dev_coherent(dev, size, handle, ret) (0)
    181#define dma_release_from_dev_coherent(dev, order, vaddr) (0)
    182#define dma_mmap_from_dev_coherent(dev, vma, vaddr, order, ret) (0)
    183#endif /* CONFIG_DMA_DECLARE_COHERENT */
    184
    185#ifdef CONFIG_DMA_GLOBAL_POOL
    186void *dma_alloc_from_global_coherent(struct device *dev, ssize_t size,
    187		dma_addr_t *dma_handle);
    188int dma_release_from_global_coherent(int order, void *vaddr);
    189int dma_mmap_from_global_coherent(struct vm_area_struct *vma, void *cpu_addr,
    190		size_t size, int *ret);
    191int dma_init_global_coherent(phys_addr_t phys_addr, size_t size);
    192#else
    193static inline void *dma_alloc_from_global_coherent(struct device *dev,
    194		ssize_t size, dma_addr_t *dma_handle)
    195{
    196	return NULL;
    197}
    198static inline int dma_release_from_global_coherent(int order, void *vaddr)
    199{
    200	return 0;
    201}
    202static inline int dma_mmap_from_global_coherent(struct vm_area_struct *vma,
    203		void *cpu_addr, size_t size, int *ret)
    204{
    205	return 0;
    206}
    207#endif /* CONFIG_DMA_GLOBAL_POOL */
    208
    209/*
    210 * This is the actual return value from the ->alloc_noncontiguous method.
    211 * The users of the DMA API should only care about the sg_table, but to make
    212 * the DMA-API internal vmaping and freeing easier we stash away the page
    213 * array as well (except for the fallback case).  This can go away any time,
    214 * e.g. when a vmap-variant that takes a scatterlist comes along.
    215 */
    216struct dma_sgt_handle {
    217	struct sg_table sgt;
    218	struct page **pages;
    219};
    220#define sgt_handle(sgt) \
    221	container_of((sgt), struct dma_sgt_handle, sgt)
    222
    223int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt,
    224		void *cpu_addr, dma_addr_t dma_addr, size_t size,
    225		unsigned long attrs);
    226int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
    227		void *cpu_addr, dma_addr_t dma_addr, size_t size,
    228		unsigned long attrs);
    229struct page *dma_common_alloc_pages(struct device *dev, size_t size,
    230		dma_addr_t *dma_handle, enum dma_data_direction dir, gfp_t gfp);
    231void dma_common_free_pages(struct device *dev, size_t size, struct page *vaddr,
    232		dma_addr_t dma_handle, enum dma_data_direction dir);
    233
    234struct page **dma_common_find_pages(void *cpu_addr);
    235void *dma_common_contiguous_remap(struct page *page, size_t size, pgprot_t prot,
    236		const void *caller);
    237void *dma_common_pages_remap(struct page **pages, size_t size, pgprot_t prot,
    238		const void *caller);
    239void dma_common_free_remap(void *cpu_addr, size_t size);
    240
    241struct page *dma_alloc_from_pool(struct device *dev, size_t size,
    242		void **cpu_addr, gfp_t flags,
    243		bool (*phys_addr_ok)(struct device *, phys_addr_t, size_t));
    244bool dma_free_from_pool(struct device *dev, void *start, size_t size);
    245
    246int dma_direct_set_offset(struct device *dev, phys_addr_t cpu_start,
    247		dma_addr_t dma_start, u64 size);
    248
    249#if defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE) || \
    250	defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU) || \
    251	defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL)
    252extern bool dma_default_coherent;
    253static inline bool dev_is_dma_coherent(struct device *dev)
    254{
    255	return dev->dma_coherent;
    256}
    257#else
    258static inline bool dev_is_dma_coherent(struct device *dev)
    259{
    260	return true;
    261}
    262#endif /* CONFIG_ARCH_HAS_DMA_COHERENCE_H */
    263
    264void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
    265		gfp_t gfp, unsigned long attrs);
    266void arch_dma_free(struct device *dev, size_t size, void *cpu_addr,
    267		dma_addr_t dma_addr, unsigned long attrs);
    268
    269#ifdef CONFIG_MMU
    270/*
    271 * Page protection so that devices that can't snoop CPU caches can use the
    272 * memory coherently.  We default to pgprot_noncached which is usually used
    273 * for ioremap as a safe bet, but architectures can override this with less
    274 * strict semantics if possible.
    275 */
    276#ifndef pgprot_dmacoherent
    277#define pgprot_dmacoherent(prot)	pgprot_noncached(prot)
    278#endif
    279
    280pgprot_t dma_pgprot(struct device *dev, pgprot_t prot, unsigned long attrs);
    281#else
    282static inline pgprot_t dma_pgprot(struct device *dev, pgprot_t prot,
    283		unsigned long attrs)
    284{
    285	return prot;	/* no protection bits supported without page tables */
    286}
    287#endif /* CONFIG_MMU */
    288
    289#ifdef CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE
    290void arch_sync_dma_for_device(phys_addr_t paddr, size_t size,
    291		enum dma_data_direction dir);
    292#else
    293static inline void arch_sync_dma_for_device(phys_addr_t paddr, size_t size,
    294		enum dma_data_direction dir)
    295{
    296}
    297#endif /* ARCH_HAS_SYNC_DMA_FOR_DEVICE */
    298
    299#ifdef CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU
    300void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
    301		enum dma_data_direction dir);
    302#else
    303static inline void arch_sync_dma_for_cpu(phys_addr_t paddr, size_t size,
    304		enum dma_data_direction dir)
    305{
    306}
    307#endif /* ARCH_HAS_SYNC_DMA_FOR_CPU */
    308
    309#ifdef CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL
    310void arch_sync_dma_for_cpu_all(void);
    311#else
    312static inline void arch_sync_dma_for_cpu_all(void)
    313{
    314}
    315#endif /* CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL */
    316
    317#ifdef CONFIG_ARCH_HAS_DMA_PREP_COHERENT
    318void arch_dma_prep_coherent(struct page *page, size_t size);
    319#else
    320static inline void arch_dma_prep_coherent(struct page *page, size_t size)
    321{
    322}
    323#endif /* CONFIG_ARCH_HAS_DMA_PREP_COHERENT */
    324
    325#ifdef CONFIG_ARCH_HAS_DMA_MARK_CLEAN
    326void arch_dma_mark_clean(phys_addr_t paddr, size_t size);
    327#else
    328static inline void arch_dma_mark_clean(phys_addr_t paddr, size_t size)
    329{
    330}
    331#endif /* ARCH_HAS_DMA_MARK_CLEAN */
    332
    333void *arch_dma_set_uncached(void *addr, size_t size);
    334void arch_dma_clear_uncached(void *addr, size_t size);
    335
    336#ifdef CONFIG_ARCH_HAS_DMA_MAP_DIRECT
    337bool arch_dma_map_page_direct(struct device *dev, phys_addr_t addr);
    338bool arch_dma_unmap_page_direct(struct device *dev, dma_addr_t dma_handle);
    339bool arch_dma_map_sg_direct(struct device *dev, struct scatterlist *sg,
    340		int nents);
    341bool arch_dma_unmap_sg_direct(struct device *dev, struct scatterlist *sg,
    342		int nents);
    343#else
    344#define arch_dma_map_page_direct(d, a)		(false)
    345#define arch_dma_unmap_page_direct(d, a)	(false)
    346#define arch_dma_map_sg_direct(d, s, n)		(false)
    347#define arch_dma_unmap_sg_direct(d, s, n)	(false)
    348#endif
    349
    350#ifdef CONFIG_ARCH_HAS_SETUP_DMA_OPS
    351void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
    352		const struct iommu_ops *iommu, bool coherent);
    353#else
    354static inline void arch_setup_dma_ops(struct device *dev, u64 dma_base,
    355		u64 size, const struct iommu_ops *iommu, bool coherent)
    356{
    357}
    358#endif /* CONFIG_ARCH_HAS_SETUP_DMA_OPS */
    359
    360#ifdef CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS
    361void arch_teardown_dma_ops(struct device *dev);
    362#else
    363static inline void arch_teardown_dma_ops(struct device *dev)
    364{
    365}
    366#endif /* CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS */
    367
    368#ifdef CONFIG_DMA_API_DEBUG
    369void dma_debug_add_bus(struct bus_type *bus);
    370void debug_dma_dump_mappings(struct device *dev);
    371#else
    372static inline void dma_debug_add_bus(struct bus_type *bus)
    373{
    374}
    375static inline void debug_dma_dump_mappings(struct device *dev)
    376{
    377}
    378#endif /* CONFIG_DMA_API_DEBUG */
    379
    380extern const struct dma_map_ops dma_dummy_ops;
    381
    382#endif /* _LINUX_DMA_MAP_OPS_H */