lib: sbi_pmu: Introduce fw_counter_write_value API
authorMayuresh Chitale <mchitale@ventanamicro.com>
Thu, 9 Mar 2023 13:13:57 +0000 (18:43 +0530)
committerAnup Patel <anup@brainfault.org>
Fri, 10 Mar 2023 08:30:30 +0000 (14:00 +0530)
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>
include/sbi/sbi_pmu.h
lib/sbi/sbi_pmu.c

index 3232e140ad743f5b3a13f43b4c8b5c510a1b248c..53f27003a9ef0a92f1197c1df297e4802feaf1be 100644 (file)
@@ -51,14 +51,19 @@ struct sbi_pmu_device {
         */
        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
-        * Note: SBI_PMU_FW_MAX <= event_idx_code
         * Note: 0 <= counter_index < SBI_PMU_FW_CTR_MAX
         */
        int (*fw_counter_start)(uint32_t counter_index,
-                               uint64_t event_data,
-                               uint64_t init_val, bool init_val_update);
+                               uint64_t event_data);
 
        /**
         * Stop custom firmware counter
index d0831985bb011d02afc99b662f36db835c4b0df0..00a2c3e92448489afad4d0e755e934cb54e18525 100644 (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,
                            bool ival_update)
 {
-       int ret;
        u32 hartid = current_hartid();
 
        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 (!pmu_dev ||
+                   !pmu_dev->fw_counter_write_value ||
                    !pmu_dev->fw_counter_start) {
                        return SBI_EINVAL;
                    }
 
-               ret = pmu_dev->fw_counter_start(cidx - num_hw_ctrs,
-                                               event_data,
-                                               ival, ival_update);
-               if (ret)
-                       return ret;
+               if (ival_update)
+                       pmu_dev->fw_counter_write_value(cidx - num_hw_ctrs,
+                                                       ival);
+
+               return pmu_dev->fw_counter_start(cidx - num_hw_ctrs,
+                                                event_data);
+       } else {
+               if (ival_update)
+                       fw_counters_data[hartid][cidx - num_hw_ctrs] = ival;
        }
 
-       if (ival_update)
-               fw_counters_data[hartid][cidx - num_hw_ctrs] = ival;
        fw_counters_started[hartid] |= BIT(cidx - num_hw_ctrs);
 
        return 0;
@@ -762,10 +764,9 @@ skip_match:
                if (flags & SBI_PMU_CFG_FLAG_AUTO_START) {
                        if (SBI_PMU_FW_PLATFORM == event_code &&
                            pmu_dev && pmu_dev->fw_counter_start) {
-                               ret = pmu_dev->fw_counter_start(
-                                       ctr_idx - num_hw_ctrs, event_data,
-                                       fw_counters_data[hartid][ctr_idx - num_hw_ctrs],
-                                       true);
+                               ret = pmu_dev->fw_counter_start(ctr_idx -
+                                                               num_hw_ctrs,
+                                                               event_data);
                                if (ret)
                                        return ret;
                        }