#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 {
/* 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
#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 */
#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
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;
}
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;
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);