The counter mapping in DT may be incorrect if all the counters specified
in the mapping are actually not physically present in the hardware.
OpenSBI should only keep a mapping of counters enabled in hardware and
defined in DT. This assume that all the programmable hpmcounters are
consecutive as it doesn't make sense to build a system with sparse
hpmcounters.
Signed-off-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
int i = 0;
bool is_overlap;
struct sbi_pmu_hw_event *event = &hw_event_map[num_hw_events];
+ struct sbi_scratch *scratch = sbi_scratch_thishart_ptr();
+ int hw_ctr_avail = sbi_hart_mhpm_count(scratch);
+ uint32_t ctr_avail_mask = ((uint32_t)(~0) >> (32 - (hw_ctr_avail + 3)));
/* The first two counters are reserved by priv spec */
if (eidx_start > SBI_PMU_HW_INSTRUCTIONS && (cmap & SBI_PMU_FIXED_CTR_MASK))
}
event->select_mask = select_mask;
- event->counters = cmap;
+ /* Map the only the counters that are available in the hardware */
+ event->counters = cmap & ctr_avail_mask;
event->select = select;
num_hw_events++;