@@ -34,6 +34,9 @@ int sbi_pmu_init(struct sbi_scratch *scratch, bool cold_boot);
/** Reset PMU during hart exit */
void sbi_pmu_exit(struct sbi_scratch *scratch);
+/** Return the pmu irq bit depending on extension existence */
+int sbi_pmu_irq_bit(void);
+
/**
* Add the hardware event to counter mapping information. This should be called
* from the platform code to update the mapping table.
@@ -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);
@@ -367,6 +367,16 @@ 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;
+
+ return 0;
+}
+
static int pmu_ctr_start_fw(uint32_t cidx, uint32_t fw_evt_code,
uint64_t ival, bool ival_update)
{
Don't spread checking for pmu extensions through the code but instead introduce a sbi-pmu function that other code can call to get the correct information about the existence of the pmu interrupt. Signed-off-by: Heiko Stuebner <heiko@sntech.de> --- include/sbi/sbi_pmu.h | 3 +++ lib/sbi/sbi_hart.c | 4 ++-- lib/sbi/sbi_pmu.c | 10 ++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-)