123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- use sbi_spec::binary::SbiRet;
- pub trait Pmu: Send + Sync {
-
-
-
- fn num_counters(&self) -> usize;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- fn counter_get_info(&self, counter_idx: usize) -> SbiRet;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- fn counter_config_matching(
- &self,
- counter_idx_base: usize,
- counter_idx_mask: usize,
- config_flags: usize,
- event_idx: usize,
- event_data: u64,
- ) -> SbiRet;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- fn counter_start(
- &self,
- counter_idx_base: usize,
- counter_idx_mask: usize,
- start_flags: usize,
- initial_value: u64,
- ) -> SbiRet;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- fn counter_stop(
- &self,
- counter_idx_base: usize,
- counter_idx_mask: usize,
- stop_flags: usize,
- ) -> SbiRet;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- fn counter_fw_read(&self, counter_idx: usize) -> SbiRet;
- }
- use crate::util::AmoOnceRef;
- static PMU: AmoOnceRef<dyn Pmu> = AmoOnceRef::new();
- pub fn init_pmu(pmu: &'static dyn Pmu) {
- if !PMU.try_call_once(pmu) {
- panic!("load sbi module when already loaded")
- }
- }
- #[inline]
- pub(crate) fn probe_pmu() -> bool {
- PMU.get().is_some()
- }
- #[inline]
- pub(crate) fn num_counters() -> SbiRet {
- if let Some(obj) = PMU.get() {
-
-
- return SbiRet::success(obj.num_counters());
- }
- SbiRet::not_supported()
- }
- #[inline]
- pub(crate) fn counter_get_info(counter_idx: usize) -> SbiRet {
- if let Some(obj) = PMU.get() {
- return obj.counter_get_info(counter_idx);
- }
- SbiRet::not_supported()
- }
- #[inline]
- pub(crate) fn counter_config_matching(
- counter_idx_base: usize,
- counter_idx_mask: usize,
- config_flags: usize,
- event_idx: usize,
- event_data: u64,
- ) -> SbiRet {
- if let Some(obj) = PMU.get() {
- return obj.counter_config_matching(
- counter_idx_base,
- counter_idx_mask,
- config_flags,
- event_idx,
- event_data,
- );
- }
- SbiRet::not_supported()
- }
- #[inline]
- pub(crate) fn counter_start(
- counter_idx_base: usize,
- counter_idx_mask: usize,
- start_flags: usize,
- initial_value: u64,
- ) -> SbiRet {
- if let Some(obj) = PMU.get() {
- return obj.counter_start(
- counter_idx_base,
- counter_idx_mask,
- start_flags,
- initial_value,
- );
- }
- SbiRet::not_supported()
- }
- #[inline]
- pub(crate) fn counter_stop(
- counter_idx_base: usize,
- counter_idx_mask: usize,
- stop_flags: usize,
- ) -> SbiRet {
- if let Some(obj) = PMU.get() {
- return obj.counter_stop(counter_idx_base, counter_idx_mask, stop_flags);
- }
- SbiRet::not_supported()
- }
- #[inline]
- pub(crate) fn counter_fw_read(counter_idx: usize) -> SbiRet {
- if let Some(obj) = PMU.get() {
- return obj.counter_fw_read(counter_idx);
- }
- SbiRet::not_supported()
- }
|