]>
git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/blob - include/linux/dma-direct.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _LINUX_DMA_DIRECT_H
3 #define _LINUX_DMA_DIRECT_H 1
5 #include <linux/dma-mapping.h>
6 #include <linux/mem_encrypt.h>
8 #define DIRECT_MAPPING_ERROR (~(dma_addr_t)0)
10 #ifdef CONFIG_ARCH_HAS_PHYS_TO_DMA
11 #include <asm/dma-direct.h>
13 static inline dma_addr_t
__phys_to_dma(struct device
*dev
, phys_addr_t paddr
)
15 dma_addr_t dev_addr
= (dma_addr_t
)paddr
;
17 return dev_addr
- ((dma_addr_t
)dev
->dma_pfn_offset
<< PAGE_SHIFT
);
20 static inline phys_addr_t
__dma_to_phys(struct device
*dev
, dma_addr_t dev_addr
)
22 phys_addr_t paddr
= (phys_addr_t
)dev_addr
;
24 return paddr
+ ((phys_addr_t
)dev
->dma_pfn_offset
<< PAGE_SHIFT
);
27 static inline bool dma_capable(struct device
*dev
, dma_addr_t addr
, size_t size
)
32 return addr
+ size
- 1 <=
33 min_not_zero(*dev
->dma_mask
, dev
->bus_dma_mask
);
35 #endif /* !CONFIG_ARCH_HAS_PHYS_TO_DMA */
38 * If memory encryption is supported, phys_to_dma will set the memory encryption
39 * bit in the DMA address, and dma_to_phys will clear it. The raw __phys_to_dma
40 * and __dma_to_phys versions should only be used on non-encrypted memory for
41 * special occasions like DMA coherent buffers.
43 static inline dma_addr_t
phys_to_dma(struct device
*dev
, phys_addr_t paddr
)
45 return __sme_set(__phys_to_dma(dev
, paddr
));
48 static inline phys_addr_t
dma_to_phys(struct device
*dev
, dma_addr_t daddr
)
50 return __sme_clr(__dma_to_phys(dev
, daddr
));
53 #ifdef CONFIG_ARCH_HAS_DMA_MARK_CLEAN
54 void dma_mark_clean(void *addr
, size_t size
);
56 static inline void dma_mark_clean(void *addr
, size_t size
)
59 #endif /* CONFIG_ARCH_HAS_DMA_MARK_CLEAN */
61 u64
dma_direct_get_required_mask(struct device
*dev
);
62 void *dma_direct_alloc(struct device
*dev
, size_t size
, dma_addr_t
*dma_handle
,
63 gfp_t gfp
, unsigned long attrs
);
64 void dma_direct_free(struct device
*dev
, size_t size
, void *cpu_addr
,
65 dma_addr_t dma_addr
, unsigned long attrs
);
66 void *dma_direct_alloc_pages(struct device
*dev
, size_t size
,
67 dma_addr_t
*dma_handle
, gfp_t gfp
, unsigned long attrs
);
68 void dma_direct_free_pages(struct device
*dev
, size_t size
, void *cpu_addr
,
69 dma_addr_t dma_addr
, unsigned long attrs
);
70 dma_addr_t
dma_direct_map_page(struct device
*dev
, struct page
*page
,
71 unsigned long offset
, size_t size
, enum dma_data_direction dir
,
73 int dma_direct_map_sg(struct device
*dev
, struct scatterlist
*sgl
, int nents
,
74 enum dma_data_direction dir
, unsigned long attrs
);
75 int dma_direct_supported(struct device
*dev
, u64 mask
);
76 int dma_direct_mapping_error(struct device
*dev
, dma_addr_t dma_addr
);
77 #endif /* _LINUX_DMA_DIRECT_H */