Skip to content

Commit ea6b086

Browse files
committed
tools: topology: add ACP 7.X TDM I2S topology support
Add TDM I2S topology templates for ACP 7.X: - platform/common/acp-tdm.m4: TDM DAI and pipeline macros - sof-acp_7_x_i2s.m4: default 16-bit TDM topology - sof-acp_7_x_i2s_24bit.m4: 24-bit TDM topology - dai.m4: add SOF_DAI_AMD_TDM token - tokens.m4: add acptdm format token - CMakeLists.txt: register new topology targets Signed-off-by: DineshKumar Kalva <DineshKumar.Kalva@amd.com> Signed-off-by: Sneha Voona <sneha.voona@amd.com>
1 parent fca7c84 commit ea6b086

6 files changed

Lines changed: 430 additions & 1 deletion

File tree

tools/topology/topology1/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ set(TPLGS
123123
"sof-acp_7_0\;sof-acp_7_0"
124124
"sof-acp_7_0_sdw\;sof-acp_7_0-rt722-l0"
125125
"sof-acp_7_x_sdw\;sof-acp7x-rt721-l0"
126+
"sof-acp_7_x_i2s\;sof-acp7x"
127+
"sof-acp_7_x_i2s_24bit\;sof-acp7x-24bit"
126128
)
127129

128130
# This empty 'production/' source subdirectory exists only to create the

