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 <tomasz.lauda@linux.intel.com>
This commit is contained in:
Tomasz Lauda 2020-04-21 11:14:40 +02:00 committed by Tomasz Lauda
parent 5bf33d8616
commit 65dcba65bf
2 changed files with 30 additions and 1 deletions

View File

@ -8,8 +8,11 @@
#ifndef __SOF_LIB_AGENT_H__
#define __SOF_LIB_AGENT_H__
#include <sof/atomic.h>
#include <sof/lib/memory.h>
#include <sof/lib/perf_cnt.h>
#include <sof/schedule/task.h>
#include <sof/sof.h>
#include <config.h>
#include <stdbool.h>
#include <stdint.h>
@ -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

View File

@ -29,6 +29,7 @@
#include <ipc/topology.h>
#include <ipc/trace.h>
#include <user/trace.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
@ -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);