Skip to content

Commit 656ef2e

Browse files
atishp04avpatel
authored andcommitted
drivers/perf: riscv: Add raw event v2 support
SBI v3.0 introduced a new raw event type that allows wider mhpmeventX width to be programmed via CFG_MATCH. Use the raw event v2 if SBI v3.0 is available. Reviewed-by: Anup Patel <anup@brainfault.org> Signed-off-by: Atish Patra <atishp@rivosinc.com> Acked-by: Paul Walmsley <pjw@kernel.org> Link: https://lore.kernel.org/r/20250909-pmu_event_info-v6-2-d8f80cacb884@rivosinc.com Signed-off-by: Anup Patel <anup@brainfault.org>
1 parent 8c8d0f0 commit 656ef2e

2 files changed

Lines changed: 15 additions & 5 deletions

File tree

arch/riscv/include/asm/sbi.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,10 @@ struct riscv_pmu_snapshot_data {
161161

162162
#define RISCV_PMU_RAW_EVENT_MASK GENMASK_ULL(47, 0)
163163
#define RISCV_PMU_PLAT_FW_EVENT_MASK GENMASK_ULL(61, 0)
164+
/* SBI v3.0 allows extended hpmeventX width value */
165+
#define RISCV_PMU_RAW_EVENT_V2_MASK GENMASK_ULL(55, 0)
164166
#define RISCV_PMU_RAW_EVENT_IDX 0x20000
167+
#define RISCV_PMU_RAW_EVENT_V2_IDX 0x30000
165168
#define RISCV_PLAT_FW_EVENT 0xFFFF
166169

167170
/** General pmu event codes specified in SBI PMU extension */
@@ -219,6 +222,7 @@ enum sbi_pmu_event_type {
219222
SBI_PMU_EVENT_TYPE_HW = 0x0,
220223
SBI_PMU_EVENT_TYPE_CACHE = 0x1,
221224
SBI_PMU_EVENT_TYPE_RAW = 0x2,
225+
SBI_PMU_EVENT_TYPE_RAW_V2 = 0x3,
222226
SBI_PMU_EVENT_TYPE_FW = 0xf,
223227
};
224228

drivers/perf/riscv_pmu_sbi.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ asm volatile(ALTERNATIVE( \
5959
#define PERF_EVENT_FLAG_USER_ACCESS BIT(SYSCTL_USER_ACCESS)
6060
#define PERF_EVENT_FLAG_LEGACY BIT(SYSCTL_LEGACY)
6161

62-
PMU_FORMAT_ATTR(event, "config:0-47");
62+
PMU_FORMAT_ATTR(event, "config:0-55");
6363
PMU_FORMAT_ATTR(firmware, "config:62-63");
6464

6565
static bool sbi_v2_available;
@@ -527,8 +527,10 @@ static int pmu_sbi_event_map(struct perf_event *event, u64 *econfig)
527527
break;
528528
case PERF_TYPE_RAW:
529529
/*
530-
* As per SBI specification, the upper 16 bits must be unused
531-
* for a hardware raw event.
530+
* As per SBI v0.3 specification,
531+
* -- the upper 16 bits must be unused for a hardware raw event.
532+
* As per SBI v2.0 specification,
533+
* -- the upper 8 bits must be unused for a hardware raw event.
532534
* Bits 63:62 are used to distinguish between raw events
533535
* 00 - Hardware raw event
534536
* 10 - SBI firmware events
@@ -537,8 +539,12 @@ static int pmu_sbi_event_map(struct perf_event *event, u64 *econfig)
537539

538540
switch (config >> 62) {
539541
case 0:
540-
/* Return error any bits [48-63] is set as it is not allowed by the spec */
541-
if (!(config & ~RISCV_PMU_RAW_EVENT_MASK)) {
542+
if (sbi_v3_available) {
543+
if (!(config & ~RISCV_PMU_RAW_EVENT_V2_MASK)) {
544+
*econfig = config & RISCV_PMU_RAW_EVENT_V2_MASK;
545+
ret = RISCV_PMU_RAW_EVENT_V2_IDX;
546+
}
547+
} else if (!(config & ~RISCV_PMU_RAW_EVENT_MASK)) {
542548
*econfig = config & RISCV_PMU_RAW_EVENT_MASK;
543549
ret = RISCV_PMU_RAW_EVENT_IDX;
544550
}

0 commit comments

Comments
 (0)