Skip to content

Commit f4dfeef

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 62c713e commit f4dfeef

7 files changed

Lines changed: 66 additions & 15 deletions

File tree

app/boards/acp_7_0_adsp.conf

Lines changed: 2 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

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: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -178,21 +178,36 @@ int ipc_dai_data_config(struct dai_data *dd, struct comp_dev *dev)
178178
case SOF_DAI_IMX_ESAI:
179179
dd->config.burst_elems = dai_get_fifo_depth(dd->dai, dai->direction);
180180
break;
181-
case SOF_DAI_AMD_BT:
182-
dev->ipc_config.frame_fmt = SOF_IPC_FRAME_S16_LE;
183-
break;
184-
case SOF_DAI_AMD_SP:
185-
case SOF_DAI_AMD_SP_VIRTUAL:
186-
dev->ipc_config.frame_fmt = SOF_IPC_FRAME_S16_LE;
187-
break;
188181
case SOF_DAI_AMD_DMIC:
189182
dev->ipc_config.frame_fmt = SOF_IPC_FRAME_S32_LE;
190183
if (dd->dma_buffer)
191184
audio_stream_set_frm_fmt(&dd->dma_buffer->stream,
192185
dev->ipc_config.frame_fmt);
193186
break;
187+
case SOF_DAI_AMD_BT:
188+
case SOF_DAI_AMD_SP:
189+
case SOF_DAI_AMD_SP_VIRTUAL:
194190
case SOF_DAI_AMD_HS:
195191
case SOF_DAI_AMD_HS_VIRTUAL:
192+
#if defined(CONFIG_AMD) && !defined(CONFIG_SOC_ACP_6_0)
193+
{
194+
struct acp_dma_dev_data *tdm_data = dd->dma->z_dev->data;
195+
struct tdm_context *tdm_ctx;
196+
197+
/* Allocate coherent memory for TDM context shared between
198+
* IPC and DMA contexts.
199+
*/
200+
if (!tdm_data->dai_index_ptr) {
201+
tdm_ctx = rzalloc(SOF_MEM_FLAG_USER | SOF_MEM_FLAG_COHERENT,
202+
sizeof(*tdm_ctx));
203+
tdm_data->dai_index_ptr = tdm_ctx;
204+
} else {
205+
tdm_ctx = (struct tdm_context *)tdm_data->dai_index_ptr;
206+
}
207+
tdm_ctx->index = dd->dai->index;
208+
}
209+
#endif
210+
break;
196211
case SOF_DAI_AMD_SDW:
197212
#if defined(CONFIG_AMD) && !defined(CONFIG_SOC_ACP_6_0)
198213
{

src/lib/dai.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ const struct device *zephyr_dev[] = {
188188
#if CONFIG_DAI_AMD_SDW
189189
DT_FOREACH_STATUS_OKAY(amd_acp_sdw_dai, GET_DEVICE_LIST)
190190
#endif
191+
#if CONFIG_DAI_AMD_TDM
192+
DT_FOREACH_STATUS_OKAY(amd_tdm_dai, GET_DEVICE_LIST)
193+
#endif
191194
#if CONFIG_DAI_INTEL_UAOL
192195
DT_FOREACH_STATUS_OKAY(intel_uaol_dai, GET_DEVICE_LIST)
193196
#endif
@@ -219,21 +222,20 @@ static int sof_dai_type_to_zephyr(uint32_t type)
219222
return DAI_IMX_SAI;
220223
case SOF_DAI_IMX_ESAI:
221224
return DAI_IMX_ESAI;
222-
case SOF_DAI_AMD_BT:
223-
return DAI_AMD_BT;
224-
case SOF_DAI_AMD_SP:
225-
return DAI_AMD_SP;
226225
case SOF_DAI_AMD_DMIC:
227226
return DAI_AMD_DMIC;
228227
case SOF_DAI_MEDIATEK_AFE:
229228
return DAI_MEDIATEK_AFE;
230229
case SOF_DAI_IMX_MICFIL:
231230
return DAI_IMX_MICFIL;
232-
case SOF_DAI_AMD_HS:
233-
case SOF_DAI_AMD_SP_VIRTUAL:
234-
case SOF_DAI_AMD_HS_VIRTUAL:
235231
case SOF_DAI_AMD_SDW:
236232
return DAI_AMD_SDW;
233+
case SOF_DAI_AMD_HS:
234+
case SOF_DAI_AMD_HS_VIRTUAL:
235+
case SOF_DAI_AMD_SP:
236+
case SOF_DAI_AMD_SP_VIRTUAL:
237+
case SOF_DAI_AMD_BT:
238+
return DAI_AMD_TDM;
237239
default:
238240
return -EINVAL;
239241
}
@@ -301,6 +303,15 @@ static void dai_set_device_params(struct dai *d)
301303
d->dma_dev = SOF_DMA_DEV_SW;
302304
d->dma_caps = SOF_DMA_CAP_SW;
303305
break;
306+
/* All TDM-capable AMD DAIs share acp_tdm_dma. */
307+
case SOF_DAI_AMD_HS:
308+
case SOF_DAI_AMD_HS_VIRTUAL:
309+
case SOF_DAI_AMD_SP:
310+
case SOF_DAI_AMD_SP_VIRTUAL:
311+
case SOF_DAI_AMD_BT:
312+
d->dma_dev = SOF_DMA_DEV_HS | SOF_DMA_DEV_SP | SOF_DMA_DEV_BT;
313+
d->dma_caps = SOF_DMA_CAP_HS | SOF_DMA_CAP_SP | SOF_DMA_CAP_BT;
314+
break;
304315
default:
305316
break;
306317
}

zephyr/lib/dma.c

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

0 commit comments

Comments
 (0)