Skip to content

Commit 9cdef9f

Browse files
iganakovmwasko
authored andcommitted
copier: dmic: enable gain for dmic dai
Enable gain for DMIC interface. Configure gain feature with parameters received in DMIC BLOB. Add support for runtime DMIC gain parameters update using DMA Control IPC. Signed-off-by: Ievgen Ganakov <ievgen.ganakov@intel.com>
1 parent 8dda5ac commit 9cdef9f

File tree

6 files changed

+73
-6
lines changed

6 files changed

+73
-6
lines changed

src/audio/base_fw.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ static int basefw_dma_control(bool first_block,
588588
}
589589

590590
dma_control = (struct ipc4_dma_control *)data;
591-
data_size = data_offset - (sizeof(struct ipc4_dma_control) - sizeof(uint32_t));
591+
data_size = data_offset - sizeof(struct ipc4_dma_control);
592592

593593
if (data_size < (dma_control->config_length * sizeof(uint32_t))) {
594594
tr_err(&ipc_tr, "DMA Control data too short: got %u, expected %u",

src/audio/base_fw_intel.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <rtos/string.h>
1010
#include <sof/tlv.h>
1111
#include <sof/lib/dai.h>
12+
#include <ipc/dai.h>
1213

1314
#if defined(CONFIG_SOC_SERIES_INTEL_ADSP_ACE)
1415
#include <intel_adsp_hda.h>
@@ -24,6 +25,7 @@
2425

2526
#include <ipc4/base_fw.h>
2627
#include <rimage/sof/user/manifest.h>
28+
#include "copier/copier_gain.h"
2729

2830
struct ipc4_modules_info {
2931
uint32_t modules_count;
@@ -353,7 +355,18 @@ int basefw_vendor_dma_control(uint32_t node_id, const char *config_data, size_t
353355

354356
tr_info(&basefw_comp_tr, "node_id 0x%x, config_data 0x%x, data_size %u",
355357
node_id, (uint32_t)config_data, data_size);
358+
356359
switch (node.f.dma_type) {
360+
case ipc4_dmic_link_input_class:
361+
/* In DMIC case we don't need to update zephyr dai params */
362+
ret = copier_gain_dma_control(node, config_data, data_size,
363+
SOF_DAI_INTEL_DMIC);
364+
if (ret) {
365+
tr_err(&basefw_comp_tr,
366+
"Failed to update copier gain coefs, error: %d", ret);
367+
return IPC4_INVALID_REQUEST;
368+
}
369+
return IPC4_SUCCESS;
357370
case ipc4_i2s_link_output_class:
358371
case ipc4_i2s_link_input_class:
359372
type = DAI_INTEL_SSP;

src/audio/copier/copier_dai.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,9 @@ int copier_dai_create(struct comp_dev *dev, struct copier_data *cd,
322322
return -EINVAL;
323323
}
324324
dai.out_fmt = &copier->out_fmt;
325+
#if CONFIG_COPIER_GAIN
326+
dai.apply_gain = true;
327+
#endif
325328
break;
326329
default:
327330
return -EINVAL;

src/audio/copier/copier_gain.c

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#include <ipc4/base-config.h>
99
#include <sof/audio/component_ext.h>
1010
#include <module/module/base.h>
11+
#include <sof/tlv.h>
12+
#include <ipc4/dmic.h>
1113
#include "copier.h"
1214
#include "copier_gain.h"
1315

@@ -26,6 +28,31 @@ int copier_gain_set_params(struct comp_dev *dev, struct dai_data *dd)
2628
/* Set basic gain parameters */
2729
copier_gain_set_basic_params(dev, dd, ipc4_cfg);
2830

31+
switch (dd->dai->type) {
32+
case SOF_DAI_INTEL_DMIC:
33+
{
34+
struct dmic_config_data *dmic_cfg = cd->gtw_cfg;
35+
36+
if (!dmic_cfg) {
37+
comp_err(dev, "No dmic config found");
38+
return -EINVAL;
39+
}
40+
41+
union dmic_global_cfg *dmic_glb_cfg = &dmic_cfg->dmic_blob.global_cfg;
42+
43+
/* Get fade period from DMIC blob */
44+
fade_period = dmic_glb_cfg->ext_global_cfg.fade_in_period;
45+
/* Convert and assign silence and fade length values */
46+
dd->gain_data->silence_sg_length =
47+
frames * dmic_glb_cfg->ext_global_cfg.silence_period;
48+
dd->gain_data->fade_sg_length = frames * fade_period;
49+
}
50+
break;
51+
default:
52+
comp_info(dev, "Apply default fade period for dai type %d", dd->dai->type);
53+
break;
54+
}
55+
2956
/* Set fade parameters */
3057
ret = copier_gain_set_fade_params(dev, dd, ipc4_cfg, fade_period, frames);
3158
if (ret)
@@ -73,18 +100,19 @@ enum copier_gain_state copier_gain_eval_state(struct copier_gain_params *gain_pa
73100
return state;
74101
}
75102

76-
int copier_gain_dma_control(uint32_t node_id, const uint32_t *config_data,
103+
int copier_gain_dma_control(union ipc4_connector_node_id node, const char *config_data,
77104
size_t config_size, enum sof_ipc_dai_type dai_type)
78105
{
106+
struct sof_tlv *tlv = (struct sof_tlv *)config_data;
79107
struct ipc *ipc = ipc_get();
80108
struct ipc_comp_dev *icd;
81109
struct comp_dev *dev;
82110
struct list_item *clist;
83-
84111
int ret;
85112

86113
list_for_item(clist, &ipc->comp_list) {
87114
struct gain_dma_control_data *gain_data = NULL;
115+
void *tlv_val = NULL;
88116

89117
icd = container_of(clist, struct ipc_comp_dev, list);
90118

@@ -99,6 +127,29 @@ int copier_gain_dma_control(uint32_t node_id, const uint32_t *config_data,
99127
struct processing_module *mod = comp_mod(dev);
100128
struct copier_data *cd = module_get_private_data(mod);
101129

130+
switch (dai_type) {
131+
case SOF_DAI_INTEL_DMIC:
132+
if (cd->dd[0]->dai->index != node.f.v_index)
133+
continue;
134+
135+
if (!config_size) {
136+
comp_err(dev, "Config length for DMIC couldn't be zero");
137+
return -EINVAL;
138+
}
139+
140+
/* Gain coefficients for DMIC */
141+
tlv_val = tlv_value_ptr_get(tlv, DMIC_SET_GAIN_COEFFICIENTS);
142+
if (!tlv_val) {
143+
comp_err(dev, "No gain coefficients in DMA_CONTROL ipc");
144+
return -EINVAL;
145+
}
146+
gain_data = tlv_val;
147+
break;
148+
default:
149+
comp_warn(dev, "Gain DMA control: no dai type=%d found", dai_type);
150+
break;
151+
}
152+
102153
ret = copier_set_gain(dev, cd->dd[0], gain_data);
103154
if (ret)
104155
comp_err(dev, "Gain DMA control: failed to set gain");

src/audio/copier/copier_gain.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,13 +230,13 @@ bool copier_is_unity_gain(struct copier_gain_params *gain_params);
230230
* This function retrieves gain data from the DMA Control IPC message and updates
231231
* corresponding dai device gain params structure.
232232
*
233-
* @param node_id Gateway node id.
233+
* @param node Gateway node id.
234234
* @param config_data The gain configuration data.
235235
* @param config_size The size of the gain configuration data.
236236
* @param dai_type The type of the DAI device.
237237
* @return 0 on success, otherwise a negative error code.
238238
*/
239-
int copier_gain_dma_control(uint32_t node_id, const uint32_t *config_data,
239+
int copier_gain_dma_control(union ipc4_connector_node_id node, const char *config_data,
240240
size_t config_size, enum sof_ipc_dai_type dai_type);
241241

242242
#endif /* __SOF_COPIER_GAIN_H__ */

src/include/ipc4/base_fw.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ struct ipc4_astate_table {
485485
struct ipc4_dma_control {
486486
uint32_t node_id;
487487
uint32_t config_length;
488-
uint32_t config_data[1];
488+
uint32_t config_data[0];
489489
} __attribute__((packed, aligned(4)));
490490

491491
enum ipc4_perf_measurements_state_set {

0 commit comments

Comments
 (0)