include/linux/dma-direct.h
Source file repositories/reference/linux-study-clean/include/linux/dma-direct.h
File Facts
- System
- Linux kernel
- Corpus path
include/linux/dma-direct.h- Extension
.h- Size
- 4118 bytes
- Lines
- 154
- Domain
- Core OS
- Bucket
- Core Kernel Interface
- Inferred role
- Core OS: implementation source
- Status
- source implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/dma-mapping.hlinux/dma-map-ops.hlinux/memblock.hlinux/mem_encrypt.hlinux/swiotlb.hasm/dma-direct.h
Detected Declarations
struct bus_dma_regionfunction translate_phys_to_dmafunction translate_dma_to_physfunction dma_range_map_minfunction dma_range_map_maxfunction __phys_to_dmafunction phys_to_dma_unencryptedfunction phys_to_dmafunction dma_to_physfunction force_dma_unencryptedfunction dma_capable
Annotated Snippet
struct bus_dma_region {
phys_addr_t cpu_start;
dma_addr_t dma_start;
u64 size;
};
static inline dma_addr_t translate_phys_to_dma(struct device *dev,
phys_addr_t paddr)
{
const struct bus_dma_region *m;
for (m = dev->dma_range_map; m->size; m++) {
u64 offset = paddr - m->cpu_start;
if (paddr >= m->cpu_start && offset < m->size)
return m->dma_start + offset;
}
/* make sure dma_capable fails when no translation is available */
return DMA_MAPPING_ERROR;
}
static inline phys_addr_t translate_dma_to_phys(struct device *dev,
dma_addr_t dma_addr)
{
const struct bus_dma_region *m;
for (m = dev->dma_range_map; m->size; m++) {
u64 offset = dma_addr - m->dma_start;
if (dma_addr >= m->dma_start && offset < m->size)
return m->cpu_start + offset;
}
return (phys_addr_t)-1;
}
static inline dma_addr_t dma_range_map_min(const struct bus_dma_region *map)
{
dma_addr_t ret = (dma_addr_t)U64_MAX;
for (; map->size; map++)
ret = min(ret, map->dma_start);
return ret;
}
static inline dma_addr_t dma_range_map_max(const struct bus_dma_region *map)
{
dma_addr_t ret = 0;
for (; map->size; map++)
ret = max(ret, map->dma_start + map->size - 1);
return ret;
}
#ifdef CONFIG_ARCH_HAS_PHYS_TO_DMA
#include <asm/dma-direct.h>
#ifndef phys_to_dma_unencrypted
#define phys_to_dma_unencrypted phys_to_dma
#endif
#else
static inline dma_addr_t __phys_to_dma(struct device *dev, phys_addr_t paddr)
{
if (dev->dma_range_map)
return translate_phys_to_dma(dev, paddr);
return paddr;
}
static inline dma_addr_t phys_to_dma_unencrypted(struct device *dev,
phys_addr_t paddr)
{
return dma_addr_unencrypted(__phys_to_dma(dev, paddr));
}
/*
* If memory encryption is supported, phys_to_dma will set the memory encryption
* bit in the DMA address, and dma_to_phys will clear it.
* phys_to_dma_unencrypted is for use on special unencrypted memory like swiotlb
* buffers.
*/
static inline dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr)
{
return dma_addr_encrypted(__phys_to_dma(dev, paddr));
}
static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t dma_addr)
{
phys_addr_t paddr;
dma_addr = dma_addr_canonical(dma_addr);
if (dev->dma_range_map)
Annotation
- Immediate include surface: `linux/dma-mapping.h`, `linux/dma-map-ops.h`, `linux/memblock.h`, `linux/mem_encrypt.h`, `linux/swiotlb.h`, `asm/dma-direct.h`.
- Detected declarations: `struct bus_dma_region`, `function translate_phys_to_dma`, `function translate_dma_to_phys`, `function dma_range_map_min`, `function dma_range_map_max`, `function __phys_to_dma`, `function phys_to_dma_unencrypted`, `function phys_to_dma`, `function dma_to_phys`, `function force_dma_unencrypted`.
- Atlas domain: Core OS / Core Kernel Interface.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.