pub unsafe trait IxgbeHal: Sized {
    // Required methods
    fn dma_alloc(size: usize) -> (usize, NonNull<u8>);
    unsafe fn dma_dealloc(paddr: usize, vaddr: NonNull<u8>, size: usize) -> i32;
    unsafe fn mmio_phys_to_virt(paddr: usize, size: usize) -> NonNull<u8>;
    unsafe fn mmio_virt_to_phys(vaddr: NonNull<u8>, size: usize) -> usize;
    fn wait_until(duration: Duration) -> Result<(), &'static str>;
}
Expand description

The interface which a particular hardware implementation must implement.

Safety

Implementations of this trait must follow the “implementation safety” requirements documented for each method. Callers must follow the safety requirements documented for the unsafe methods.

Required Methods§

fn dma_alloc(size: usize) -> (usize, NonNull<u8>)

Allocates and zeroes the given number of contiguous physical memory of DMA memory for Ixgbe NIC use.

Returns both the physical address which the device can use to access the memory, and a pointer to the start of it which the driver can use to access it.

Implementation safety

Implementations of this method must ensure that the NonNull<u8> returned is a valid pointer, aligned to 2, and won’t alias any other allocations or references in the program until it is deallocated by dma_dealloc. The pages must be zeroed.

unsafe fn dma_dealloc(paddr: usize, vaddr: NonNull<u8>, size: usize) -> i32

Deallocates the given contiguous physical DMA memory pages.

Safety

The memory must have been allocated by dma_alloc on the same Hal implementation, and not yet deallocated. size must be the same number passed to dma_alloc originally, and both paddr and vaddr must be the values returned by dma_alloc.

unsafe fn mmio_phys_to_virt(paddr: usize, size: usize) -> NonNull<u8>

Converts a physical address used for MMIO to a virtual address which the driver can access.

This is only used for MMIO addresses within BARs read from the device, for the PCI transport. It may check that the address range up to the given size is within the region expected for MMIO.

Implementation safety

Implementations of this method must ensure that the NonNull<u8> returned is a valid pointer, and won’t alias any other allocations or references in the program.

Safety

The paddr and size must describe a valid MMIO region. The implementation may validate it in some way (and panic if it is invalid) but is not guaranteed to.

unsafe fn mmio_virt_to_phys(vaddr: NonNull<u8>, size: usize) -> usize

Converts a virtual address used by the driver to access MMIO to a physical address which the device can use.

Safety

fn wait_until(duration: Duration) -> Result<(), &'static str>

Wait until reaching the given deadline.

Object Safety§

This trait is not object safe.

Implementors§