[PATCH v2 1/2] lib: sbi: pmu: Add SSE register/unregister() callbacks
Clément Léger
cleger at rivosinc.com
Mon May 19 01:39:48 PDT 2025
As soon as the SSE event is registered, there is no reason not to
delegate the interrupt. Split the PMU SSE enable/disable()
callbacks by moving MIDELEG setting to register/unregister().
Signed-off-by: Clément Léger <cleger at rivosinc.com>
---
lib/sbi/sbi_pmu.c | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/lib/sbi/sbi_pmu.c b/lib/sbi/sbi_pmu.c
index 5983a784..dee50b9b 100644
--- a/lib/sbi/sbi_pmu.c
+++ b/lib/sbi/sbi_pmu.c
@@ -1097,24 +1097,18 @@ void sbi_pmu_exit(struct sbi_scratch *scratch)
static void pmu_sse_enable(uint32_t event_id)
{
- struct sbi_pmu_hart_state *phs = pmu_thishart_state_ptr();
unsigned long irq_mask = sbi_pmu_irq_mask();
- phs->sse_enabled = true;
- csr_clear(CSR_MIDELEG, irq_mask);
csr_clear(CSR_MIP, irq_mask);
csr_set(CSR_MIE, irq_mask);
}
static void pmu_sse_disable(uint32_t event_id)
{
- struct sbi_pmu_hart_state *phs = pmu_thishart_state_ptr();
unsigned long irq_mask = sbi_pmu_irq_mask();
csr_clear(CSR_MIE, irq_mask);
csr_clear(CSR_MIP, irq_mask);
- csr_set(CSR_MIDELEG, irq_mask);
- phs->sse_enabled = false;
}
static void pmu_sse_complete(uint32_t event_id)
@@ -1122,7 +1116,25 @@ static void pmu_sse_complete(uint32_t event_id)
csr_set(CSR_MIE, sbi_pmu_irq_mask());
}
+static void pmu_sse_register(uint32_t event_id)
+{
+ struct sbi_pmu_hart_state *phs = pmu_thishart_state_ptr();
+
+ phs->sse_enabled = true;
+ csr_clear(CSR_MIDELEG, sbi_pmu_irq_mask());
+}
+
+static void pmu_sse_unregister(uint32_t event_id)
+{
+ struct sbi_pmu_hart_state *phs = pmu_thishart_state_ptr();
+
+ phs->sse_enabled = false;
+ csr_set(CSR_MIDELEG, sbi_pmu_irq_mask());
+}
+
static const struct sbi_sse_cb_ops pmu_sse_cb_ops = {
+ .register_cb = pmu_sse_register,
+ .unregister_cb = pmu_sse_unregister,
.enable_cb = pmu_sse_enable,
.disable_cb = pmu_sse_disable,
.complete_cb = pmu_sse_complete,
--
2.49.0
More information about the opensbi
mailing list