mirror of https://github.com/thesofproject/sof.git
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:
parent
5bf33d8616
commit
65dcba65bf
|
@ -8,8 +8,11 @@
|
||||||
#ifndef __SOF_LIB_AGENT_H__
|
#ifndef __SOF_LIB_AGENT_H__
|
||||||
#define __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/lib/perf_cnt.h>
|
||||||
#include <sof/schedule/task.h>
|
#include <sof/schedule/task.h>
|
||||||
|
#include <sof/sof.h>
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
@ -25,15 +28,37 @@ struct sa {
|
||||||
struct perf_cnt_data pcd;
|
struct perf_cnt_data pcd;
|
||||||
#endif
|
#endif
|
||||||
struct task work;
|
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
|
#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);
|
void sa_init(struct sof *sof, uint64_t timeout);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static inline void sa_init(struct sof *sof, uint64_t timeout) { }
|
static inline void sa_init(struct sof *sof, uint64_t timeout) { }
|
||||||
|
static inline void sa_set_panic_on_delay(bool enabled) { }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <ipc/topology.h>
|
#include <ipc/topology.h>
|
||||||
#include <ipc/trace.h>
|
#include <ipc/trace.h>
|
||||||
#include <user/trace.h>
|
#include <user/trace.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
@ -60,7 +61,7 @@ static enum task_state validate(void *data)
|
||||||
perf_cnt_stamp(&sa->pcd, perf_sa_trace, sa);
|
perf_cnt_stamp(&sa->pcd, perf_sa_trace, sa);
|
||||||
|
|
||||||
/* panic timeout */
|
/* panic timeout */
|
||||||
if (delta > sa->panic_timeout)
|
if (sa->panic_on_delay && delta > sa->panic_timeout)
|
||||||
panic(SOF_IPC_PANIC_IDLE);
|
panic(SOF_IPC_PANIC_IDLE);
|
||||||
|
|
||||||
/* warning timeout */
|
/* 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->panic_timeout = 2 * ticks; /* 100% delay */
|
||||||
sof->sa->warn_timeout = ticks + ticks / 20; /* 5% 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",
|
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);
|
ticks, sof->sa->warn_timeout, sof->sa->panic_timeout);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue