lib: sbi: Delegate PMU counter overflow interrupt to S mode
authorAtish Patra <atish.patra@wdc.com>
Mon, 8 Nov 2021 18:52:59 +0000 (10:52 -0800)
committerAnup Patel <anup@brainfault.org>
Thu, 11 Nov 2021 12:15:12 +0000 (17:45 +0530)
OpenSBI doesn't handle PMU counters for now.

Delegate the overflow counter to S-mode always.

Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Anup Patel <anup.patel@wdc.com>
Signed-off-by: Atish Patra <atish.patra@wdc.com>
include/sbi/riscv_encoding.h
lib/sbi/sbi_hart.c

index 14caa95..ca63435 100644 (file)
@@ -86,6 +86,7 @@
 #define IRQ_VS_EXT                     10
 #define IRQ_M_EXT                      11
 #define IRQ_S_GEXT                     12
+#define IRQ_PMU_OVF                    13
 
 #define MIP_SSIP                       (_UL(1) << IRQ_S_SOFT)
 #define MIP_VSSIP                      (_UL(1) << IRQ_VS_SOFT)
@@ -97,6 +98,7 @@
 #define MIP_VSEIP                      (_UL(1) << IRQ_VS_EXT)
 #define MIP_MEIP                       (_UL(1) << IRQ_M_EXT)
 #define MIP_SGEIP                      (_UL(1) << IRQ_S_GEXT)
+#define MIP_LCOFIP                     (_UL(1) << IRQ_PMU_OVF)
 
 #define SIP_SSIP                       MIP_SSIP
 #define SIP_STIP                       MIP_STIP
index 7f31bb7..8a98d4d 100644 (file)
@@ -115,6 +115,9 @@ static int delegate_traps(struct sbi_scratch *scratch)
 
        /* Send M-mode interrupts and most exceptions to S-mode */
        interrupts = MIP_SSIP | MIP_STIP | MIP_SEIP;
+       if (sbi_hart_has_feature(scratch, SBI_HART_HAS_SSCOFPMF))
+               interrupts |= MIP_LCOFIP;
+
        exceptions = (1U << CAUSE_MISALIGNED_FETCH) | (1U << CAUSE_BREAKPOINT) |
                     (1U << CAUSE_USER_ECALL);
        if (sbi_platform_has_mfaults_delegation(plat))