pub use super::asm::{dcache_line_size_from_ctr, flush_icache_all, icache_line_size_from_ctr};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum DataCacheOperation {
Clean,
Invalidate,
CleanInvalidate,
}
pub unsafe fn maintain_dcache_to_poc(
operation: DataCacheOperation,
range: crate::cache::CacheRange,
) {
if range.is_empty() {
return;
}
range.for_each_line(dcache_line_size_from_ctr(), |line| {
unsafe {
match operation {
DataCacheOperation::Clean => core::arch::asm!("dc cvac, {}", in(reg) line),
DataCacheOperation::Invalidate => core::arch::asm!("dc ivac, {}", in(reg) line),
DataCacheOperation::CleanInvalidate => {
core::arch::asm!("dc civac, {}", in(reg) line)
}
}
}
});
unsafe { core::arch::asm!("dsb sy; isb", options(nostack)) };
}
pub unsafe fn clean_dcache_range_to_pou(range: crate::cache::CacheRange) {
if range.is_empty() {
return;
}
range.for_each_line(dcache_line_size_from_ctr(), |line| {
unsafe { core::arch::asm!("dc cvau, {}", in(reg) line, options(nostack)) };
});
unsafe { core::arch::asm!("dsb ish", options(nostack)) };
}