From 65dcba65bf26866f2b2055fb9b8dd3f410dd0bbd Mon Sep 17 00:00:00 2001 From: Tomasz Lauda Date: Tue, 21 Apr 2020 11:14:40 +0200 Subject: [PATCH] agent: make panic on delay configurable Adds additional functionality to system agent that allows to enable and disable panic on delay when necessary. Signed-off-by: Tomasz Lauda --- src/include/sof/lib/agent.h | 25 +++++++++++++++++++++++++ src/lib/agent.c | 6 +++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/include/sof/lib/agent.h b/src/include/sof/lib/agent.h index 041fc6840..ffea6892b 100644 --- a/src/include/sof/lib/agent.h +++ b/src/include/sof/lib/agent.h @@ -8,8 +8,11 @@ #ifndef __SOF_LIB_AGENT_H__ #define __SOF_LIB_AGENT_H__ +#include +#include #include #include +#include #include #include #include @@ -25,15 +28,37 @@ struct sa { struct perf_cnt_data pcd; #endif struct task work; + atomic_t panic_cnt; /**< ref counter for panic_on_delay property */ + bool panic_on_delay; /**< emits panic on delay if true */ }; #if CONFIG_HAVE_AGENT +/** + * Enables or disables panic on agent delay. + * @param enabled True for panic enabling, false otherwise. + */ +static inline void sa_set_panic_on_delay(bool enabled) +{ + struct sa *sa = sof_get()->sa; + + if (enabled) + atomic_add(&sa->panic_cnt, 1); + else + atomic_sub(&sa->panic_cnt, 1); + + /* enable panic only if no refs */ + sa->panic_on_delay = !atomic_read(&sa->panic_cnt); + + platform_shared_commit(sa, sizeof(*sa)); +} + void sa_init(struct sof *sof, uint64_t timeout); #else static inline void sa_init(struct sof *sof, uint64_t timeout) { } +static inline void sa_set_panic_on_delay(bool enabled) { } #endif diff --git a/src/lib/agent.c b/src/lib/agent.c index 50859b4aa..8151344a0 100644 --- a/src/lib/agent.c +++ b/src/lib/agent.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -60,7 +61,7 @@ static enum task_state validate(void *data) perf_cnt_stamp(&sa->pcd, perf_sa_trace, sa); /* panic timeout */ - if (delta > sa->panic_timeout) + if (sa->panic_on_delay && delta > sa->panic_timeout) panic(SOF_IPC_PANIC_IDLE); /* warning timeout */ @@ -92,6 +93,9 @@ void sa_init(struct sof *sof, uint64_t timeout) sof->sa->panic_timeout = 2 * ticks; /* 100% delay */ sof->sa->warn_timeout = ticks + ticks / 20; /* 5% delay */ + atomic_init(&sof->sa->panic_cnt, 0); + sof->sa->panic_on_delay = true; + trace_sa("sa_init(), ticks = %u, sof->sa->warn_timeout = %u, sof->sa->panic_timeout = %u", ticks, sof->sa->warn_timeout, sof->sa->panic_timeout);