diff --git a/src/audio/base_fw.c b/src/audio/base_fw.c index ed297dc59105..1711566efdaf 100644 --- a/src/audio/base_fw.c +++ b/src/audio/base_fw.c @@ -16,12 +16,14 @@ #if defined(CONFIG_SOC_SERIES_INTEL_ACE) #include #endif -#include #include #include #include +#ifdef CONFIG_TELEMETRY +#include #include "adsp_debug_window.h" #include "mem_window.h" +#endif #if CONFIG_ACE_V1X_ART_COUNTER || CONFIG_ACE_V1X_RTC_COUNTER #include @@ -505,6 +507,30 @@ int schedulers_info_get(uint32_t *data_off_size, return 0; } +void set_perf_meas_state(const char *data) +{ +#ifdef CONFIG_TELEMETRY + enum ipc4_perf_measurements_state_set state = *data; + + struct telemetry_wnd_data *wnd_data = + (struct telemetry_wnd_data *)ADSP_DW->slots[DW_TELEMETRY_SLOT]; + struct system_tick_info *systick_info = + (struct system_tick_info *)wnd_data->system_tick_info; + + switch (state) { + case IPC4_PERF_MEASUREMENTS_DISABLED: + break; + case IPC4_PERF_MEASUREMENTS_STOPPED: + for (int i = 0; i < CONFIG_MAX_CORE_COUNT; i++) + systick_info[i].peak_utilization = 0; + break; + case IPC4_PERF_MEASUREMENTS_STARTED: + case IPC4_PERF_MEASUREMENTS_PAUSED: + break; + } +#endif +} + static int basefw_get_large_config(struct comp_dev *dev, uint32_t param_id, bool first_block, @@ -580,6 +606,7 @@ static int basefw_set_large_config(struct comp_dev *dev, case IPC4_FW_CONFIG: return basefw_set_fw_config(first_block, last_block, data_offset, data); case IPC4_PERF_MEASUREMENTS_STATE: + set_perf_meas_state(data); return 0; case IPC4_SYSTEM_TIME: return basefw_set_system_time(param_id, first_block,