lib: sbi_pmu: Align the event type offset as per SBI specification
authorYu Chien Peter Lin <peterlin@andestech.com>
Thu, 30 Mar 2023 08:41:14 +0000 (16:41 +0800)
committerAnup Patel <anup@brainfault.org>
Fri, 7 Apr 2023 04:36:59 +0000 (10:06 +0530)
The bits encoded in event_idx[19:16] indicate the event type, with
an offset of 16 instead of 20.

Fixes: 13d40f21d588 ("lib: sbi: Add PMU support")
Signed-off-by: Yu Chien Peter Lin <peterlin@andestech.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Xiang W <wxjstz@126.com>
include/sbi/sbi_ecall_interface.h
lib/sbi/sbi_pmu.c

index dee2dd9681c98a7a3f484fe59634d9e713a4f476..1fe469e370787b8644b1bbbbcf84e020e3258595 100644 (file)
@@ -215,10 +215,10 @@ enum sbi_pmu_ctr_type {
 };
 
 /* Helper macros to decode event idx */
-#define SBI_PMU_EVENT_IDX_OFFSET 20
 #define SBI_PMU_EVENT_IDX_MASK 0xFFFFF
+#define SBI_PMU_EVENT_IDX_TYPE_OFFSET 16
+#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_IDX_TYPE_MASK 0xF0000
 #define SBI_PMU_EVENT_RAW_IDX 0x20000
 
 #define SBI_PMU_EVENT_IDX_INVALID 0xFFFFFFFF
index 74d69122efb4fd0a6fdb95d31e892a4edfa3a172..04259aeb24ebae94caba1c03c851bc70c427b77d 100644 (file)
@@ -81,7 +81,8 @@ static uint32_t num_hw_ctrs;
 static uint32_t total_ctrs;
 
 /* Helper macros to retrieve event idx and code type */
-#define get_cidx_type(x) ((x & SBI_PMU_EVENT_IDX_TYPE_MASK) >> 16)
+#define get_cidx_type(x) \
+  (((x) & SBI_PMU_EVENT_IDX_TYPE_MASK) >> SBI_PMU_EVENT_IDX_TYPE_OFFSET)
 #define get_cidx_code(x) (x & SBI_PMU_EVENT_IDX_CODE_MASK)
 
 /**
@@ -903,10 +904,10 @@ int sbi_pmu_init(struct sbi_scratch *scratch, bool cold_boot)
        pmu_reset_event_map(hartid);
 
        /* First three counters are fixed by the priv spec and we enable it by default */
-       active_events[hartid][0] = SBI_PMU_EVENT_TYPE_HW << SBI_PMU_EVENT_IDX_OFFSET |
+       active_events[hartid][0] = SBI_PMU_EVENT_TYPE_HW << SBI_PMU_EVENT_IDX_TYPE_OFFSET |
                                   SBI_PMU_HW_CPU_CYCLES;
        active_events[hartid][1] = SBI_PMU_EVENT_IDX_INVALID;
-       active_events[hartid][2] = SBI_PMU_EVENT_TYPE_HW << SBI_PMU_EVENT_IDX_OFFSET |
+       active_events[hartid][2] = SBI_PMU_EVENT_TYPE_HW << SBI_PMU_EVENT_IDX_TYPE_OFFSET |
                                   SBI_PMU_HW_INSTRUCTIONS;
 
        return 0;