Trait driver_net::ixgbe::IxgbeHal
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>)
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
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>
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
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>
fn wait_until(duration: Duration) -> Result<(), &'static str>
Wait until reaching the given deadline.