libs/kaptan-dma: add DMA transmit contracts
This commit is contained in:
1 parent
6d9cadfa8f
commit
1712f1284a
2 files changed
+83
No files matched your search
@@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "kaptan-dma"
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
repository.workspace = true
|
||||
rust-version.workspace = true
|
||||
version.workspace = true
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
@@ -0,0 +1,73 @@
|
||||
//! DMA memory ownership and non-blocking transfer contracts.
|
||||
//!
|
||||
//! Board/HAL code proves the memory region, cache policy, and peripheral route.
|
||||
//! Runtime code sees only prepared immutable TX ranges and terminal outcomes.
|
||||
|
||||
#![no_std]
|
||||
|
||||
/// A borrowed byte range prepared for a device-to-read DMA transfer.
|
||||
///
|
||||
/// This is a capability rather than a general byte-slice wrapper. It exists
|
||||
/// only after a board-selected policy proves DMA reachability and CPU-to-device
|
||||
/// visibility for the selected controller.
|
||||
pub struct DmaReadableBuffer<'a> {
|
||||
bytes: &'a [u8],
|
||||
}
|
||||
|
||||
impl<'a> DmaReadableBuffer<'a> {
|
||||
/// Creates a DMA-read capability after platform-specific validation.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// - `bytes` is reachable by the selected DMA engine.
|
||||
/// - CPU writes to `bytes` are visible before transfer begins.
|
||||
/// - `bytes` remains addressable, immovable, and immutable until a terminal
|
||||
/// completion or a documented route-halt outcome releases ownership.
|
||||
pub const unsafe fn new_unchecked(bytes: &'a [u8]) -> Self {
|
||||
Self { bytes }
|
||||
}
|
||||
|
||||
/// Returns the DMA-visible byte range.
|
||||
pub const fn bytes(&self) -> &'a [u8] {
|
||||
self.bytes
|
||||
}
|
||||
}
|
||||
|
||||
/// Prepares CPU-owned bytes for a DMA transmit handoff.
|
||||
///
|
||||
/// A cache-disabled board validates the RAM range. A cached board must clean
|
||||
/// the exact range and issue the required ordering barrier before returning.
|
||||
pub trait DmaTxBufferFactory {
|
||||
/// Platform-specific preparation failure.
|
||||
type Error;
|
||||
|
||||
/// Validates and prepares a frame for device DMA reads.
|
||||
fn prepare<'a>(&mut self, bytes: &'a [u8]) -> Result<DmaReadableBuffer<'a>, Self::Error>;
|
||||
}
|
||||
|
||||
/// Terminal result reported by a DMA transmit interrupt handler.
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
pub enum TxCompletion {
|
||||
/// The selected engine has no terminal event pending.
|
||||
NotPending,
|
||||
/// DMA reached the peripheral data-register endpoint.
|
||||
///
|
||||
/// This does not prove that the final UART stop bit left the wire.
|
||||
Complete,
|
||||
/// The engine reported a terminal transfer fault.
|
||||
TransferFault,
|
||||
/// The route entered a halted state and requires explicit reinitialization.
|
||||
Halted,
|
||||
}
|
||||
|
||||
/// Owns one non-blocking DMA-backed transmit route.
|
||||
///
|
||||
/// The caller retains the prepared range until a terminal completion or fault.
|
||||
/// Implementations must not poll for a hardware state transition from this API.
|
||||
pub trait DmaTxEngine {
|
||||
/// Start-operation failure.
|
||||
type StartError;
|
||||
|
||||
/// Starts one DMA transfer from a prepared readable buffer.
|
||||
fn start(&mut self, buffer: DmaReadableBuffer<'_>) -> Result<(), Self::StartError>;
|
||||
}
|
||||
Reference in new issue
Block a user