lib: sbi_pmu: Honor CLEAR_VALUE/AUTO_START for all hardware event types
PATCH 1/1 lib: sbi_pmu: Honor CLEAR_VALUE/AUTO_START for all hardware event types
sbi_pmu_ctr_cfg_match() only acts on SBI_PMU_CFG_FLAG_CLEAR_VALUE and SBI_PMU_CFG_FLAG_AUTO_START when the event type is SBI_PMU_EVENT_TYPE_HW. However, pmu_ctr_find_hw() allocates a hardware counter from the same hw_event_map for SBI_PMU_EVENT_TYPE_HW_CACHE, SBI_PMU_EVENT_TYPE_HW_RAW, and SBI_PMU_EVENT_TYPE_HW_RAW_V2 as well, and the start/clear helpers (pmu_ctr_start_hw, pmu_ctr_write_hw) operate on the counter index alone and are agnostic to the event type. As a result, when a supervisor configures a HW_CACHE/HW_RAW/HW_RAW_V2 event with these flags, the counter is programmed and recorded in active_events[] but is never cleared or started, requiring an extra SBI call to make it count.
Extend the check to cover all hardware-counter event types so that the configuration flags take effect for HW_CACHE and raw events too.
Deliberately avoiding using "not FW" logic to be explicit about HW-backed events only.
--- lib/sbi/sbi_pmu.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
lib/sbi/sbi_pmu.c +4 -1
@@ -946,7 +946,10 @@ int sbi_pmu_ctr_cfg_match(unsigned long cidx_base, unsigned long cidx_mask, phs->active_events[ctr_idx] = event_idx; skip_match: -if (event_type ==SBI_PMU_EVENT_TYPE_HW ) { +if (event_type ==SBI_PMU_EVENT_TYPE_HW || + event_type ==SBI_PMU_EVENT_TYPE_HW_CACHE || + event_type ==SBI_PMU_EVENT_TYPE_HW_RAW || + event_type ==SBI_PMU_EVENT_TYPE_HW_RAW_V2 ) {if (flags &SBI_PMU_CFG_FLAG_CLEAR_VALUE )pmu_ctr_write_hw (ctr_idx,0 );if (flags &SBI_PMU_CFG_FLAG_AUTO_START )
Signature · 7 lines
2.43.0 -- opensbi mailing list [email protected] http://lists.infradead.org/mailman/listinfo/opensbi
Quoted 12 lines · David E. Garcia Porras
sbi_pmu_ctr_cfg_match()only acts onSBI_PMU_CFG_FLAG_CLEAR_VALUEandSBI_PMU_CFG_FLAG_AUTO_STARTwhen the event type isSBI_PMU_EVENT_TYPE_HW. However,pmu_ctr_find_hw()allocates a hardware counter from the samehw_event_mapforSBI_PMU_EVENT_TYPE_HW_CACHE,SBI_PMU_EVENT_TYPE_HW_RAW, andSBI_PMU_EVENT_TYPE_HW_RAW_V2as well, and the start/clear helpers (pmu_ctr_start_hw,pmu_ctr_write_hw) operate on the counter index alone and are agnostic to the event type. As a result, when a supervisor configures a HW_CACHE/HW_RAW/HW_RAW_V2 event with these flags, the counter is programmed and recorded in active_events[] but is never cleared or started, requiring an extra SBI call to make it count.
Quoted 7 lines
Extend the check to cover all hardware-counter event types so that the configuration flags take effect for
HW_CACHEand raw events too.Deliberately avoiding using "not FW" logic to be explicit about HW-backed events only.
Fixes 13d40f21 ("lib: sbi: Add PMU support")Signed-off-by David E. Garcia Porras <[email protected]>
LGTM.
Applied this patch to the riscv/opensbi repo.
Thanks,
Anup
Quoted 28 lines
--- lib/sbi/sbi_pmu.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)lib/sbi/sbi_pmu.c +4
-2@@ -946,7 +946,10 @@ int sbi_pmu_ctr_cfg_match(unsigned long cidx_base, unsigned long cidx_mask, phs->active_events[ctr_idx] = event_idx; skip_match: -if (event_type ==SBI_PMU_EVENT_TYPE_HW ) { +if (event_type ==SBI_PMU_EVENT_TYPE_HW || + event_type ==SBI_PMU_EVENT_TYPE_HW_CACHE || + event_type ==SBI_PMU_EVENT_TYPE_HW_RAW || + event_type ==SBI_PMU_EVENT_TYPE_HW_RAW_V2 ) {if (flags &SBI_PMU_CFG_FLAG_CLEAR_VALUE )pmu_ctr_write_hw (ctr_idx,0 );if (flags &SBI_PMU_CFG_FLAG_AUTO_START ) --2.43.0
--
opensbi mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/opensbi
Signature · 3 lines
opensbi mailing list [email protected] http://lists.infradead.org/mailman/listinfo/opensbi