[PATCH v2 1/2] lib: sbi: pmu: Add SSE register/unregister() callbacks

Atish Kumar Patra atishp at rivosinc.com
Mon May 19 13:25:37 PDT 2025


On Mon, May 19, 2025 at 1:40 AM Clément Léger <cleger at rivosinc.com> wrote:
>
> 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
>

Reviewed-by: Atish Patra <atishp at rivosinc.com>



More information about the opensbi mailing list