lib: sbi_pmu: Implement sbi_pmu_counter_fw_read_hi
authorMayuresh Chitale <mchitale@ventanamicro.com>
Thu, 9 Mar 2023 13:13:52 +0000 (18:43 +0530)
committerAnup Patel <anup@brainfault.org>
Fri, 10 Mar 2023 08:30:07 +0000 (14:00 +0530)
To support 64 bit firmware counters on RV32 systems, we implement
sbi_pmu_counter_fw_read_hi() which returns the upper 32 bits of
the firmware counter value. On RV64 (or higher) systems, this
function will always return zero.

Signed-off-by: Mayuresh Chitale <mchitale@ventanamicro.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
include/sbi/sbi_ecall_interface.h
lib/sbi/sbi_ecall_pmu.c

index 4c378c3e7c309c78819d8de6ed816e35d6e9a3a7..d4482129f89f0f3abab02d992459c672ad4f4e0a 100644 (file)
 #define SBI_EXT_PMU_COUNTER_START      0x3
 #define SBI_EXT_PMU_COUNTER_STOP       0x4
 #define SBI_EXT_PMU_COUNTER_FW_READ    0x5
+#define SBI_EXT_PMU_COUNTER_FW_READ_HI 0x6
 
 /** General pmu event codes specified in SBI PMU extension */
 enum sbi_pmu_hw_generic_events_t {
index 826c8a89bf0e0a497ea965bf57e2f9d5fb85bcff..8f91f9cec014ddd53fca1ffd7970d16d96085c3f 100644 (file)
@@ -54,6 +54,14 @@ static int sbi_ecall_pmu_handler(unsigned long extid, unsigned long funcid,
                ret = sbi_pmu_ctr_fw_read(regs->a0, &temp);
                *out_val = temp;
                break;
+       case SBI_EXT_PMU_COUNTER_FW_READ_HI:
+#if __riscv_xlen == 32
+               ret = sbi_pmu_ctr_fw_read(regs->a0, &temp);
+               *out_val = temp >> 32;
+#else
+               *out_val = 0;
+#endif
+               break;
        case SBI_EXT_PMU_COUNTER_START:
 
 #if __riscv_xlen == 32