mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
rust: dma: add dma_handle_with_offset method to CoherentAllocation
Sometimes one may want to obtain a DMA handle starting at a given offset. This can be done by adding said offset to the result of `dma_handle()`, but doing so on the client side carries the risk that the operation will go outside the bounds of the allocation. Thus, add a `dma_handle_with_offset` method that adds the desired offset after checking that it is still valid. Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Link: https://lore.kernel.org/r/20250619-nova-frts-v6-3-ecf41ef99252@nvidia.com Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
committed by
Danilo Krummrich
parent
c0a3065d5d
commit
26af856539
@@ -238,6 +238,20 @@ impl<T: AsBytes + FromBytes> CoherentAllocation<T> {
|
||||
self.dma_handle
|
||||
}
|
||||
|
||||
/// Returns a DMA handle starting at `offset` (in units of `T`) which may be given to the
|
||||
/// device as the DMA address base of the region.
|
||||
///
|
||||
/// Returns `EINVAL` if `offset` is not within the bounds of the allocation.
|
||||
pub fn dma_handle_with_offset(&self, offset: usize) -> Result<bindings::dma_addr_t> {
|
||||
if offset >= self.count {
|
||||
Err(EINVAL)
|
||||
} else {
|
||||
// INVARIANT: The type invariant of `Self` guarantees that `size_of::<T> * count` fits
|
||||
// into a `usize`, and `offset` is inferior to `count`.
|
||||
Ok(self.dma_handle + (offset * core::mem::size_of::<T>()) as bindings::dma_addr_t)
|
||||
}
|
||||
}
|
||||
|
||||
/// Common helper to validate a range applied from the allocated region in the CPU's virtual
|
||||
/// address space.
|
||||
fn validate_range(&self, offset: usize, count: usize) -> Result {
|
||||
|
||||
Reference in New Issue
Block a user