dma: Remove use of Cell<Option<>>
in DMA driver
#1946
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Generally we only like to keep one copy of
AxiDmaReg
in existence, and use Rust's borrowing rules around&mut
to ensure that it is safely accessed. However, this is not generally possible when implementing theMmio
trait, since the method receiver must be immutable.Cell<Option<>>
orRefCell
can provide interior mutability so that we can safely share mutable references from immutable receivers, but it complicates the code and adds bloat to the binary.However, since Caliptra is single-threaded, as long as we are careful about how we structure the code so that we don't ever have two
AxiDmaReg
instances in existence at the same time (which might cause conflicts in programming the underlying registers), then we will have fulfilled the contract with theunsafe
code. This safety is ensured as long as there are no nested callers ofDma::with_dma
.Based on feedback from #1904.