As per the SBI specification, we should "unconditionally select the first
counter from the set of counters specified by the counter_idx_base and
counter_idx_mask", so implement this behaviour.
Suggested-by: Atish Patra <atishp@atishpatra.org>
Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
/* The caller wants to skip the match because it already knows the
* counter idx for the given event. Verify that the counter idx
* is still valid.
+ * As per the specification, we should "unconditionally select
+ * the first counter from the set of counters specified by the
+ * counter_idx_base and counter_idx_mask".
*/
- if (active_events[hartid][cidx_base] == SBI_PMU_EVENT_IDX_INVALID)
+ unsigned long cidx_first = cidx_base + sbi_ffs(cidx_mask);
+
+ if (active_events[hartid][cidx_first] == SBI_PMU_EVENT_IDX_INVALID)
return SBI_EINVAL;
- ctr_idx = cidx_base;
+ ctr_idx = cidx_first;
goto skip_match;
}