Skip to main content

DmaOp

Trait DmaOp 

Source
pub trait DmaOp:
    Sync
    + Send
    + 'static {
    // Required methods
    fn page_size(&self) -> usize;
    unsafe fn map_single(
        &self,
        dma_mask: u64,
        addr: NonNull<u8>,
        size: NonZeroUsize,
        align: usize,
        direction: DmaDirection,
    ) -> Result<DmaMapHandle, DmaError>;
    unsafe fn unmap_single(&self, handle: DmaMapHandle);
    unsafe fn alloc_coherent(
        &self,
        dma_mask: u64,
        layout: Layout,
    ) -> Option<DmaHandle>;
    unsafe fn dealloc_coherent(&self, handle: DmaHandle);

    // Provided methods
    fn flush(&self, addr: NonNull<u8>, size: usize) { ... }
    fn invalidate(&self, addr: NonNull<u8>, size: usize) { ... }
    fn flush_invalidate(&self, addr: NonNull<u8>, size: usize) { ... }
    fn prepare_read(
        &self,
        handle: &DmaMapHandle,
        offset: usize,
        size: usize,
        direction: DmaDirection,
    ) { ... }
    fn confirm_write(
        &self,
        handle: &DmaMapHandle,
        offset: usize,
        size: usize,
        direction: DmaDirection,
    ) { ... }
}

Required Methods§

Source

fn page_size(&self) -> usize

Source

unsafe fn map_single( &self, dma_mask: u64, addr: NonNull<u8>, size: NonZeroUsize, align: usize, direction: DmaDirection, ) -> Result<DmaMapHandle, DmaError>

将虚拟地址映射到 DMA 地址

§Safety

只能是单个连续内存块

Source

unsafe fn unmap_single(&self, handle: DmaMapHandle)

解除 DMA 映射

§Safety

必须与 map_single 配对使用

Source

unsafe fn alloc_coherent( &self, dma_mask: u64, layout: Layout, ) -> Option<DmaHandle>

分配 DMA 可访问内存

§Safety
  • 调用者必须确保 layout 合法
  • 返回的内存必须保证连续
Source

unsafe fn dealloc_coherent(&self, handle: DmaHandle)

释放 DMA 内存

§Safety

调用者必须确保 ptr 和 layout 与 alloc 时匹配

Provided Methods§

Source

fn flush(&self, addr: NonNull<u8>, size: usize)

写回缓存到内存 (clean)

Source

fn invalidate(&self, addr: NonNull<u8>, size: usize)

使缓存无效 (invalidate)

Source

fn flush_invalidate(&self, addr: NonNull<u8>, size: usize)

Source

fn prepare_read( &self, handle: &DmaMapHandle, offset: usize, size: usize, direction: DmaDirection, )

Source

fn confirm_write( &self, handle: &DmaMapHandle, offset: usize, size: usize, direction: DmaDirection, )

Implementors§