]>
git.proxmox.com Git - mirror_ubuntu-jammy-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 #ifdef CONFIG_ARCH_HAS_PHYS_TO_DMA
9 #include <asm/dma-direct.h>
11 static inline dma_addr_t
__phys_to_dma(struct device
*dev
, phys_addr_t paddr
)
13 dma_addr_t dev_addr
= (dma_addr_t
)paddr
;
15 return dev_addr
- ((dma_addr_t
)dev
->dma_pfn_offset
<< PAGE_SHIFT
);
18 static inline phys_addr_t
__dma_to_phys(struct device
*dev
, dma_addr_t dev_addr
)
20 phys_addr_t paddr
= (phys_addr_t
)dev_addr
;
22 return paddr
+ ((phys_addr_t
)dev
->dma_pfn_offset
<< PAGE_SHIFT
);
25 static inline bool dma_capable(struct device
*dev
, dma_addr_t addr
, size_t size
)
30 return addr
+ size
- 1 <=
31 min_not_zero(*dev
->dma_mask
, dev
->bus_dma_mask
);
33 #endif /* !CONFIG_ARCH_HAS_PHYS_TO_DMA */
36 * If memory encryption is supported, phys_to_dma will set the memory encryption
37 * bit in the DMA address, and dma_to_phys will clear it. The raw __phys_to_dma
38 * and __dma_to_phys versions should only be used on non-encrypted memory for
39 * special occasions like DMA coherent buffers.
41 static inline dma_addr_t
phys_to_dma(struct device
*dev
, phys_addr_t paddr
)
43 return __sme_set(__phys_to_dma(dev
, paddr
));
46 static inline phys_addr_t
dma_to_phys(struct device
*dev
, dma_addr_t daddr
)
48 return __sme_clr(__dma_to_phys(dev
, daddr
));
51 u64
dma_direct_get_required_mask(struct device
*dev
);
52 void *dma_direct_alloc(struct device
*dev
, size_t size
, dma_addr_t
*dma_handle
,
53 gfp_t gfp
, unsigned long attrs
);
54 void dma_direct_free(struct device
*dev
, size_t size
, void *cpu_addr
,
55 dma_addr_t dma_addr
, unsigned long attrs
);
56 void *dma_direct_alloc_pages(struct device
*dev
, size_t size
,
57 dma_addr_t
*dma_handle
, gfp_t gfp
, unsigned long attrs
);
58 void dma_direct_free_pages(struct device
*dev
, size_t size
, void *cpu_addr
,
59 dma_addr_t dma_addr
, unsigned long attrs
);
60 struct page
*__dma_direct_alloc_pages(struct device
*dev
, size_t size
,
61 dma_addr_t
*dma_handle
, gfp_t gfp
, unsigned long attrs
);
62 void __dma_direct_free_pages(struct device
*dev
, size_t size
, struct page
*page
);
63 int dma_direct_supported(struct device
*dev
, u64 mask
);
64 #endif /* _LINUX_DMA_DIRECT_H */