diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sbi/sbi_hart.c | 4 | ||||
-rw-r--r-- | lib/sbi/sbi_pmu.c | 12 |
2 files changed, 14 insertions, 2 deletions
diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c index 1294868..447f99e 100644 --- a/lib/sbi/sbi_hart.c +++ b/lib/sbi/sbi_hart.c @@ -19,6 +19,7 @@ #include <sbi/sbi_hart.h> #include <sbi/sbi_math.h> #include <sbi/sbi_platform.h> +#include <sbi/sbi_pmu.h> #include <sbi/sbi_string.h> #include <sbi/sbi_trap.h> @@ -208,8 +209,7 @@ 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_extension(scratch, SBI_HART_EXT_SSCOFPMF)) - interrupts |= MIP_LCOFIP; + interrupts |= sbi_pmu_irq_bit(); exceptions = (1U << CAUSE_MISALIGNED_FETCH) | (1U << CAUSE_BREAKPOINT) | (1U << CAUSE_USER_ECALL); diff --git a/lib/sbi/sbi_pmu.c b/lib/sbi/sbi_pmu.c index 214d5e8..91d9ccc 100644 --- a/lib/sbi/sbi_pmu.c +++ b/lib/sbi/sbi_pmu.c @@ -344,6 +344,18 @@ skip_inhibit_update: return 0; } +int sbi_pmu_irq_bit(void) +{ + struct sbi_scratch *scratch = sbi_scratch_thishart_ptr(); + + if (sbi_hart_has_extension(scratch, SBI_HART_EXT_SSCOFPMF)) + return MIP_LCOFIP; + if (pmu_dev && pmu_dev->hw_counter_irq_bit) + return pmu_dev->hw_counter_irq_bit(); + + return 0; +} + static int pmu_ctr_start_fw(uint32_t cidx, uint32_t event_code, uint64_t ival, bool ival_update) { |