Skip to content

Commit 70a6443

Browse files
acp: add TDM DAI and DMA support for ACP 7.0
Add TDM DAI and DMA support for the AMD ACP 7.0 platform with three instances: HS, SP, and BT. Signed-off-by: Siva Subramanian Ravi Saravanan <sravisar@amd.com>
1 parent 0f9fa75 commit 70a6443

7 files changed

Lines changed: 69 additions & 15 deletions

File tree

app/boards/acp_7_0_adsp.conf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ CONFIG_INTC_AMD_ACP=y
1414
CONFIG_DMA_AMD_ACP_HOST=y
1515
CONFIG_DMA_AMD_ACP_SDW=y
1616
CONFIG_DAI_AMD_SDW=y
17+
CONFIG_DMA_AMD_ACP_TDM=y
18+
CONFIG_DAI_AMD_TDM=y
1719
CONFIG_AMS=n
1820
CONFIG_WRAP_ACTUAL_POSITION=y
1921
CONFIG_TRACE=n
@@ -50,3 +52,4 @@ CONFIG_ASRC_SUPPORT_CONVERSION_48000_TO_32000=n
5052
CONFIG_ASRC_SUPPORT_CONVERSION_48000_TO_44100=n
5153
CONFIG_CORE_COUNT=1
5254
CONFIG_FORMAT_CONVERT_HIFI3=n
55+
CONFIG_COMP_MFCC=n

