Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/audio/pipeline.c
Original file line number Diff line number Diff line change
Expand Up @@ -810,7 +810,7 @@ static int pipeline_xrun_recover(struct pipeline *p)
void pipeline_schedule_copy(struct pipeline *p, uint64_t start)
{
if (p->sched_comp->state == COMP_STATE_ACTIVE)
schedule_task(&p->pipe_task, start, p->ipc_pipe.deadline, 0);
schedule_task(&p->pipe_task, start, p->ipc_pipe.period, 0);
}

/* notify pipeline that this component requires buffers emptied/filled
Expand All @@ -819,7 +819,7 @@ void pipeline_schedule_copy(struct pipeline *p, uint64_t start)
*/
void pipeline_schedule_copy_idle(struct pipeline *p)
{
schedule_task(&p->pipe_task, 0, p->ipc_pipe.deadline,
schedule_task(&p->pipe_task, 0, p->ipc_pipe.period,
SOF_SCHEDULE_FLAG_IDLE);
}

Expand Down Expand Up @@ -862,5 +862,5 @@ static uint64_t pipeline_task(void *arg)

sched:
tracev_pipe("pipeline_task() sched");
return p->ipc_pipe.timer_delay;
return p->ipc_pipe.period;
}
11 changes: 6 additions & 5 deletions src/audio/pipeline_static.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,9 @@
/*
* Static Pipeline Convenience Constructor
*/
#define SPIPE_PIPE(pid, pcore, pdeadline, ppriority) \
{.pipeline_id = pid, .core = pcore, .deadline = pdeadline, .priority = ppriority}
#define SPIPE_PIPE(pid, pcore, pperiod, ppriority) \
{.pipeline_id = pid, .core = pcore, .period = pperiod, \
.priority = ppriority}
#define SPIPE_PIPE_CONNECT(psource, bsource, bid, psink, bsink) \
{.pipeline_source_id = psource, .comp_source_id = bsource, \
.buffer_id = bid, .pipeline_sink_id = psink, .comp_sink_id = bsink}
Expand Down Expand Up @@ -345,9 +346,9 @@ static struct spipe spipe[] = {

/* pipelines */
struct sof_ipc_pipe_new pipeline[] = {
SPIPE_PIPE(0, 0, 1000, SOF_TASK_PRI_HIGH),/* high pri - 1ms deadline */
// SPIPE_PIPE(1, 0, 4000, SOF_TASK_PRI_MED),/* med pri - 4ms deadline */
// SPIPE_PIPE(2, 0, 5000, SOF_TASK_PRI_LOW),/* low pri - 5ms deadline */
SPIPE_PIPE(0, 0, 1000, SOF_TASK_PRI_HIGH),/* high pri - 1ms period */
// SPIPE_PIPE(1, 0, 4000, SOF_TASK_PRI_MED),/* med pri - 4ms period */
// SPIPE_PIPE(2, 0, 5000, SOF_TASK_PRI_LOW),/* low pri - 5ms period */
};

int init_static_pipeline(struct ipc *ipc)
Expand Down
4 changes: 2 additions & 2 deletions src/host/common_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,11 +125,11 @@ int tb_pipeline_params(struct ipc *ipc, int nch,
struct sof_ipc_pcm_params params;
char message[DEBUG_MSG_LEN];
int fs_period;
int deadline = ipc_pipe->deadline;
int period = ipc_pipe->period;
int ret = 0;

/* Compute period from sample rates */
fs_period = (int)(0.9999 + tp->fs_in * deadline / 1e6);
fs_period = (int)(0.9999 + tp->fs_in * period / 1e6);
sprintf(message, "period sample count %d\n", fs_period);
debug_print(message);

Expand Down
4 changes: 2 additions & 2 deletions src/host/testbench.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,10 +288,10 @@ int main(int argc, char **argv)

/* input and output sample rate */
if (!tp.fs_in)
tp.fs_in = ipc_pipe->deadline * ipc_pipe->frames_per_sched;
tp.fs_in = ipc_pipe->period * ipc_pipe->frames_per_sched;

if (!tp.fs_out)
tp.fs_out = ipc_pipe->deadline * ipc_pipe->frames_per_sched;
tp.fs_out = ipc_pipe->period * ipc_pipe->frames_per_sched;

/* set pipeline params and trigger start */
if (tb_pipeline_start(sof.ipc, TESTBENCH_NCH, ipc_pipe, &tp) < 0) {
Expand Down
2 changes: 1 addition & 1 deletion src/include/host/common_test.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ struct testbench_prm {
/*
* input and output sample rate parameters
* By default, these are calculated from pipeline frames_per_sched
* and deadline but they can also be overridden via input arguments
* and period but they can also be overridden via input arguments
* to the testbench.
*/
uint32_t fs_in;
Expand Down
12 changes: 6 additions & 6 deletions src/include/host/topology.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,12 @@
#define SOF_TKN_BUF_CAPS 101

/* scheduling */
#define SOF_TKN_SCHED_DEADLINE 200
#define SOF_TKN_SCHED_PERIOD 200
#define SOF_TKN_SCHED_PRIORITY 201
#define SOF_TKN_SCHED_MIPS 202
#define SOF_TKN_SCHED_CORE 203
#define SOF_TKN_SCHED_FRAMES 204
#define SOF_TKN_SCHED_TIMER 205
#define SOF_TKN_SCHED_TIME_DOMAIN 205

/* volume */
#define SOF_TKN_VOLUME_RAMP_STEP_TYPE 250
Expand Down Expand Up @@ -119,9 +119,9 @@ static const struct sof_topology_token buffer_tokens[] = {

/* scheduling */
static const struct sof_topology_token sched_tokens[] = {
{SOF_TKN_SCHED_DEADLINE, SND_SOC_TPLG_TUPLE_TYPE_WORD,
{SOF_TKN_SCHED_PERIOD, SND_SOC_TPLG_TUPLE_TYPE_WORD,
get_token_uint32_t,
offsetof(struct sof_ipc_pipe_new, deadline), 0},
offsetof(struct sof_ipc_pipe_new, period), 0},
{SOF_TKN_SCHED_PRIORITY, SND_SOC_TPLG_TUPLE_TYPE_WORD,
get_token_uint32_t,
offsetof(struct sof_ipc_pipe_new, priority), 0},
Expand All @@ -134,9 +134,9 @@ static const struct sof_topology_token sched_tokens[] = {
{SOF_TKN_SCHED_FRAMES, SND_SOC_TPLG_TUPLE_TYPE_WORD,
get_token_uint32_t,
offsetof(struct sof_ipc_pipe_new, frames_per_sched), 0},
{SOF_TKN_SCHED_TIMER, SND_SOC_TPLG_TUPLE_TYPE_WORD,
{SOF_TKN_SCHED_TIME_DOMAIN, SND_SOC_TPLG_TUPLE_TYPE_WORD,
get_token_uint32_t,
offsetof(struct sof_ipc_pipe_new, timer_delay), 0},
offsetof(struct sof_ipc_pipe_new, time_domain), 0},
};

/* volume */
Expand Down
2 changes: 1 addition & 1 deletion src/include/sof/audio/pipeline.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ static inline bool pipeline_is_preload(struct pipeline *p)
/* checks if pipeline is scheduled with timer */
static inline bool pipeline_is_timer_driven(struct pipeline *p)
{
return p->ipc_pipe.timer_delay;
return p->ipc_pipe.time_domain == SOF_TIME_DOMAIN_TIMER;
}

/* pipeline creation and destruction */
Expand Down
12 changes: 8 additions & 4 deletions src/include/uapi/ipc/topology.h
Original file line number Diff line number Diff line change
Expand Up @@ -248,21 +248,25 @@ struct sof_ipc_comp_reply {
* Pipeline
*/

/** \brief Types of pipeline scheduling time domains */
enum sof_ipc_pipe_sched_time_domain {
SOF_TIME_DOMAIN_DMA = 0, /**< DMA interrupt */
SOF_TIME_DOMAIN_TIMER, /**< Timer interrupt */
};

/* new pipeline - SOF_IPC_TPLG_PIPE_NEW */
struct sof_ipc_pipe_new {
struct sof_ipc_cmd_hdr hdr;
uint32_t comp_id; /**< component id for pipeline */
uint32_t pipeline_id; /**< pipeline id */
uint32_t sched_id; /**< Scheduling component id */
uint32_t core; /**< core we run on */
uint32_t deadline; /**< execution completion deadline in us*/
uint32_t period; /**< execution period in us*/
uint32_t priority; /**< priority level 0 (low) to 10 (max) */
uint32_t period_mips; /**< worst case instruction count per period */
uint32_t frames_per_sched;/**< output frames of pipeline, 0 is variable */
uint32_t xrun_limit_usecs; /**< report xruns greater than limit */

/* non zero if timer scheduled, otherwise DAI DMA irq scheduled */
uint32_t timer_delay;
uint32_t time_domain; /**< scheduling time domain */
} __attribute__((packed));

/* pipeline construction complete - SOF_IPC_TPLG_PIPE_COMPLETE */
Expand Down
4 changes: 3 additions & 1 deletion tools/topology/m4/dai.m4
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ define(`DAI_CONFIG',
dnl DAI_ADD(pipeline,
dnl pipe id, dai type, dai_index, dai_be,
dnl buffer, periods, format,
dnl frames, deadline, priority, core)
dnl frames, deadline, priority, core, time_domain)
define(`DAI_ADD',
`undefine(`PIPELINE_ID')'
`undefine(`DAI_TYPE')'
Expand All @@ -180,6 +180,7 @@ define(`DAI_ADD',
`undefine(`SCHEDULE_DEADLINE')'
`undefine(`SCHEDULE_PRIORITY')'
`undefine(`SCHEDULE_CORE')'
`undefine(`SCHEDULE_TIME_DOMAIN')'
`define(`PIPELINE_ID', $2)'
`define(`DAI_TYPE', STR($3))'
`define(`DAI_INDEX', STR($4))'
Expand All @@ -192,6 +193,7 @@ define(`DAI_ADD',
`define(`SCHEDULE_DEADLINE', $10)'
`define(`SCHEDULE_PRIORITY', $11)'
`define(`SCHEDULE_CORE', $12)'
`define(`SCHEDULE_TIME_DOMAIN', $13)'
`include($1)'
`DEBUG_DAI($3, $4)'
)
Expand Down
39 changes: 26 additions & 13 deletions tools/topology/m4/pipeline.m4
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
divert(-1)

# list of generic scheduling time domains
define(`SCHEDULE_TIME_DOMAIN_DMA', 0)
define(`SCHEDULE_TIME_DOMAIN_TIMER', 1)

dnl Define macro for pipeline widget

dnl Pipeline name)
define(`N_PIPELINE', `PIPELINE.'PIPELINE_ID`.'$1)

dnl W_PIPELINE(stream, deadline, priority, frames, core, timer, platform)
dnl W_PIPELINE(stream, period, priority, frames, core, initiator, platform)
define(`W_PIPELINE',
`SectionVendorTuples."'N_PIPELINE($1)`_tuples" {'
` tokens "sof_sched_tokens"'
` tuples."word" {'
` SOF_TKN_SCHED_DEADLINE' STR($2)
` SOF_TKN_SCHED_PERIOD' STR($2)
` SOF_TKN_SCHED_PRIORITY' STR($3)
` SOF_TKN_SCHED_CORE' STR($5)
` SOF_TKN_SCHED_FRAMES' STR($4)
` SOF_TKN_SCHED_TIMER' STR($6)
` SOF_TKN_SCHED_TIME_DOMAIN' STR($6)
` }'
`}'
`SectionData."'N_PIPELINE($1)`_data" {'
Expand All @@ -33,42 +37,47 @@ define(`W_PIPELINE',

dnl PIPELINE_PCM_ADD(pipeline,
dnl pipe id, pcm, max channels, format,
dnl frames, deadline, priority, core)
dnl frames, period, priority, core,
dnl time_domain)
define(`PIPELINE_PCM_ADD',
`undefine(`PCM_ID')'
`undefine(`PIPELINE_ID')'
`undefine(`PIPELINE_CHANNELS')'
`undefine(`PIPELINE_FORMAT')'
`undefine(`SCHEDULE_FRAMES')'
`undefine(`SCHEDULE_DEADLINE')'
`undefine(`SCHEDULE_PERIOD')'
`undefine(`SCHEDULE_PRIORITY')'
`undefine(`SCHEDULE_CORE')'
`undefine(`SCHEDULE_TIME_DOMAIN')'
`define(`PIPELINE_ID', $2)'
`define(`PCM_ID', $3)'
`define(`PIPELINE_CHANNELS', $4)'
`define(`PIPELINE_FORMAT', $5)'
`define(`SCHEDULE_FRAMES', $6)'
`define(`SCHEDULE_DEADLINE', $7)'
`define(`SCHEDULE_PERIOD', $7)'
`define(`SCHEDULE_PRIORITY', $8)'
`define(`SCHEDULE_CORE', $9)'
`define(`SCHEDULE_TIME_DOMAIN', $10)'
`define(`DAI_FORMAT', $5)'
`include($1)'
`DEBUG_PCM_ADD($1, $3)'
)

dnl PIPELINE_PCM_DAI_ADD(pipeline,
dnl pipe id, pcm, max channels, format,
dnl frames, deadline, priority, core,
dnl dai type, dai_index, dai format, periods)
dnl frames, period, priority, core,
dnl dai type, dai_index, dai format,
dnl periods, time_domain)
define(`PIPELINE_PCM_DAI_ADD',
`undefine(`PCM_ID')'
`undefine(`PIPELINE_ID')'
`undefine(`PIPELINE_CHANNELS')'
`undefine(`PIPELINE_FORMAT')'
`undefine(`SCHEDULE_FRAMES')'
`undefine(`SCHEDULE_DEADLINE')'
`undefine(`SCHEDULE_PERIOD')'
`undefine(`SCHEDULE_PRIORITY')'
`undefine(`SCHEDULE_CORE')'
`undefine(`SCHEDULE_TIME_DOMAIN')'
`undefine(`DAI_TYPE')'
`undefine(`DAI_INDEX')'
`undefine(`DAI_FORMAT')'
Expand All @@ -78,9 +87,10 @@ define(`PIPELINE_PCM_DAI_ADD',
`define(`PIPELINE_CHANNELS', $4)'
`define(`PIPELINE_FORMAT', $5)'
`define(`SCHEDULE_FRAMES', $6)'
`define(`SCHEDULE_DEADLINE', $7)'
`define(`SCHEDULE_PERIOD', $7)'
`define(`SCHEDULE_PRIORITY', $8)'
`define(`SCHEDULE_CORE', $9)'
`define(`SCHEDULE_TIME_DOMAIN', $14)'
`define(`DAI_TYPE', STR($10))'
`define(`DAI_INDEX', STR($11))'
`define(`DAI_FORMAT', $12)'
Expand All @@ -91,22 +101,25 @@ define(`PIPELINE_PCM_DAI_ADD',

dnl PIPELINE_ADD(pipeline,
dnl pipe id, max channels, format,
dnl frames, deadline, priority, core, sched_comp)
dnl frames, period, priority, core,
dnl sched_comp, time_domain)
define(`PIPELINE_ADD',
`undefine(`PIPELINE_ID')'
`undefine(`PIPELINE_CHANNELS')'
`undefine(`PIPELINE_FORMAT')'
`undefine(`SCHEDULE_FRAMES')'
`undefine(`SCHEDULE_DEADLINE')'
`undefine(`SCHEDULE_PERIOD')'
`undefine(`SCHEDULE_PRIORITY')'
`undefine(`SCHEDULE_CORE')'
`undefine(`SCHEDULE_TIME_DOMAIN')'
`define(`PIPELINE_ID', $2)'
`define(`PIPELINE_CHANNELS', $3)'
`define(`PIPELINE_FORMAT', $4)'
`define(`SCHEDULE_FRAMES', $5)'
`define(`SCHEDULE_DEADLINE', $6)'
`define(`SCHEDULE_PERIOD', $6)'
`define(`SCHEDULE_PRIORITY', $7)'
`define(`SCHEDULE_CORE', $8)'
`define(`SCHEDULE_TIME_DOMAIN', $10)'
`define(`SCHED_COMP', $9)'
`include($1)'
)
Expand Down
6 changes: 3 additions & 3 deletions tools/topology/sof-apl-da7219.m4
Original file line number Diff line number Diff line change
Expand Up @@ -112,21 +112,21 @@ DAI_ADD(sof/pipe-dai-capture.m4,
DAI_ADD(sof/pipe-dai-playback.m4,
5, HDA, 3, iDisp1,
PIPELINE_SOURCE_5, 2, s32le,
48, 1000, 0, 0)
48, 1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# playback DAI is iDisp2 using 2 periods
# Buffers use s32le format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-playback.m4,
6, HDA, 4, iDisp2,
PIPELINE_SOURCE_6, 2, s32le,
48, 1000, 0, 0)
48, 1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# playback DAI is iDisp3 using 2 periods
# Buffers use s32le format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-playback.m4,
7, HDA, 5, iDisp3,
PIPELINE_SOURCE_7, 2, s32le,
48, 1000, 0, 0)
48, 1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

PCM_PLAYBACK_ADD(Speakers, 0, PIPELINE_PCM_1)
PCM_DUPLEX_ADD(Headset, 1, PIPELINE_PCM_2, PIPELINE_PCM_3)
Expand Down
6 changes: 3 additions & 3 deletions tools/topology/sof-apl-pcm512x.m4
Original file line number Diff line number Diff line change
Expand Up @@ -77,21 +77,21 @@ DAI_ADD(sof/pipe-dai-playback.m4,
DAI_ADD(sof/pipe-dai-playback.m4,
2, HDA, 0, iDisp1,
PIPELINE_SOURCE_2, 2, s32le,
48, 1000, 0, 0)
48, 1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# playback DAI is iDisp2 using 2 periods
# Buffers use s32le format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-playback.m4,
3, HDA, 1, iDisp2,
PIPELINE_SOURCE_3, 2, s32le,
48, 1000, 0, 0)
48, 1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# playback DAI is iDisp3 using 2 periods
# Buffers use s32le format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-playback.m4,
4, HDA, 2, iDisp3,
PIPELINE_SOURCE_4, 2, s32le,
48, 1000, 0, 0)
48, 1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# PCM Low Latency, id 0
dnl PCM_PLAYBACK_ADD(name, pcm_id, playback)
Expand Down
6 changes: 3 additions & 3 deletions tools/topology/sof-apl-rt298.m4
Original file line number Diff line number Diff line change
Expand Up @@ -65,21 +65,21 @@ DAI_ADD(sof/pipe-dai-playback.m4,
DAI_ADD(sof/pipe-dai-playback.m4,
5, HDA, 3, iDisp1,
PIPELINE_SOURCE_5, 2, s32le,
48, 1000, 0, 0)
48, 1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# playback DAI is iDisp2 using 2 periods
# Buffers use s16le format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-playback.m4,
6, HDA, 4, iDisp2,
PIPELINE_SOURCE_6, 2, s32le,
48, 1000, 0, 0)
48, 1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# playback DAI is iDisp3 using 2 periods
# Buffers use s16le format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-playback.m4,
7, HDA, 5, iDisp3,
PIPELINE_SOURCE_7, 2, s32le,
48, 1000, 0, 0)
48, 1000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)

# PCM Low Latency, id 0
PCM_PLAYBACK_ADD(Port5, 0, PIPELINE_PCM_1)
Expand Down
Loading