Skip to content

Commit

Permalink
topology: enable pcm range and pipeline rate and remove frame count
Browse files Browse the repository at this point in the history
Enable setting pcm min and max rate from top level m4 pipeline macro.
This way it is possible to configure the whole pipeline to correct
samplerate range in 1 file. Previously you needed to modify the pipeline
macros where the rate was hardcoded. As the frame count is calculated
from pcm/dai rate and scheduling time the frame count is obsolete.

Introduce pipeline rate parameter to help configuring components with
fixed output rate. We can't deduce this from pcm range since for example
src might accept bigger max rate than the following dai. Even though the
parameter is named "pipeline rate" it essentially means the "final"
output rate to which this pipeline is connected to (dai or other
pipeline). In capture pipelines it means the originating fixed dai rate.

Signed-off-by: Jaska Uimonen <jaska.uimonen@intel.com>
  • Loading branch information
Jaska Uimonen authored and tlauda committed Aug 15, 2019
1 parent f9ec396 commit 77b6db8
Show file tree
Hide file tree
Showing 77 changed files with 1,633 additions and 793 deletions.
14 changes: 8 additions & 6 deletions tools/test/topology/test-all.m4
Original file line number Diff line number Diff line change
Expand Up @@ -43,17 +43,19 @@ include(`byt.m4')

PIPELINE_PCM_DAI_ADD(sof/pipe-TEST_PIPE_NAME-playback.m4,
1, 0, 2, TEST_PIPE_FORMAT,
48, 1000, 0, 0,
TEST_DAI_TYPE, TEST_DAI_PORT, TEST_DAI_FORMAT, 2)
1000, 0, 0,
TEST_DAI_TYPE, TEST_DAI_PORT, TEST_DAI_FORMAT, 2,
48000, 48000, 48000)


# Passthrough playback pipeline 2 on PCM 0 using max 2 channels of s24le.
# Schedule 48 frames per 1000us deadline on core 0 with priority 0

PIPELINE_PCM_DAI_ADD(sof/pipe-TEST_PIPE_NAME-capture.m4,
2, 0, 2, TEST_PIPE_FORMAT,
48, 1000, 0, 0,
TEST_DAI_TYPE, TEST_DAI_PORT, TEST_DAI_FORMAT, 2)
1000, 0, 0,
TEST_DAI_TYPE, TEST_DAI_PORT, TEST_DAI_FORMAT, 2,
48000, 48000, 48000)

#
# DAI configuration
Expand All @@ -66,14 +68,14 @@ PIPELINE_PCM_DAI_ADD(sof/pipe-TEST_PIPE_NAME-capture.m4,
DAI_ADD(sof/pipe-dai-playback.m4,
1, TEST_DAI_TYPE, TEST_DAI_PORT, TEST_DAI_LINK_NAME,
PIPELINE_SOURCE_1, 2, TEST_DAI_FORMAT,
48, 1000, 0, 0)
1000, 0, 0)

# capture DAI is SSP TEST_DAI_PORT using 2 periods
# Buffers use s24le format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-capture.m4,
2, TEST_DAI_TYPE, TEST_DAI_PORT, TEST_DAI_LINK_NAME,
PIPELINE_SINK_2, 2, TEST_DAI_FORMAT,
48, 1000, 0, 0)
1000, 0, 0)

# PCM Passthrough
PCM_DUPLEX_ADD(Passthrough, 0, PIPELINE_PCM_1, PIPELINE_PCM_2)
Expand Down
7 changes: 4 additions & 3 deletions tools/test/topology/test-capture.m4
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,9 @@ include(`byt.m4')

PIPELINE_PCM_DAI_ADD(sof/pipe-TEST_PIPE_NAME-capture.m4,
2, 0, 4, TEST_PIPE_FORMAT,
48, 1000, 0, 0,
TEST_DAI_TYPE, TEST_DAI_PORT, TEST_DAI_FORMAT, 2)
1000, 0, 0,
TEST_DAI_TYPE, TEST_DAI_PORT, TEST_DAI_FORMAT, 2,
48000, 48000, 48000)

