use core::arch::asm;
use super::{CounterId, Pmu, PmuError, isb};
impl Pmu {
pub fn overflow_status(&self) -> u64 {
read_reg!("PMOVSCLR_EL0") & self.implemented_mask()
}
pub fn clear_overflow(&mut self, mask: u64) {
write_reg!("PMOVSCLR_EL0", mask & self.implemented_mask());
}
pub fn enable_overflow_irq(&mut self, id: CounterId) -> Result<(), PmuError> {
self.validate(id)?;
write_reg!("PMINTENSET_EL1", 1u64 << id.index());
Ok(())
}
pub fn disable_overflow_irq(&mut self, id: CounterId) -> Result<(), PmuError> {
self.validate(id)?;
let mask = 1u64 << id.index();
write_reg!("PMINTENCLR_EL1", mask);
isb();
self.clear_overflow(mask);
isb();
Ok(())
}
}