tools/topology/topology1/m4/dai.m4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ define(`DO_DAI_CONFIG',
155155
`'
156156
` id "'$3`"'
157157
`'
158-
` ifelse($1, `SSP', $5, $1, `HDA', $5, $1, `ALH', $5, $1, `ESAI', $5, $1, `SAI', $5, $1, `MICFIL', $5, $1, `AFE', $5, $1, `ACP', $5, $1, `ACPSP', $5, $1,`ACPSP_VIRTUAL', $5, $1, `ACPHS', $5, $1, `ACPHS_VIRTUAL', $5, $1, `ACP_SDW', $5, $1, `ACPDMIC', $5, `}')'
158+
` ifelse($1, `SSP', $5, $1, `HDA', $5, $1, `ALH', $5, $1, `ESAI', $5, $1, `SAI', $5, $1, `MICFIL', $5, $1, `AFE', $5, $1, `ACP', $5, $1, `ACPSP', $5, $1,`ACPSP_VIRTUAL', $5, $1, `ACPHS', $5, $1, `ACPHS_VIRTUAL', $5, $1, `ACP_SDW', $5, $1, `ACPDMIC', $5, $1, `ACPTDM', $5, `}')'
159159
`ifelse($1, `DMIC', $5, `')'
160160
`SectionVendorTuples."'N_DAI_CONFIG($1$2)`_tuples_common" {'
161161
` tokens "sof_dai_tokens"'
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
divert(-1)
2+
3+
dnl ACPTDM related macros
4+
5+
dnl ACP_CLOCK(clock, freq, codec_provider, polarity)
6+
dnl polarity is optional
7+
define(`ACP_CLOCK',
8+
$1 STR($3)
9+
$1_freq STR($2))
10+
`ifelse($4, `inverted', `$1_invert "true"',`')')
11+
12+
dnl ACP_TDM(slots, width, tx_mask, rx_mask)
13+
define(`ACP_TDM',
14+
` tdm_slots 'STR($1)
15+
` tdm_slot_width 'STR($2)
16+
` tx_slots 'STR($3)
17+
` rx_slots 'STR($4)
18+
)
19+
20+
dnl ACP_CONFIG(format, mclk, bclk, fsync, tdm, esai_config_data)
21+
define(`ACPTDM_CONFIG',
22+
` format "'$1`"'
23+
` '$2
24+
` '$3
25+
` '$4
26+
` '$5
27+
`}'
28+
$6
29+
)
30+
31+
dnl ACPTDM_VIRTUAL_CONFIG(format, mclk, bclk, fsync, tdm, esai_config_data)
32+
define(`ACPTDM_VIRTUAL_CONFIG',
33+
` format "'$1`"'
34+
` '$2
35+
` '$3
36+
` '$4
37+
` '$5
38+
`}'
39+
$6
40+
)
41+
42+
dnl ACPTDM_CONFIG_DATA(type, idx, rate, channel,i2s_tdm_mode)
43+
#i2s_tdm_mode 1-> tdm mode, 0->i2s mode
44+
define(`ACPTDM_CONFIG_DATA',
45+
`SectionVendorTuples."'N_DAI_CONFIG($1$2)`_tuples" {'
46+
` tokens "sof_acp_tokens"'
47+
` tuples."word" {'
48+
` SOF_TKN_AMD_ACP_RATE' STR($3)
49+
` SOF_TKN_AMD_ACP_CH' STR($4)
50+
` SOF_TKN_AMD_ACP_I2S_TDM_MODE' STR($5)
51+
` SOF_TKN_AMD_ACP_I2S_BITDEPTH' STR($6)
52+
` }'
53+
`}'
54+
`SectionData."'N_DAI_CONFIG($1$2)`_data" {'
55+
` tuples "'N_DAI_CONFIG($1$2)`_tuples"'
56+
`}'
57+
)
58+
59+
dnl ACPTDM_VIRTUAL_CONFIG_DATA(type, idx, rate, channel,i2s_tdm_mode)
60+
#i2s_tdm_mode 1-> tdm mode, 0->i2s mode
61+
define(`ACPTDM_VIRTUAL_CONFIG_DATA',
62+
`SectionVendorTuples."'N_DAI_CONFIG($1$2)`_tuples" {'
63+
` tokens "sof_acp_tokens"'
64+
` tuples."word" {'
65+
` SOF_TKN_AMD_ACP_RATE' STR($3)
66+
` SOF_TKN_AMD_ACP_CH' STR($4)
67+
` SOF_TKN_AMD_ACP_I2S_TDM_MODE' STR($5)
68+
` }'
69+
`}'
70+
`SectionData."'N_DAI_CONFIG($1$2)`_data" {'
71+
` tuples "'N_DAI_CONFIG($1$2)`_tuples"'
72+
`}'
73+
)
74+
divert(0)dnl
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
#
2+
# Topology for ACP_7_X with TDM.
3+
#
4+
# Include topology builder
5+
include(`utils.m4')
6+
include(`dai.m4')
7+
include(`pipeline.m4')
8+
include(`acp-tdm.m4')
9+
10+
# Include TLV library
11+
include(`common/tlv.m4')
12+
13+
# Include Token library
14+
include(`sof/tokens.m4')
15+
16+
# Include ACP DSP configuration
17+
include(`platform/amd/acp.m4')
18+
19+
#
20+
# Pipeline Graph (16-bit / s16le):
21+
#
22+
# PLAYBACK:
23+
# [Host PCM ] -> [Passthrough Pipeline ] -> [ACPTDM DAI ]
24+
# s16le 2ch s16le 48kHz s16le 2ch
25+
# |
26+
# [acp-i2s0-codec]
27+
# I2S bclk=3.072MHz
28+
# fsync=48kHz, 2ch
29+
# |
30+
# CAPTURE:
31+
# [ACPTDM DAI ] -> [Passthrough Pipeline ] -> [Host PCM ]
32+
# s16le 2ch s16le 48kHz s16le 2ch
33+
#
34+
35+
DEBUG_START
36+
#======================================================================
37+
# Playback pipeline 1 on PCM 0 using max 2 channels of s16le.
38+
39+
dnl PIPELINE_PCM_ADD(pipeline,
40+
dnl pipe id, pcm, max channels, format,
41+
dnl period, priority, core,
42+
dnl pcm_min_rate, pcm_max_rate, pipeline_rate)
43+
# Playback pipeline 0 on PCM 0, dai index 0, link id 0 using max 2 channels of s16le.
44+
45+
# Schedule 96 frames per 2000us deadline on core 0 with priority 0
46+
PIPELINE_PCM_ADD(sof/pipe-passthrough-playback.m4,
47+
0, 0, 2, s16le,
48+
2000, 0, 0,
49+
48000, 48000, 48000)
50+
51+
# Capture pipeline 3 on PCM 0, dai index 0 using max 2 channels of s16le.
52+
PIPELINE_PCM_ADD(sof/pipe-passthrough-capture.m4,
53+
3, 0, 2, s16le,
54+
2000, 0, 0,
55+
48000, 48000, 48000)
56+
#===========================================================================
57+
dnl DAI_ADD(pipeline,
58+
dnl pipe id, dai type, dai_index, dai_be,
59+
dnl buffer, periods, format,
60+
dnl deadline, priority, core, time_domain)
61+
62+
# Schedule 96 frames per 2000us deadline on core 0 with priority 0
63+
64+
# playback DAI is ACPTDM using 2 periods
65+
DAI_ADD(sof/pipe-dai-playback.m4,
66+
0, ACPTDM, 0, acp-i2s0-codec,
67+
PIPELINE_SOURCE_0, 2, s16le,
68+
2000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)
69+
70+
# Capture DAI is ACPTDM using 2 periods
71+
DAI_ADD(sof/pipe-dai-capture.m4,
72+
3, ACPTDM, 0, acp-i2s0-codec,
73+
PIPELINE_SINK_3, 2, s16le,
74+
2000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)
75+
#===========================================================================
76+
# playback DAI is ACPTDM using 2 periods
77+
78+
dnl DAI_CONFIG(type, dai_index, link_id, name, ACPTDM_config/acpdmic_config)
79+
dnl ACPTDM_CONFIG(format, mclk, bclk, fsync, tdm, ACPTDM_config_data)
80+
dnl ACP_CLOCK(clock, freq, codec_provider, polarity)
81+
dnl ACPTDM_CONFIG_DATA(type, idx, valid bits, mclk_id)
82+
dnl mclk_id is optional
83+
84+
DAI_CONFIG(ACPTDM, 0, 0, acp-i2s0-codec,
85+
ACPTDM_CONFIG(I2S, ACP_CLOCK(mclk, 49152000, codec_mclk_in),
86+
ACP_CLOCK(bclk, 3072000, codec_consumer),
87+
ACP_CLOCK(fsync, 48000, codec_consumer),
88+
ACP_TDM(2, 32, 3, 3),ACPTDM_CONFIG_DATA(ACPTDM, 0, 48000, 2, 0, 0))
89+
)
90+
dnl PCM_DUPLEX_ADD(name, pcm_id, playback_pipeline, capture_pipeline)
91+
PCM_DUPLEX_ADD(I2STDM0, 0, PIPELINE_PCM_0, PIPELINE_PCM_3)
92+
93+
#====================================================================================================================
94+
# TDM instance 1
95+
96+
dnl PIPELINE_PCM_ADD(pipeline,
97+
dnl pipe id, pcm, max channels, format,
98+
dnl period, priority, core,
99+
dnl pcm_min_rate, pcm_max_rate, pipeline_rate)
100+
101+
PIPELINE_PCM_ADD(sof/pipe-passthrough-playback.m4,
102+
1, 1, 2, s16le,
103+
2000, 0, 0,
104+
48000, 48000, 48000)
105+
PIPELINE_PCM_ADD(sof/pipe-passthrough-capture.m4,
106+
4, 1, 2, s16le,
107+
2000, 0, 0,
108+
48000, 48000, 48000)
109+
110+
dnl DAI_ADD(pipeline,
111+
dnl pipe id, dai type, dai_index, dai_be,
112+
dnl buffer, periods, format,
113+
dnl deadline, priority, core, time_domain)
114+
115+
DAI_ADD(sof/pipe-dai-playback.m4,
116+
1, ACPTDM, 1, acp-i2s1-codec,
117+
PIPELINE_SOURCE_1, 2, s16le,
118+
2000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)
119+
120+
DAI_ADD(sof/pipe-dai-capture.m4,
121+
4, ACPTDM, 1, acp-i2s1-codec,
122+
PIPELINE_SINK_4, 2, s16le,
123+
2000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)
124+
dnl DAI_CONFIG(type, dai_index, link_id, name, ACPTDM_config/acpdmic_config)
125+
dnl ACPTDM_CONFIG(format, mclk, bclk, fsync, tdm, ACPTDM_config_data)
126+
dnl ACP_CLOCK(clock, freq, codec_provider, polarity)
127+
dnl ACPTDM_CONFIG_DATA(type, idx, valid bits, mclk_id)
128+
dnl mclk_id is optional
129+
130+
DAI_CONFIG(ACPTDM, 1, 1, acp-i2s1-codec,
131+
ACPTDM_CONFIG(I2S, ACP_CLOCK(mclk, 49152000, codec_mclk_in),
132+
ACP_CLOCK(bclk, 3072000, codec_consumer),
133+
ACP_CLOCK(fsync, 48000, codec_consumer),
134+
ACP_TDM(2, 32, 3, 3), ACPTDM_CONFIG_DATA(ACPTDM, 1, 48000, 2, 0)))
135+
136+
dnl PCM_DUPLEX_ADD(name, pcm_id, playback_pipeline, capture_pipeline)
137+
PCM_DUPLEX_ADD(I2STDM1, 1, PIPELINE_PCM_1, PIPELINE_PCM_4)
138+
139+
#====================================================================================================================
140+
# TDM instance 2
141+
142+
dnl PIPELINE_PCM_ADD(pipeline,
143+
dnl pipe id, pcm, max channels, format,
144+
dnl period, priority, core,
145+
dnl pcm_min_rate, pcm_max_rate, pipeline_rate)
146+
147+
PIPELINE_PCM_ADD(sof/pipe-passthrough-playback.m4,
148+
2, 2, 2, s16le,
149+
2000, 0, 0,
150+
48000, 48000, 48000)
151+
PIPELINE_PCM_ADD(sof/pipe-passthrough-capture.m4,
152+
5, 2, 2, s16le,
153+
2000, 0, 0,
154+
48000, 48000, 48000)
155+
156+
dnl DAI_ADD(pipeline,
157+
dnl pipe id, dai type, dai_index, dai_be,
158+
dnl buffer, periods, format,
159+
dnl deadline, priority, core, time_domain)
160+
161+
DAI_ADD(sof/pipe-dai-playback.m4,
162+
2, ACPTDM, 2, acp-i2s2-codec,
163+
PIPELINE_SOURCE_2, 2, s16le,
164+
2000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)
165+
166+
DAI_ADD(sof/pipe-dai-capture.m4,
167+
5, ACPTDM, 2, acp-i2s2-codec,
168+
PIPELINE_SINK_5, 2, s16le,
169+
2000, 0, 0, SCHEDULE_TIME_DOMAIN_TIMER)
170+
171+
dnl DAI_CONFIG(type, dai_index, link_id, name, ACPTDM_config/acpdmic_config)
172+
dnl ACPTDM_CONFIG(format, mclk, bclk, fsync, tdm, ACPTDM_config_data)
173+
dnl ACP_CLOCK(clock, freq, codec_provider, polarity)
174+
dnl ACPTDM_CONFIG_DATA(type, idx, valid bits, mclk_id)
175+
dnl mclk_id is optional
176+
177+
DAI_CONFIG(ACPTDM, 2, 2, acp-i2s2-codec,
178+
ACPTDM_CONFIG(I2S, ACP_CLOCK(mclk, 49152000, codec_mclk_in),
179+
ACP_CLOCK(bclk, 3072000, codec_consumer),
180+
ACP_CLOCK(fsync, 48000, codec_consumer),
181+
ACP_TDM(2, 32, 3, 3), ACPTDM_CONFIG_DATA(ACPTDM, 2, 48000, 2, 0)))
182+
183+
dnl PCM_DUPLEX_ADD(name, pcm_id, playback_pipeline, capture_pipeline)
184+
PCM_DUPLEX_ADD(I2STDM2, 2, PIPELINE_PCM_2, PIPELINE_PCM_5)
185+
#====================================================================================================================
186+
187+
DEBUG_END

0 commit comments

Comments
 (0)