#
# DAI configuration
Expand All @@ -57,7 +58,7 @@ PIPELINE_PCM_DAI_ADD(sof/pipe-TEST_PIPE_NAME-capture.m4,
DAI_ADD(sof/pipe-dai-capture.m4,
2, TEST_DAI_TYPE, TEST_DAI_PORT, TEST_DAI_LINK_NAME,
PIPELINE_SINK_2, 2, TEST_DAI_FORMAT,
48, 1000, 0, 0)
1000, 0, 0)

# PCM Passthrough
PCM_CAPTURE_ADD(Passthrough, 0, PIPELINE_PCM_2)
Expand Down
7 changes: 4 additions & 3 deletions tools/test/topology/test-equalizer-playback-ssp.m4
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,9 @@ include(`dsps/byt.m4')

PIPELINE_PCM_DAI_ADD(sof/pipe-TEST_PIPE_NAME-playback.m4,
1, 0, 2, TEST_PIPE_FORMAT,
48, 1000, 0, 0, 0, 1,
SSP, TEST_SSP_PORT, TEST_SSP_FORMAT, 2)
1000, 0, 0, 0, 1,
SSP, TEST_SSP_PORT, TEST_SSP_FORMAT, 2,
48000, 48000, 48000)
#
# DAI configuration
#
Expand All @@ -55,7 +56,7 @@ PIPELINE_PCM_DAI_ADD(sof/pipe-TEST_PIPE_NAME-playback.m4,
DAI_ADD(sof/pipe-dai-playback.m4,
1, SSP, TEST_SSP_PORT, TEST_DAI_LINK_NAME,
PIPELINE_SOURCE_1, 2, TEST_SSP_FORMAT,
48, 1000, 0, 0)
1000, 0, 0)

# PCM Passthrough
PCM_PLAYBACK_ADD(Passthrough, 3, 0, 0, PIPELINE_PCM_1)
Expand Down
7 changes: 4 additions & 3 deletions tools/test/topology/test-playback.m4
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@ include(`byt.m4')

PIPELINE_PCM_DAI_ADD(sof/pipe-TEST_PIPE_NAME-playback.m4,
1, 0, 2, TEST_PIPE_FORMAT,
48, 1000, 0, 0,
TEST_DAI_TYPE, TEST_DAI_PORT, TEST_DAI_FORMAT, 2)
1000, 0, 0,
TEST_DAI_TYPE, TEST_DAI_PORT, TEST_DAI_FORMAT, 2,
48000, 48000, 48000)
#
# DAI configuration
#
Expand All @@ -56,7 +57,7 @@ PIPELINE_PCM_DAI_ADD(sof/pipe-TEST_PIPE_NAME-playback.m4,
DAI_ADD(sof/pipe-dai-playback.m4,
1, TEST_DAI_TYPE, TEST_DAI_PORT, TEST_DAI_LINK_NAME,
PIPELINE_SOURCE_1, 2, TEST_DAI_FORMAT,
48, 1000, 0, 0)
1000, 0, 0)

