lib: sbi_pmu: Introduce fw_counter_write_value API

Add fw_counter_write_value API for platform specific firmware events
which separates setting the counter's initial value from starting the
counter. This is required so that the fw_event_data array can be reused
to save the event data received.

Signed-off-by: Mayuresh Chitale <mchitale@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Mayuresh Chitale 2023-03-09 18:43:57 +05:30 committed by Anup Patel
parent 641d2e9f38
commit 57d3aa3b0d
2 changed files with 21 additions and 15 deletions

View File

@ -51,14 +51,19 @@ struct sbi_pmu_device {
*/ */
uint64_t (*fw_counter_read_value)(uint32_t counter_index); uint64_t (*fw_counter_read_value)(uint32_t counter_index);
/**
* Write value to custom firmware counter
* Note: 0 <= counter_index < SBI_PMU_FW_CTR_MAX
*/
void (*fw_counter_write_value)(uint32_t counter_index,
uint64_t value);
/** /**
* Start custom firmware counter * Start custom firmware counter
* Note: SBI_PMU_FW_MAX <= event_idx_code
* Note: 0 <= counter_index < SBI_PMU_FW_CTR_MAX * Note: 0 <= counter_index < SBI_PMU_FW_CTR_MAX
*/ */
int (*fw_counter_start)(uint32_t counter_index, int (*fw_counter_start)(uint32_t counter_index,
uint64_t event_data, uint64_t event_data);
uint64_t init_val, bool init_val_update);
/** /**
* Stop custom firmware counter * Stop custom firmware counter

View File

@ -376,7 +376,6 @@ static int pmu_ctr_start_fw(uint32_t cidx, uint32_t event_code,
uint64_t event_data, uint64_t ival, uint64_t event_data, uint64_t ival,
bool ival_update) bool ival_update)
{ {
int ret;
u32 hartid = current_hartid(); u32 hartid = current_hartid();
if ((event_code >= SBI_PMU_FW_MAX && if ((event_code >= SBI_PMU_FW_MAX &&
@ -386,19 +385,22 @@ static int pmu_ctr_start_fw(uint32_t cidx, uint32_t event_code,
if (SBI_PMU_FW_PLATFORM == event_code) { if (SBI_PMU_FW_PLATFORM == event_code) {
if (!pmu_dev || if (!pmu_dev ||
!pmu_dev->fw_counter_write_value ||
!pmu_dev->fw_counter_start) { !pmu_dev->fw_counter_start) {
return SBI_EINVAL; return SBI_EINVAL;
} }
ret = pmu_dev->fw_counter_start(cidx - num_hw_ctrs, if (ival_update)
event_data, pmu_dev->fw_counter_write_value(cidx - num_hw_ctrs,
ival, ival_update); ival);
if (ret)
return ret;
}
return pmu_dev->fw_counter_start(cidx - num_hw_ctrs,
event_data);
} else {
if (ival_update) if (ival_update)
fw_counters_data[hartid][cidx - num_hw_ctrs] = ival; fw_counters_data[hartid][cidx - num_hw_ctrs] = ival;
}
fw_counters_started[hartid] |= BIT(cidx - num_hw_ctrs); fw_counters_started[hartid] |= BIT(cidx - num_hw_ctrs);
return 0; return 0;
@ -762,10 +764,9 @@ skip_match:
if (flags & SBI_PMU_CFG_FLAG_AUTO_START) { if (flags & SBI_PMU_CFG_FLAG_AUTO_START) {
if (SBI_PMU_FW_PLATFORM == event_code && if (SBI_PMU_FW_PLATFORM == event_code &&
pmu_dev && pmu_dev->fw_counter_start) { pmu_dev && pmu_dev->fw_counter_start) {
ret = pmu_dev->fw_counter_start( ret = pmu_dev->fw_counter_start(ctr_idx -
ctr_idx - num_hw_ctrs, event_data, num_hw_ctrs,
fw_counters_data[hartid][ctr_idx - num_hw_ctrs], event_data);
true);
if (ret) if (ret)
return ret; return ret;
} }