diff --git a/include/sbi/sbi_ecall_interface.h b/include/sbi/sbi_ecall_interface.h index 3aa57466..bcb7359f 100644 --- a/include/sbi/sbi_ecall_interface.h +++ b/include/sbi/sbi_ecall_interface.h @@ -245,6 +245,7 @@ enum sbi_pmu_event_type_id { SBI_PMU_EVENT_TYPE_HW = 0x0, SBI_PMU_EVENT_TYPE_HW_CACHE = 0x1, SBI_PMU_EVENT_TYPE_HW_RAW = 0x2, + SBI_PMU_EVENT_TYPE_HW_RAW_V2 = 0x3, SBI_PMU_EVENT_TYPE_FW = 0xf, SBI_PMU_EVENT_TYPE_MAX, }; @@ -261,6 +262,7 @@ enum sbi_pmu_ctr_type { #define SBI_PMU_EVENT_IDX_TYPE_MASK (0xF << SBI_PMU_EVENT_IDX_TYPE_OFFSET) #define SBI_PMU_EVENT_IDX_CODE_MASK 0xFFFF #define SBI_PMU_EVENT_RAW_IDX 0x20000 +#define SBI_PMU_EVENT_RAW_V2_IDX 0x30000 #define SBI_PMU_EVENT_IDX_INVALID 0xFFFFFFFF diff --git a/lib/sbi/sbi_pmu.c b/lib/sbi/sbi_pmu.c index b9e84543..972b85f4 100644 --- a/lib/sbi/sbi_pmu.c +++ b/lib/sbi/sbi_pmu.c @@ -172,6 +172,7 @@ static int pmu_event_validate(struct sbi_pmu_hart_state *phs, return SBI_EINVAL; break; case SBI_PMU_EVENT_TYPE_HW_RAW: + case SBI_PMU_EVENT_TYPE_HW_RAW_V2: event_idx_code_max = 1; // event_idx.code should be zero break; default: @@ -259,7 +260,8 @@ static int pmu_add_hw_event_map(u32 eidx_start, u32 eidx_end, u32 cmap, /* Sanity check */ for (i = 0; i < num_hw_events; i++) { - if (eidx_start == SBI_PMU_EVENT_RAW_IDX) + if (eidx_start == SBI_PMU_EVENT_RAW_IDX || + eidx_start == SBI_PMU_EVENT_RAW_V2_IDX) /* All raw events have same event idx. Just do sanity check on select */ is_overlap = pmu_event_select_overlap(&hw_event_map[i], select, select_mask); @@ -290,8 +292,8 @@ reset_event: */ int sbi_pmu_add_hw_event_counter_map(u32 eidx_start, u32 eidx_end, u32 cmap) { - if ((eidx_start > eidx_end) || eidx_start == SBI_PMU_EVENT_RAW_IDX || - eidx_end == SBI_PMU_EVENT_RAW_IDX) + if ((eidx_start > eidx_end) || eidx_start >= SBI_PMU_EVENT_RAW_V2_IDX || + eidx_end >= SBI_PMU_EVENT_RAW_V2_IDX) return SBI_EINVAL; return pmu_add_hw_event_map(eidx_start, eidx_end, cmap, 0, 0); @@ -300,7 +302,7 @@ int sbi_pmu_add_hw_event_counter_map(u32 eidx_start, u32 eidx_end, u32 cmap) int sbi_pmu_add_raw_event_counter_map(uint64_t select, uint64_t select_mask, u32 cmap) { return pmu_add_hw_event_map(SBI_PMU_EVENT_RAW_IDX, - SBI_PMU_EVENT_RAW_IDX, cmap, select, select_mask); + SBI_PMU_EVENT_RAW_V2_IDX, cmap, select, select_mask); } void sbi_pmu_ovf_irq() @@ -736,7 +738,8 @@ static int pmu_ctr_find_hw(struct sbi_pmu_hart_state *phs, continue; /* For raw events, event data is used as the select value */ - if (event_idx == SBI_PMU_EVENT_RAW_IDX) { + if (event_idx == SBI_PMU_EVENT_RAW_IDX || + event_idx == SBI_PMU_EVENT_RAW_V2_IDX) { uint64_t select_mask = temp->select_mask; /* The non-event map bits of data should match the selector */ diff --git a/platform/generic/platform.c b/platform/generic/platform.c index fb074d4b..fefb08cf 100644 --- a/platform/generic/platform.c +++ b/platform/generic/platform.c @@ -392,7 +392,8 @@ static uint64_t generic_pmu_xlate_to_mhpmevent(uint32_t event_idx, uint64_t evt_val = 0; /* data is valid only for raw events and is equal to event selector */ - if (event_idx == SBI_PMU_EVENT_RAW_IDX) + if (event_idx == SBI_PMU_EVENT_RAW_IDX || + event_idx == SBI_PMU_EVENT_RAW_V2_IDX) evt_val = data; else { /**