forked from Mirrors/opensbi
lib: sbi: Fix counter index calculation for SBI_PMU_CFG_FLAG_SKIP_MATCH
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>
This commit is contained in:

committed by
Anup Patel

parent
bdb3c42bca
commit
674e0199b2
@@ -736,10 +736,15 @@ int sbi_pmu_ctr_cfg_match(unsigned long cidx_base, unsigned long cidx_mask,
|
|||||||
/* The caller wants to skip the match because it already knows the
|
/* The caller wants to skip the match because it already knows the
|
||||||
* counter idx for the given event. Verify that the counter idx
|
* counter idx for the given event. Verify that the counter idx
|
||||||
* is still valid.
|
* 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;
|
return SBI_EINVAL;
|
||||||
ctr_idx = cidx_base;
|
ctr_idx = cidx_first;
|
||||||
goto skip_match;
|
goto skip_match;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user