Skip to content

Commit fc58db9

Browse files
atishp04palmer-dabbelt
authored andcommitted
drivers/perf: riscv: Fix Platform firmware event data
Platform firmware event data field is allowed to be 62 bits for Linux as uppper most two bits are reserved to indicate SBI fw or platform specific firmware events. However, the event data field is masked as per the hardware raw event mask which is not correct. Fix the platform firmware event data field with proper mask. Fixes: f0c9363 ("perf/riscv-sbi: Add platform specific firmware event handling") Signed-off-by: Atish Patra <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent 40384c8 commit fc58db9

File tree

2 files changed

+6
-7
lines changed

2 files changed

+6
-7
lines changed

arch/riscv/include/asm/sbi.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ struct riscv_pmu_snapshot_data {
159159
};
160160

161161
#define RISCV_PMU_RAW_EVENT_MASK GENMASK_ULL(47, 0)
162+
#define RISCV_PMU_PLAT_FW_EVENT_MASK GENMASK_ULL(61, 0)
162163
#define RISCV_PMU_RAW_EVENT_IDX 0x20000
163164
#define RISCV_PLAT_FW_EVENT 0xFFFF
164165

drivers/perf/riscv_pmu_sbi.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,6 @@ static int pmu_sbi_event_map(struct perf_event *event, u64 *econfig)
507507
{
508508
u32 type = event->attr.type;
509509
u64 config = event->attr.config;
510-
u64 raw_config_val;
511510
int ret;
512511

513512
/*
@@ -528,21 +527,20 @@ static int pmu_sbi_event_map(struct perf_event *event, u64 *econfig)
528527
case PERF_TYPE_RAW:
529528
/*
530529
* As per SBI specification, the upper 16 bits must be unused
531-
* for a raw event.
530+
* for a hardware raw event.
532531
* Bits 63:62 are used to distinguish between raw events
533532
* 00 - Hardware raw event
534533
* 10 - SBI firmware events
535534
* 11 - Risc-V platform specific firmware event
536535
*/
537-
raw_config_val = config & RISCV_PMU_RAW_EVENT_MASK;
536+
538537
switch (config >> 62) {
539538
case 0:
540539
ret = RISCV_PMU_RAW_EVENT_IDX;
541-
*econfig = raw_config_val;
540+
*econfig = config & RISCV_PMU_RAW_EVENT_MASK;
542541
break;
543542
case 2:
544-
ret = (raw_config_val & 0xFFFF) |
545-
(SBI_PMU_EVENT_TYPE_FW << 16);
543+
ret = (config & 0xFFFF) | (SBI_PMU_EVENT_TYPE_FW << 16);
546544
break;
547545
case 3:
548546
/*
@@ -551,7 +549,7 @@ static int pmu_sbi_event_map(struct perf_event *event, u64 *econfig)
551549
* Event data - raw event encoding
552550
*/
553551
ret = SBI_PMU_EVENT_TYPE_FW << 16 | RISCV_PLAT_FW_EVENT;
554-
*econfig = raw_config_val;
552+
*econfig = config & RISCV_PMU_PLAT_FW_EVENT_MASK;
555553
break;
556554
}
557555
break;

0 commit comments

Comments
 (0)