src/audio/dai-zephyr.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,14 @@ __cold int dai_set_config(struct dai *dai, struct ipc_config_dai *common_config,
196196
cfg.type = DAI_AMD_SDW;
197197
cfg_params = &sof_cfg->acpsdw;
198198
break;
199+
case SOF_DAI_AMD_HS:
200+
case SOF_DAI_AMD_HS_VIRTUAL:
201+
case SOF_DAI_AMD_SP:
202+
case SOF_DAI_AMD_SP_VIRTUAL:
203+
case SOF_DAI_AMD_BT:
204+
cfg.type = DAI_AMD_TDM;
205+
cfg_params = &sof_cfg->acptdm;
206+
break;
199207
case SOF_DAI_INTEL_UAOL:
200208
cfg.type = DAI_INTEL_UAOL;
201209
cfg.channels = common_config->gtw_fmt->channels_count;

src/include/ipc/dai-amd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ struct sof_ipc_dai_acp_params {
2323
uint32_t reserved0;
2424
uint32_t fsync_rate;
2525
uint32_t tdm_slots;
26+
uint32_t tdm_mode;
2627
} __attribute__((packed, aligned(4)));
2728

2829
/* ACP Configuration Request - SOF_IPC_DAI_AMD_SDW_CONFIG */

src/include/ipc/dai.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ enum sof_ipc_dai_type {
9797
SOF_DAI_IMX_MICFIL, /**< i.MX MICFIL */
9898
SOF_DAI_AMD_SDW, /**< Amd SDW */
9999
SOF_DAI_INTEL_UAOL, /**< Intel UAOL */
100+
SOF_DAI_AMD_TDM /**< Amd TDM */
100101
};
101102

102103
#define SOF_DAI_CONFIG_HW_SPEC_OFFSET offsetof(struct sof_ipc_dai_config, ssp)
@@ -126,7 +127,7 @@ struct sof_ipc_dai_config {
126127
struct sof_ipc_dai_acp_params acpbt;
127128
struct sof_ipc_dai_acp_params acpsp;
128129
struct sof_ipc_dai_acpdmic_params acpdmic;
129-
struct sof_ipc_dai_acp_params acphs;
130+
struct sof_ipc_dai_acp_params acptdm;
130131
struct sof_ipc_dai_afe_params afe;
131132
struct sof_ipc_dai_micfil_params micfil;
132133
struct sof_ipc_dai_acp_sdw_params acpsdw;

src/ipc/ipc3/dai.c

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -184,21 +184,38 @@ int ipc_dai_data_config(struct dai_data *dd, struct comp_dev *dev)
184184
case SOF_DAI_IMX_ESAI:
185185
dd->config.burst_elems = dai_get_fifo_depth(dd->dai, dai->direction);
186186
break;
187-
case SOF_DAI_AMD_BT:
188-
dev->ipc_config.frame_fmt = SOF_IPC_FRAME_S16_LE;
189-
break;
190-
case SOF_DAI_AMD_SP:
191-
case SOF_DAI_AMD_SP_VIRTUAL:
192-
dev->ipc_config.frame_fmt = SOF_IPC_FRAME_S16_LE;
193-
break;
194187
case SOF_DAI_AMD_DMIC:
195188
dev->ipc_config.frame_fmt = SOF_IPC_FRAME_S32_LE;
196189
if (dd->dma_buffer)
197190
audio_stream_set_frm_fmt(&dd->dma_buffer->stream,
198191
dev->ipc_config.frame_fmt);
199192
break;
193+
case SOF_DAI_AMD_BT:
194+
case SOF_DAI_AMD_SP:
195+
case SOF_DAI_AMD_SP_VIRTUAL:
200196
case SOF_DAI_AMD_HS:
201197
case SOF_DAI_AMD_HS_VIRTUAL:
198+
#if defined(CONFIG_AMD) && !defined(CONFIG_SOC_ACP_6_0)
199+
{
200+
struct acp_dma_dev_data *tdm_data = dd->dma->z_dev->data;
201+
struct tdm_context *tdm_ctx;
202+
203+
/* Allocate coherent memory for TDM context shared between
204+
* IPC and DMA contexts.
205+
*/
206+
if (!tdm_data->dai_index_ptr) {
207+
tdm_ctx = rzalloc(SOF_MEM_FLAG_USER | SOF_MEM_FLAG_COHERENT,
208+
sizeof(*tdm_ctx));
209+
if (!tdm_ctx)
210+
return -ENOMEM;
211+
tdm_data->dai_index_ptr = tdm_ctx;
212+
} else {
213+
tdm_ctx = (struct tdm_context *)tdm_data->dai_index_ptr;
214+
}
215+
tdm_ctx->index = dd->dai->index;
216+
}
217+
#endif
218+
break;
202219
case SOF_DAI_AMD_SDW:
203220
#if defined(CONFIG_AMD) && !defined(CONFIG_SOC_ACP_6_0)
204221
{

src/lib/dai.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,9 @@ const struct device *zephyr_dev[] = {
189189
#if CONFIG_DAI_AMD_SDW
190190
DT_FOREACH_STATUS_OKAY(amd_acp_sdw_dai, GET_DEVICE_LIST)
191191
#endif
192+
#if CONFIG_DAI_AMD_TDM
193+
DT_FOREACH_STATUS_OKAY(amd_tdm_dai, GET_DEVICE_LIST)
194+
#endif
192195
#if CONFIG_DAI_INTEL_UAOL
193196
DT_FOREACH_STATUS_OKAY(intel_uaol_dai, GET_DEVICE_LIST)
194197
#endif
@@ -223,21 +226,20 @@ static int sof_dai_type_to_zephyr(uint32_t type)
223226
return DAI_IMX_SAI;
224227
case SOF_DAI_IMX_ESAI:
225228
return DAI_IMX_ESAI;
226-
case SOF_DAI_AMD_BT:
227-
return DAI_AMD_BT;
228-
case SOF_DAI_AMD_SP:
229-
return DAI_AMD_SP;
230229
case SOF_DAI_AMD_DMIC:
231230
return DAI_AMD_DMIC;
232231
case SOF_DAI_MEDIATEK_AFE:
233232
return DAI_MEDIATEK_AFE;
234233
case SOF_DAI_IMX_MICFIL:
235234
return DAI_IMX_MICFIL;
236-
case SOF_DAI_AMD_HS:
237-
case SOF_DAI_AMD_SP_VIRTUAL:
238-
case SOF_DAI_AMD_HS_VIRTUAL:
239235
case SOF_DAI_AMD_SDW:
240236
return DAI_AMD_SDW;
237+
case SOF_DAI_AMD_HS:
238+
case SOF_DAI_AMD_HS_VIRTUAL:
239+
case SOF_DAI_AMD_SP:
240+
case SOF_DAI_AMD_SP_VIRTUAL:
241+
case SOF_DAI_AMD_BT:
242+
return DAI_AMD_TDM;
241243
default:
242244
return -EINVAL;
243245
}
@@ -305,6 +307,15 @@ static void dai_set_device_params(struct dai *d)
305307
d->dma_dev = SOF_DMA_DEV_SW;
306308
d->dma_caps = SOF_DMA_CAP_SW;
307309
break;
310+
/* All TDM-capable AMD DAIs share acp_tdm_dma. */
311+
case SOF_DAI_AMD_HS:
312+
case SOF_DAI_AMD_HS_VIRTUAL:
313+
case SOF_DAI_AMD_SP:
314+
case SOF_DAI_AMD_SP_VIRTUAL:
315+
case SOF_DAI_AMD_BT:
316+
d->dma_dev = SOF_DMA_DEV_HS | SOF_DMA_DEV_SP | SOF_DMA_DEV_BT;
317+
d->dma_caps = SOF_DMA_CAP_HS | SOF_DMA_CAP_SP | SOF_DMA_CAP_BT;
318+
break;
308319
case SOF_DAI_MEDIATEK_AFE:
309320
d->dma_dev = SOF_DMA_DEV_AFE_MEMIF;
310321
break;

zephyr/lib/dma.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,19 @@ APP_SYSUSER_DATA SHARED_DATA struct sof_dma dma[] = {
239239
},
240240
.z_dev = DEVICE_DT_GET(DT_NODELABEL(acp_sdw_dma)),
241241
},
242+
{
243+
.plat_data = {
244+
.dir = SOF_DMA_DIR_MEM_TO_DEV |
245+
SOF_DMA_DIR_DEV_TO_MEM,
246+
.devs = SOF_DMA_DEV_HS | SOF_DMA_DEV_SP | SOF_DMA_DEV_BT,
247+
.caps = SOF_DMA_CAP_HS | SOF_DMA_CAP_SP | SOF_DMA_CAP_BT,
248+
.base = DMA0_BASE,
249+
.chan_size = DMA0_SIZE,
250+
.channels = 6,
251+
.period_count = 2,
252+
},
253+
.z_dev = DEVICE_DT_GET(DT_NODELABEL(acp_tdm_dma)),
254+
},
242255
#endif
243256
#if DT_HAS_COMPAT_STATUS_OKAY(mediatek_afe_memif_dma)
244257
{

0 commit comments

Comments
 (0)