aboutsummaryrefslogtreecommitdiff
path: root/lib/sbi/sbi_pmu.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sbi/sbi_pmu.c')
-rw-r--r--lib/sbi/sbi_pmu.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/lib/sbi/sbi_pmu.c b/lib/sbi/sbi_pmu.c
index 818b875..1bb3e49 100644
--- a/lib/sbi/sbi_pmu.c
+++ b/lib/sbi/sbi_pmu.c
@@ -369,6 +369,20 @@ static int pmu_ctr_stop_fw(uint32_t cidx, uint32_t fw_evt_code)
return 0;
}
+static int pmu_reset_hw_mhpmevent(int ctr_idx)
+{
+ if (ctr_idx < 3 || ctr_idx >= SBI_PMU_HW_CTR_MAX)
+ return SBI_EFAIL;
+#if __riscv_xlen == 32
+ csr_write_num(CSR_MHPMEVENT3 + ctr_idx - 3, 0);
+ csr_write_num(CSR_MHPMEVENT3H + ctr_idx - 3, 0);
+#else
+ csr_write_num(CSR_MHPMEVENT3 + ctr_idx - 3, 0);
+#endif
+
+ return 0;
+}
+
int sbi_pmu_ctr_stop(unsigned long cbase, unsigned long cmask,
unsigned long flag)
{
@@ -392,8 +406,10 @@ int sbi_pmu_ctr_stop(unsigned long cbase, unsigned long cmask,
else
ret = pmu_ctr_stop_hw(cbase);
- if (!ret && (flag & SBI_PMU_STOP_FLAG_RESET))
+ if (flag & SBI_PMU_STOP_FLAG_RESET) {
active_events[hartid][cbase] = SBI_PMU_EVENT_IDX_INVALID;
+ pmu_reset_hw_mhpmevent(cbase);
+ }
}
return ret;