[Sound-open-firmware] [PATCH v2] [RFC]platform: calculate the percentage of cpu cycle
Wu Zhigang
zhigang.wu at linux.intel.com
Tue Jun 26 11:23:50 CEST 2018
calculate the percentage of cpu cyle based on
the CCOUNT register. which can tell the percentage
of cpu cycle usage. It is the rough calculation.
Signed-off-by: Wu Zhigang <zhigang.wu at linux.intel.com>
---
src/audio/dai.c | 22 ++++++++++++++++++++++
src/include/sof/wait.h | 8 ++++++++
src/tasks/audio.c | 10 ++++++++++
3 files changed, 40 insertions(+)
diff --git a/src/audio/dai.c b/src/audio/dai.c
index f6f16d7..11b20c5 100644
--- a/src/audio/dai.c
+++ b/src/audio/dai.c
@@ -43,11 +43,14 @@
#include <sof/audio/component.h>
#include <sof/audio/pipeline.h>
#include <platform/dma.h>
+#include <platform/clk.h>
#include <arch/cache.h>
#define DAI_PLAYBACK_STREAM 0
#define DAI_CAPTURE_STREAM 1
+#define CPU_CYCLE_PER_MS (CLK_DEFAULT_CPU_HZ / 1000)
+
/* tracing */
#define trace_dai(__e) trace_event(TRACE_CLASS_DAI, __e)
#define trace_dai_error(__e) trace_error(TRACE_CLASS_DAI, __e)
@@ -72,6 +75,22 @@ struct dai_data {
uint64_t wallclock; /* wall clock at stream start */
};
+static void calc_cpu_usage(struct pipeline *p)
+{
+ uint32_t delta = 0;
+
+ delta = global_cycle;
+ global_cycle = 0;
+ if (delta > CPU_CYCLE_PER_MS)
+ delta = CPU_CYCLE_PER_MS;
+ delta = (delta * 100) / CPU_CYCLE_PER_MS;
+
+ trace_dai_error("PcT");
+
+ /* the percentage of the cpu usage in 1ms */
+ trace_error_value(100 - delta);
+}
+
/* this is called by DMA driver every time descriptor has completed */
static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next)
{
@@ -81,6 +100,9 @@ static void dai_dma_cb(void *data, uint32_t type, struct dma_sg_elem *next)
tracev_dai("irq");
+ if (dev->params.direction == SOF_IPC_STREAM_PLAYBACK)
+ calc_cpu_usage(dev->pipeline);
+
/* stop dma copy for pause/stop/xrun */
if (dev->state != COMP_STATE_ACTIVE || dd->xrun) {
diff --git a/src/include/sof/wait.h b/src/include/sof/wait.h
index feb8b29..4baa8de 100644
--- a/src/include/sof/wait.h
+++ b/src/include/sof/wait.h
@@ -43,6 +43,7 @@
#include <sof/trace.h>
#include <sof/lock.h>
#include <platform/interrupt.h>
+#include <xtensa/hal.h>
#if DEBUG_LOCKS
#define wait_atomic_check \
@@ -157,4 +158,11 @@ static inline void wait_delay(uint64_t number_of_clks)
idelay(PLATFORM_DEFAULT_DELAY);
}
+uint32_t global_cycle;
+
+static inline uint32_t platform_get_cpu_count(void)
+{
+ return xthal_get_ccount();
+}
+
#endif
diff --git a/src/tasks/audio.c b/src/tasks/audio.c
index 5beae08..1a79808 100644
--- a/src/tasks/audio.c
+++ b/src/tasks/audio.c
@@ -51,6 +51,9 @@ struct audio_data {
struct pipeline *p;
};
+uint32_t global_cycle;
+static uint32_t c1, c2;
+
int do_task(struct sof *sof)
{
#ifdef STATIC_PIPE
@@ -78,13 +81,20 @@ int do_task(struct sof *sof)
/* let host know DSP boot is complete */
platform_boot_complete(0);
+ global_cycle = 0;
+
/* main audio IPC processing loop */
while (1) {
+ c1 = platform_get_cpu_count();
+
/* sleep until next IPC or DMA */
sa_enter_idle(sof);
wait_for_interrupt(0);
+ c2 = platform_get_cpu_count();
+ global_cycle += c2 - c1;
+
/* now process any IPC messages from host */
ipc_process_msg_queue();
--
2.17.1
More information about the Sound-open-firmware
mailing list