zynq::ddr: optimize memtest
This commit is contained in:
parent
91bab76ab6
commit
e248d3d3b1
@ -1,5 +1,5 @@
|
|||||||
use crate::regs::{RegisterR, RegisterW, RegisterRW};
|
use crate::regs::{RegisterR, RegisterW, RegisterRW};
|
||||||
use crate::println;
|
use crate::{print, println};
|
||||||
use super::slcr;
|
use super::slcr;
|
||||||
use super::clocks::CpuClocks;
|
use super::clocks::CpuClocks;
|
||||||
|
|
||||||
@ -178,7 +178,7 @@ impl DdrRam {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: move into trait
|
// TODO: move into trait
|
||||||
pub fn ptr(&mut self) -> *mut u8 {
|
pub fn ptr<T>(&mut self) -> *mut T {
|
||||||
0x0010_0000 as *mut _
|
0x0010_0000 as *mut _
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,28 +195,27 @@ impl DdrRam {
|
|||||||
let slice = unsafe {
|
let slice = unsafe {
|
||||||
core::slice::from_raw_parts_mut(self.ptr(), self.size())
|
core::slice::from_raw_parts_mut(self.ptr(), self.size())
|
||||||
};
|
};
|
||||||
let patterns: &'static [u8] = &[0, 0xff, 0x55, 0xaa, 0];
|
let patterns: &'static [u32] = &[0xffff_ffff, 0x5555_5555, 0xaaaa_aaaa, 0];
|
||||||
let mut expected = None;
|
let mut expected = None;
|
||||||
for (i, pattern) in patterns.iter().enumerate() {
|
for (i, pattern) in patterns.iter().enumerate() {
|
||||||
println!("memtest phase {} (status: {:?})", i, self.status());
|
println!("memtest phase {} (status: {:?})", i, self.status());
|
||||||
|
|
||||||
// shift by 7 bits to be able to multiply with 100 (%)
|
for megabyte in 0..=(slice.len() / (1024 * 1024)) {
|
||||||
let progress_max = (slice.len() >> 7) - 1;
|
let start = megabyte * 1024 * 1024 / 4;
|
||||||
let mut progress = 0;
|
let end = ((megabyte + 1) * 1024 * 1024 / 4).min(slice.len());
|
||||||
for (j, b) in slice.iter_mut().enumerate() {
|
for b in slice[start..end].iter_mut() {
|
||||||
expected.map(|expected| {
|
expected.map(|expected| {
|
||||||
let read: u8 = *b;
|
let read: u32 = *b;
|
||||||
if read != expected {
|
if read != expected {
|
||||||
println!("{:08X}: expected {:02X}, read {:02X}", b as *mut u8 as usize, expected, read);
|
println!("{:08X}: expected {:08X}, read {:08X}", b as *mut _ as usize, expected, read);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
*b = *pattern;
|
*b = *pattern;
|
||||||
let new_progress = 100 * (j >> 7) / progress_max;
|
|
||||||
if new_progress != progress {
|
|
||||||
progress = new_progress;
|
|
||||||
println!("{}%", progress);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
print!("\r{} MB", megabyte);
|
||||||
}
|
}
|
||||||
|
println!(" Ok");
|
||||||
|
|
||||||
expected = Some(*pattern);
|
expected = Some(*pattern);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user