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:
parent
641d2e9f38
commit
57d3aa3b0d
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue