use std::fmt::Debug;
use crate::config::ddr5::EccKind;
use crate::config::ddr5::timing::{Constraint, Ddr5Timing};
pub trait EccPolicy: Debug + Send + Sync {
fn scrub_interval(&self, timing: &Ddr5Timing) -> Option<u64>;
}
#[derive(Debug, Default)]
pub struct NoEcc;
impl EccPolicy for NoEcc {
fn scrub_interval(&self, _timing: &Ddr5Timing) -> Option<u64> {
None
}
}
#[derive(Debug)]
pub struct SideBandEcc {
pub patrol_scrub_ns: Option<u64>,
}
impl EccPolicy for SideBandEcc {
fn scrub_interval(&self, timing: &Ddr5Timing) -> Option<u64> {
self.patrol_scrub_ns.map(|ns| Constraint::ps(ns * 1000).cycles(timing.data_rate_mts).max(1))
}
}
impl EccKind {
#[must_use]
pub fn build(self) -> Box<dyn EccPolicy> {
match self {
Self::None => Box::new(NoEcc),
Self::SecDed { patrol_scrub_ns } | Self::ChipKill { patrol_scrub_ns } => {
Box::new(SideBandEcc { patrol_scrub_ns })
}
}
}
}