# PCM Passthrough
PCM_PLAYBACK_ADD(Passthrough, 0, PIPELINE_PCM_1)
Expand Down
5 changes: 3 additions & 2 deletions tools/test/topology/test-tone-playback.m4
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,15 @@ define(`TONE_SAMPLE_RATE', 48000)
# Schedule with 48 frame per 1000us deadline on core 0 with priority 0
PIPELINE_ADD(sof/pipe-tone.m4,
5, 2, TEST_PIPE_FORMAT,
48, 1000, 0, 0, 0)
1000, 0, 0, 0, 0,
48000, 48000, 48000)

# playback DAI is SSP2 using 2 periods
# Buffers use TEST_DAI_FORMAT format, with 48 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-playback.m4,
5, TEST_DAI_TYPE, TEST_DAI_PORT, TEST_DAI_LINK_NAME,
PIPELINE_SOURCE_5, 2, TEST_DAI_FORMAT,
48, 1000, 2, 0)
1000, 2, 0)

#
# BE configurations - overrides config in ACPI if present
Expand Down
12 changes: 5 additions & 7 deletions tools/topology/m4/dai.m4
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,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, time_domain)
dnl deadline, priority, core, time_domain)
define(`DAI_ADD',
`undefine(`PIPELINE_ID')'
`undefine(`DAI_TYPE')'
Expand All @@ -180,7 +180,6 @@ define(`DAI_ADD',
`undefine(`DAI_BUF')'
`undefine(`DAI_PERIODS')'
`undefine(`DAI_FORMAT')'
`undefine(`SCHEDULE_FRAMES')'
`undefine(`SCHEDULE_DEADLINE')'
`undefine(`SCHEDULE_PRIORITY')'
`undefine(`SCHEDULE_CORE')'
Expand All @@ -193,11 +192,10 @@ define(`DAI_ADD',
`define(`DAI_NAME', $3$4)'
`define(`DAI_PERIODS', $7)'
`define(`DAI_FORMAT', $8)'
`define(`SCHEDULE_FRAMES', $9)'
`define(`SCHEDULE_DEADLINE', $10)'
`define(`SCHEDULE_PRIORITY', $11)'
`define(`SCHEDULE_CORE', $12)'
`define(`SCHEDULE_TIME_DOMAIN', $13)'
`define(`SCHEDULE_DEADLINE', $9)'
`define(`SCHEDULE_PRIORITY', $10)'
`define(`SCHEDULE_CORE', $11)'
`define(`SCHEDULE_TIME_DOMAIN', $12)'
`include($1)'
`DEBUG_DAI($3, $4)'
)
Expand Down
88 changes: 51 additions & 37 deletions tools/topology/m4/pipeline.m4
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,16 @@ dnl Define macro for pipeline widget
dnl Pipeline name)
define(`N_PIPELINE', `PIPELINE.'PIPELINE_ID`.'$1)

dnl W_PIPELINE(stream, period, priority, frames, core, initiator, platform)
dnl W_PIPELINE(stream, period, priority, core, initiator, platform)
define(`W_PIPELINE',
`SectionVendorTuples."'N_PIPELINE($1)`_tuples" {'
` tokens "sof_sched_tokens"'
` tuples."word" {'
` 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_TIME_DOMAIN' STR($6)
` SOF_TKN_SCHED_CORE' STR($4)
` SOF_TKN_SCHED_FRAMES' "0"
` SOF_TKN_SCHED_TIME_DOMAIN' STR($5)
` }'
`}'
`SectionData."'N_PIPELINE($1)`_data" {'
Expand All @@ -31,54 +31,58 @@ define(`W_PIPELINE',
` stream_name "'$1`"'
` data ['
` "'N_PIPELINE($1)`_data"'
` "'$7`"'
` "'$6`"'
` ]'
`}')

dnl PIPELINE_PCM_ADD(pipeline,
dnl pipe id, pcm, max channels, format,
dnl frames, period, priority, core,
dnl period, priority, core,
dnl pcm_min_rate, pcm_max_rate, pipeline_rate,
dnl time_domain, sched_comp)
define(`PIPELINE_PCM_ADD',
`ifelse(eval(`$# > 8'), `1',
`ifelse(eval(`$# > 10'), `1',
`undefine(`PCM_ID')'
`undefine(`PIPELINE_ID')'
`undefine(`PIPELINE_CHANNELS')'
`undefine(`PIPELINE_FORMAT')'
`undefine(`SCHEDULE_FRAMES')'
`undefine(`SCHEDULE_PERIOD')'
`undefine(`SCHEDULE_PRIORITY')'
`undefine(`SCHEDULE_CORE')'
`undefine(`PCM_MIN_RATE')'
`undefine(`PCM_MAX_RATE')'
`undefine(`PIPELINE_RATE')'
`undefine(`SCHEDULE_TIME_DOMAIN')'
`undefine(`SCHED_COMP')'
`define(`PIPELINE_ID', $2)'
`define(`PCM_ID', $3)'
`define(`PIPELINE_CHANNELS', $4)'
`define(`PIPELINE_FORMAT', $5)'
`define(`SCHEDULE_FRAMES', $6)'
`define(`SCHEDULE_PERIOD', $7)'
`define(`SCHEDULE_PRIORITY', $8)'
`define(`SCHEDULE_CORE', $9)'
`define(`SCHEDULE_TIME_DOMAIN', $10)'
`define(`SCHEDULE_PERIOD', $6)'
`define(`SCHEDULE_PRIORITY', $7)'
`define(`SCHEDULE_CORE', $8)'
`define(`PCM_MIN_RATE', $9)'
`define(`PCM_MAX_RATE', $10)'
`define(`PIPELINE_RATE', $11)'
`define(`SCHEDULE_TIME_DOMAIN', $12)'
`define(`DAI_FORMAT', $5)'
`define(`SCHED_COMP', $11)'
`define(`SCHED_COMP', $13)'
`include($1)'
`DEBUG_PCM_ADD($1, $3)'
,`fatal_error(`Invalid parameters ($#) to PIPELINE_PCM_ADD')')'
)

dnl PIPELINE_PCM_DAI_ADD(pipeline,
dnl pipe id, pcm, max channels, format,
dnl frames, period, priority, core,
dnl period, priority, core,
dnl dai type, dai_index, dai format,
dnl periods, time_domain)
define(`PIPELINE_PCM_DAI_ADD',
`ifelse(`$#', `13',
`ifelse(`$#', `15',
`undefine(`PCM_ID')'
`undefine(`PIPELINE_ID')'
`undefine(`PIPELINE_CHANNELS')'
`undefine(`PIPELINE_FORMAT')'
`undefine(`SCHEDULE_FRAMES')'
`undefine(`SCHEDULE_PERIOD')'
`undefine(`SCHEDULE_PRIORITY')'
`undefine(`SCHEDULE_CORE')'
Expand All @@ -87,47 +91,57 @@ define(`PIPELINE_PCM_DAI_ADD',
`undefine(`DAI_INDEX')'
`undefine(`DAI_FORMAT')'
`undefine(`DAI_PERIODS')'
`undefine(`PCM_MIN_RATE')'
`undefine(`PCM_MAX_RATE')'
`undefine(`PIPELINE_RATE')'
`define(`PIPELINE_ID', $2)'
`define(`PCM_ID', $3)'
`define(`PIPELINE_CHANNELS', $4)'
`define(`PIPELINE_FORMAT', $5)'
`define(`SCHEDULE_FRAMES', $6)'
`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)'
`define(`DAI_PERIODS', $13)'
`define(`DAI_NAME', $10$11)'
`define(`SCHEDULE_PERIOD', $6)'
`define(`SCHEDULE_PRIORITY', $7)'
`define(`SCHEDULE_CORE', $8)'
`define(`SCHEDULE_TIME_DOMAIN', $16)'
`define(`DAI_TYPE', STR($9))'
`define(`DAI_INDEX', STR($10))'
`define(`DAI_FORMAT', $11)'
`define(`DAI_PERIODS', $12)'
`define(`DAI_NAME', $9$10)'
`define(`PCM_MIN_RATE', $13)'
`define(`PCM_MAX_RATE', $14)'
`define(`PIPELINE_RATE', $15)'
`include($1)'
,`fatal_error(`Invalid parameters ($#) to PIPELINE_PCM_DAI_ADD')')'
)

dnl PIPELINE_ADD(pipeline,
dnl pipe id, max channels, format,
dnl frames, period, priority, core,
dnl sched_comp, time_domain)
dnl period, priority, core,
dnl sched_comp, time_domain,
dnl pcm_min_rate, pcm_max_rate, pipeline_rate)
define(`PIPELINE_ADD',
`ifelse(`$#', `9',
`ifelse(`$#', `12',
`undefine(`PIPELINE_ID')'
`undefine(`PIPELINE_CHANNELS')'
`undefine(`PIPELINE_FORMAT')'
`undefine(`SCHEDULE_FRAMES')'
`undefine(`SCHEDULE_PERIOD')'
`undefine(`SCHEDULE_PRIORITY')'
`undefine(`SCHEDULE_CORE')'
`undefine(`SCHEDULE_TIME_DOMAIN')'
`undefine(`PCM_MIN_RATE')'
`undefine(`PCM_MAX_RATE')'
`undefine(`PIPELINE_RATE')'
`define(`PIPELINE_ID', $2)'
`define(`PIPELINE_CHANNELS', $3)'
`define(`PIPELINE_FORMAT', $4)'
`define(`SCHEDULE_FRAMES', $5)'
`define(`SCHEDULE_PERIOD', $6)'
`define(`SCHEDULE_PRIORITY', $7)'
`define(`SCHEDULE_CORE', $8)'
`define(`SCHEDULE_TIME_DOMAIN', $10)'
`define(`SCHED_COMP', $9)'
`define(`SCHEDULE_PERIOD', $5)'
`define(`SCHEDULE_PRIORITY', $6)'
`define(`SCHEDULE_CORE', $7)'
`define(`SCHEDULE_TIME_DOMAIN', $9)'
`define(`SCHED_COMP', $8)'
`define(`PCM_MIN_RATE', $10)'
`define(`PCM_MAX_RATE', $11)'
`define(`PIPELINE_RATE', $12)'
`include($1)'
,`fatal_error(`Invalid parameters ($#) to PIPELINE_ADD')')'
)
Expand Down
21 changes: 11 additions & 10 deletions tools/topology/platform/intel/intel-generic-dmic.m4
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,21 @@ define(DMIC_DAI_LINK_16k_ID, `7')

dnl PIPELINE_PCM_ADD(pipeline,
dnl pipe id, pcm, max channels, format,
dnl frames, deadline, priority, core)
dnl period, priority, core,
dnl pcm_min_rate, pcm_max_rate, pipeline_rate,
dnl time_domain, sched_comp)

# Passthrough capture pipeline using max channels defined by CHANNELS.
# Schedule 48 frames per 1000us deadline on core 0 with priority 0
# Set 1000us deadline on core 0 with priority 0
PIPELINE_PCM_ADD(sof/pipe-volume-capture.m4,
DMIC_PIPELINE_48k_ID, DMIC_DAI_LINK_48k_ID, CHANNELS, s32le,
48, 1000, 0, 0)
1000, 0, 0, 48000, 48000, 48000)

# Passthrough capture pipeline using max channels defined by CHANNELS.
# Schedule 16 frames per 1000us deadline on core 0 with priority 0
# Schedule with 1000us deadline on core 0 with priority 0
PIPELINE_PCM_ADD(sof/pipe-volume-capture-16khz.m4,
DMIC_PIPELINE_16k_ID, DMIC_DAI_LINK_16k_ID, CHANNELS, s32le,
16, 1000, 0, 0)
1000, 0, 0, 16000, 16000, 16000)

#
# DAIs configuration
Expand All @@ -35,22 +37,21 @@ PIPELINE_PCM_ADD(sof/pipe-volume-capture-16khz.m4,
dnl DAI_ADD(pipeline,
dnl pipe id, dai type, dai_index, dai_be,
dnl buffer, periods, format,
dnl frames, deadline, priority, core)
dnl deadline, priority, core)

# capture DAI is DMIC 0 using 2 periods
# Buffers use s32le format, with 48 frame per 1000us on core 0 with priority 0
# Buffers use s32le format, 1000us deadline on core 0 with priority 0
DAI_ADD(sof/pipe-dai-capture.m4,
DMIC_PIPELINE_48k_ID, DMIC, 0, dmic01,
concat(`PIPELINE_SINK_', DMIC_PIPELINE_48k_ID), 2, s32le,
48, 1000, 0, 0)
1000, 0, 0, 48000, 48000, 48000)

# capture DAI is DMIC 1 using 2 periods
# Buffers use s32le format, with 16 frame per 1000us on core 0 with priority 0
DAI_ADD(sof/pipe-dai-capture.m4,
DMIC_PIPELINE_16k_ID, DMIC, 1, dmic16k,
concat(`PIPELINE_SINK_', DMIC_PIPELINE_16k_ID), 2, s32le,
16, 1000, 0, 0)

1000, 0, 0, 16000, 16000, 16000)

dnl PCM_DUPLEX_ADD(name, pcm_id, playback, capture)
dnl PCM_CAPTURE_ADD(name, pipeline, capture)
Expand Down
Loading

0 comments on commit 77b6db8

Please sign in to comment.