[v2 1/2] lib: sbi_pmu: Add PMU snapshot definitions
Anup Patel
anup at brainfault.org
Fri Dec 8 09:29:54 PST 2023
On Fri, Dec 8, 2023 at 3:54 AM Atish Patra <atishp at rivosinc.com> wrote:
>
> OpenSBI doesn't support SBI PMU snapshot yet as there is not much benefit
> unless the multiple counters overflow at the same time.
>
> Just add the definition and return not supported error at this moment. The
> default returned error is also not supported. Thus, no functional change
> intended.
>
> Reviewed-by: Anup Patel <anup at brainfault.org>
> Signed-off-by: Atish Patra <atishp at rivosinc.com>
Applied this patch to the riscv/opensbi repo.
Thanks,
Anup
> ---
> include/sbi/sbi_ecall_interface.h | 6 +++++-
> include/sbi/sbi_error.h | 1 +
> lib/sbi/sbi_ecall_pmu.c | 2 ++
> lib/sbi/sbi_pmu.c | 6 ++++++
> 4 files changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/include/sbi/sbi_ecall_interface.h b/include/sbi/sbi_ecall_interface.h
> index 1fe469e37078..d8c646d7b073 100644
> --- a/include/sbi/sbi_ecall_interface.h
> +++ b/include/sbi/sbi_ecall_interface.h
> @@ -103,6 +103,7 @@
> #define SBI_EXT_PMU_COUNTER_STOP 0x4
> #define SBI_EXT_PMU_COUNTER_FW_READ 0x5
> #define SBI_EXT_PMU_COUNTER_FW_READ_HI 0x6
> +#define SBI_EXT_PMU_SNAPSHOT_SET_SHMEM 0x7
>
> /** General pmu event codes specified in SBI PMU extension */
> enum sbi_pmu_hw_generic_events_t {
> @@ -241,9 +242,11 @@ enum sbi_pmu_ctr_type {
>
> /* Flags defined for counter start function */
> #define SBI_PMU_START_FLAG_SET_INIT_VALUE (1 << 0)
> +#define SBI_PMU_START_FLAG_INIT_FROM_SNAPSHOT (1 << 1)
>
> /* Flags defined for counter stop function */
> #define SBI_PMU_STOP_FLAG_RESET (1 << 0)
> +#define SBI_PMU_STOP_FLAG_TAKE_SNAPSHOT (1 << 1)
>
> /* SBI function IDs for DBCN extension */
> #define SBI_EXT_DBCN_CONSOLE_WRITE 0x0
> @@ -309,8 +312,9 @@ enum sbi_cppc_reg_id {
> #define SBI_ERR_ALREADY_AVAILABLE -6
> #define SBI_ERR_ALREADY_STARTED -7
> #define SBI_ERR_ALREADY_STOPPED -8
> +#define SBI_ERR_NO_SHMEM -9
>
> -#define SBI_LAST_ERR SBI_ERR_ALREADY_STOPPED
> +#define SBI_LAST_ERR SBI_ERR_NO_SHMEM
>
> /* clang-format on */
>
> diff --git a/include/sbi/sbi_error.h b/include/sbi/sbi_error.h
> index dd65e14b6fcd..7f97506d8bd5 100644
> --- a/include/sbi/sbi_error.h
> +++ b/include/sbi/sbi_error.h
> @@ -23,6 +23,7 @@
> #define SBI_EALREADY SBI_ERR_ALREADY_AVAILABLE
> #define SBI_EALREADY_STARTED SBI_ERR_ALREADY_STARTED
> #define SBI_EALREADY_STOPPED SBI_ERR_ALREADY_STOPPED
> +#define SBI_ENO_SHMEM SBI_ERR_NO_SHMEM
>
> #define SBI_ENODEV -1000
> #define SBI_ENOSYS -1001
> diff --git a/lib/sbi/sbi_ecall_pmu.c b/lib/sbi/sbi_ecall_pmu.c
> index 1d5d512eeed7..c58591106d09 100644
> --- a/lib/sbi/sbi_ecall_pmu.c
> +++ b/lib/sbi/sbi_ecall_pmu.c
> @@ -74,6 +74,8 @@ static int sbi_ecall_pmu_handler(unsigned long extid, unsigned long funcid,
> case SBI_EXT_PMU_COUNTER_STOP:
> ret = sbi_pmu_ctr_stop(regs->a0, regs->a1, regs->a2);
> break;
> + case SBI_EXT_PMU_SNAPSHOT_SET_SHMEM:
> + /* fallthrough as OpenSBI doesn't support snapshot yet */
> default:
> ret = SBI_ENOTSUPP;
> }
> diff --git a/lib/sbi/sbi_pmu.c b/lib/sbi/sbi_pmu.c
> index 185068bb1f43..1ac8562a9c99 100644
> --- a/lib/sbi/sbi_pmu.c
> +++ b/lib/sbi/sbi_pmu.c
> @@ -442,6 +442,9 @@ int sbi_pmu_ctr_start(unsigned long cbase, unsigned long cmask,
> if ((cbase + sbi_fls(cmask)) >= total_ctrs)
> return ret;
>
> + if (flags & SBI_PMU_STOP_FLAG_TAKE_SNAPSHOT)
> + return SBI_ENO_SHMEM;
> +
> if (flags & SBI_PMU_START_FLAG_SET_INIT_VALUE)
> bUpdate = true;
>
> @@ -540,6 +543,9 @@ int sbi_pmu_ctr_stop(unsigned long cbase, unsigned long cmask,
> if ((cbase + sbi_fls(cmask)) >= total_ctrs)
> return SBI_EINVAL;
>
> + if (flag & SBI_PMU_STOP_FLAG_TAKE_SNAPSHOT)
> + return SBI_ENO_SHMEM;
> +
> for_each_set_bit(i, &cmask, BITS_PER_LONG) {
> cidx = i + cbase;
> event_idx_type = pmu_ctr_validate(phs, cidx, &event_code);
> --
> 2.34.1
>
More information about the opensbi
mailing list