forked from M-Labs/artiq
46 lines
1.2 KiB
Rust
46 lines
1.2 KiB
Rust
use core::ptr;
|
|
use spr::{self, mfspr, mtspr};
|
|
use csr;
|
|
use mem;
|
|
|
|
pub fn flush_cpu_icache() {
|
|
unsafe {
|
|
let iccfgr = mfspr(spr::SPR_ICCFGR);
|
|
let ways = 1 << (iccfgr & spr::SPR_ICCFGR_NCW);
|
|
let set_size = 1 << ((iccfgr & spr::SPR_ICCFGR_NCS) >> 3);
|
|
let block_size = if iccfgr & spr::SPR_ICCFGR_CBS != 0 { 32 } else { 16 };
|
|
let size = set_size * ways * block_size;
|
|
|
|
let mut i = 0;
|
|
while i < size {
|
|
mtspr(spr::SPR_ICBIR, i);
|
|
i += block_size;
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn flush_cpu_dcache() {
|
|
unsafe {
|
|
let dccfgr = mfspr(spr::SPR_DCCFGR);
|
|
let ways = 1 << (dccfgr & spr::SPR_ICCFGR_NCW);
|
|
let set_size = 1 << ((dccfgr & spr::SPR_DCCFGR_NCS) >> 3);
|
|
let block_size = if dccfgr & spr::SPR_DCCFGR_CBS != 0 { 32 } else { 16 };
|
|
let size = set_size * ways * block_size;
|
|
|
|
let mut i = 0;
|
|
while i < size {
|
|
mtspr(spr::SPR_DCBIR, i);
|
|
i += block_size;
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn flush_l2_cache() {
|
|
unsafe {
|
|
for i in 0..2 * (csr::CONFIG_L2_SIZE as usize) / 4 {
|
|
let addr = mem::MAIN_RAM_BASE + i * 4;
|
|
ptr::read_volatile(addr as *const usize);
|
|
}
|
|
}
|
|
}
|