[PATCH] lib: sbi_pmu: Fix multiple FW counter start operations with custom PMU device

Anup Patel anup at brainfault.org
Fri Feb 20 04:01:56 PST 2026


On Fri, Jan 16, 2026 at 10:23 PM James Raphael Tiovalen
<jamestiotio at gmail.com> wrote:
>
> Currently, we immediately return the result of `fw_counter_start` if the
> event code is 0xFFFF. However, this skips setting the bit in the
> `fw_counters_started` bitmap even if the platform-specific call
> succeeds. Restore the original behavior of returning early only on an
> error so that we still set the bit in the bitmap. This prevents multiple
> starts of the same FW counter. This also aligns the expectations of
> `pmu_ctr_start_fw` with `pmu_ctr_stop_fw` since we cannot assume that
> the platform-specific functions to start and stop FW counters will
> modify the bitmap state.
>
> Fixes: 57d3aa3b0dbd ("lib: sbi_pmu: Introduce fw_counter_write_value API")
> Signed-off-by: James Raphael Tiovalen <jamestiotio at gmail.com>

LGTM.

Reviewed-by: Anup Patel <anup at brainfault.org>

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

> ---
>  lib/sbi/sbi_pmu.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/lib/sbi/sbi_pmu.c b/lib/sbi/sbi_pmu.c
> index e084005d..75038f91 100644
> --- a/lib/sbi/sbi_pmu.c
> +++ b/lib/sbi/sbi_pmu.c
> @@ -448,6 +448,8 @@ static int pmu_ctr_start_fw(struct sbi_pmu_hart_state *phs,
>                             uint64_t event_data, uint64_t ival,
>                             bool ival_update)
>  {
> +       int ret;
> +
>         if ((event_code >= SBI_PMU_FW_MAX &&
>             event_code <= SBI_PMU_FW_RESERVED_MAX) ||
>             event_code > SBI_PMU_FW_PLATFORM)
> @@ -468,9 +470,11 @@ static int pmu_ctr_start_fw(struct sbi_pmu_hart_state *phs,
>                                                         cidx - num_hw_ctrs,
>                                                         ival);
>
> -               return pmu_dev->fw_counter_start(phs->hartid,
> +               ret = pmu_dev->fw_counter_start(phs->hartid,
>                                                  cidx - num_hw_ctrs,
>                                                  event_data);
> +               if (ret)
> +                       return ret;
>         } else {
>                 if (ival_update)
>                         phs->fw_counters_data[cidx - num_hw_ctrs] = ival;
> --
> 2.43.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list