From 21182926e37a7d1666f9c7e323cfb2c8437764e0 Mon Sep 17 00:00:00 2001 From: Baofeng Tian Date: Tue, 11 Jul 2023 16:56:54 +0800 Subject: [PATCH 01/12] copier: refine host creation refine host creation to remove redundant parameters and code. Signed-off-by: Baofeng Tian --- src/audio/copier/copier.c | 3 +-- src/audio/copier/copier_host.c | 5 +++-- src/include/sof/audio/host_copier.h | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/audio/copier/copier.c b/src/audio/copier/copier.c index 90d09298a528..6f7705d90d20 100644 --- a/src/audio/copier/copier.c +++ b/src/audio/copier/copier.c @@ -101,8 +101,7 @@ static int copier_init(struct processing_module *mod) switch (node_id.f.dma_type) { case ipc4_hda_host_output_class: case ipc4_hda_host_input_class: - ret = copier_host_create(dev, cd, &dev->ipc_config, - copier, cd->direction, ipc_pipe->pipeline); + ret = copier_host_create(dev, cd, copier, ipc_pipe->pipeline); if (ret < 0) { comp_err(dev, "unable to create host"); goto error; diff --git a/src/audio/copier/copier_host.c b/src/audio/copier/copier_host.c index 3e9f40139e26..3bf690bb32b0 100644 --- a/src/audio/copier/copier_host.c +++ b/src/audio/copier/copier_host.c @@ -44,13 +44,14 @@ static int init_pipeline_reg(struct comp_dev *dev) * component to support host gateway. */ int copier_host_create(struct comp_dev *parent_dev, struct copier_data *cd, - struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier_cfg, - int dir, struct pipeline *pipeline) + struct pipeline *pipeline) { struct processing_module *mod = comp_get_drvdata(parent_dev); + struct comp_ipc_config *config = &parent_dev->ipc_config; struct ipc_config_host ipc_host; struct host_data *hd; + int dir = cd->direction; int ret; enum sof_ipc_frame in_frame_fmt, out_frame_fmt; enum sof_ipc_frame in_valid_fmt, out_valid_fmt; diff --git a/src/include/sof/audio/host_copier.h b/src/include/sof/audio/host_copier.h index 6abff822fe53..8418d7185704 100644 --- a/src/include/sof/audio/host_copier.h +++ b/src/include/sof/audio/host_copier.h @@ -110,9 +110,8 @@ int host_common_copy(struct host_data *hd, struct comp_dev *dev, copy_callback_t void host_common_update(struct host_data *hd, struct comp_dev *dev, uint32_t bytes); void host_common_one_shot(struct host_data *hd, uint32_t bytes); int copier_host_create(struct comp_dev *parent_dev, struct copier_data *cd, - struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier_cfg, - int dir, struct pipeline *pipeline); + struct pipeline *pipeline); void copier_host_free(struct copier_data *cd); int copier_host_params(struct copier_data *cd, struct comp_dev *dev, struct sof_ipc_stream_params *params); From 16b879de81881854618081e6b21f86cb5e9e40c4 Mon Sep 17 00:00:00 2001 From: Baofeng Tian Date: Tue, 11 Jul 2023 21:32:25 +0800 Subject: [PATCH 02/12] copier: rename parent_dev to dev parent_dev previously used as copier device, and corresponding child_dev is host and dai, after host and dai device remove, there is no concept for parent_dev, rename it to dev. Signed-off-by: Baofeng Tian --- src/audio/copier/copier_dai.c | 48 +++++++++++++-------------- src/audio/copier/copier_generic.c | 4 +-- src/audio/copier/copier_host.c | 20 +++++------ src/audio/copier/copier_ipcgtw.c | 20 +++++------ src/include/ipc4/copier.h | 2 +- src/include/sof/audio/dai_copier.h | 2 +- src/include/sof/audio/host_copier.h | 2 +- src/include/sof/audio/ipcgtw_copier.h | 2 +- 8 files changed, 50 insertions(+), 50 deletions(-) diff --git a/src/audio/copier/copier_dai.c b/src/audio/copier/copier_dai.c index dec0a7d46ad2..71faa939a6aa 100644 --- a/src/audio/copier/copier_dai.c +++ b/src/audio/copier/copier_dai.c @@ -31,18 +31,18 @@ static uint32_t bitmask_to_nibble_channel_map(uint8_t bitmask) return nibble_map; } -static int copier_set_alh_multi_gtw_channel_map(struct comp_dev *parent_dev, +static int copier_set_alh_multi_gtw_channel_map(struct comp_dev *dev, const struct ipc4_copier_module_cfg *copier_cfg, int index) { - struct processing_module *mod = comp_get_drvdata(parent_dev); + struct processing_module *mod = comp_get_drvdata(dev); struct copier_data *cd = module_get_private_data(mod); const struct sof_alh_configuration_blob *alh_blob; uint8_t chan_bitmask; int channels; if (!copier_cfg->gtw_cfg.config_length) { - comp_err(parent_dev, "No ipc4_alh_multi_gtw_cfg found in blob!"); + comp_err(dev, "No ipc4_alh_multi_gtw_cfg found in blob!"); return -EINVAL; } @@ -54,7 +54,7 @@ static int copier_set_alh_multi_gtw_channel_map(struct comp_dev *parent_dev, channels = popcount(chan_bitmask); if (channels < 1 || channels > SOF_IPC_MAX_CHANNELS) { - comp_err(parent_dev, "Invalid channels mask: 0x%x", chan_bitmask); + comp_err(dev, "Invalid channels mask: 0x%x", chan_bitmask); return -EINVAL; } @@ -64,7 +64,7 @@ static int copier_set_alh_multi_gtw_channel_map(struct comp_dev *parent_dev, return 0; } -static int copier_dai_init(struct comp_dev *parent_dev, +static int copier_dai_init(struct comp_dev *dev, struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier, struct pipeline *pipeline, @@ -72,7 +72,7 @@ static int copier_dai_init(struct comp_dev *parent_dev, enum ipc4_gateway_type type, int index, int dai_count) { - struct processing_module *mod = comp_get_drvdata(parent_dev); + struct processing_module *mod = comp_get_drvdata(dev); struct copier_data *cd = module_get_private_data(mod); struct dai_data *dd; int ret; @@ -86,7 +86,7 @@ static int copier_dai_init(struct comp_dev *parent_dev, &out_valid_fmt, copier->out_fmt.s_type); config->frame_fmt = out_frame_fmt; - pipeline->sink_comp = parent_dev; + pipeline->sink_comp = dev; cd->bsource_buffer = true; } else { enum sof_ipc_frame in_frame_fmt, in_valid_fmt; @@ -96,14 +96,14 @@ static int copier_dai_init(struct comp_dev *parent_dev, &in_frame_fmt, &in_valid_fmt, copier->base.audio_fmt.s_type); config->frame_fmt = in_frame_fmt; - pipeline->source_comp = parent_dev; + pipeline->source_comp = dev; } - parent_dev->ipc_config.frame_fmt = config->frame_fmt; + dev->ipc_config.frame_fmt = config->frame_fmt; /* save the channel map and count for ALH multi-gateway */ if (type == ipc4_gtw_alh && is_multi_gateway(copier->gtw_cfg.node_id)) { - ret = copier_set_alh_multi_gtw_channel_map(parent_dev, copier, index); + ret = copier_set_alh_multi_gtw_channel_map(dev, copier, index); if (ret < 0) return ret; } @@ -112,14 +112,14 @@ static int copier_dai_init(struct comp_dev *parent_dev, if (!dd) return -ENOMEM; - ret = dai_common_new(dd, parent_dev, dai); + ret = dai_common_new(dd, dev, dai); if (ret < 0) goto free_dd; pipeline->sched_id = config->id; cd->dd[index] = dd; - ret = comp_dai_config(cd->dd[index], parent_dev, dai, copier); + ret = comp_dai_config(cd->dd[index], dev, dai, copier); if (ret < 0) goto e_zephyr_free; @@ -137,12 +137,12 @@ static int copier_dai_init(struct comp_dev *parent_dev, * ssp, dmic or alh. Sof dai component can support this case so copier * reuses dai component to support non-host gateway. */ -int copier_dai_create(struct comp_dev *parent_dev, struct copier_data *cd, +int copier_dai_create(struct comp_dev *dev, struct copier_data *cd, struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier, struct pipeline *pipeline) { - struct processing_module *mod = comp_get_drvdata(parent_dev); + struct processing_module *mod = comp_get_drvdata(dev); int dai_index[IPC4_ALH_MAX_NUMBER_OF_GTW]; union ipc4_connector_node_id node_id; enum ipc4_gateway_type type; @@ -177,7 +177,7 @@ int copier_dai_create(struct comp_dev *parent_dev, struct copier_data *cd, ret = ipc4_find_dma_config(&dai, (uint8_t *)copier->gtw_cfg.config_data, copier->gtw_cfg.config_length * 4); if (ret != 0) { - comp_err(parent_dev, "No ssp dma_config found in blob!"); + comp_err(dev, "No ssp dma_config found in blob!"); return -EINVAL; } dai.out_fmt = &copier->out_fmt; @@ -214,14 +214,14 @@ int copier_dai_create(struct comp_dev *parent_dev, struct copier_data *cd, dai_count = alh_blob->alh_cfg.count; if (dai_count > IPC4_ALH_MAX_NUMBER_OF_GTW || dai_count < 0) { - comp_err(parent_dev, "Invalid dai_count: %d", dai_count); + comp_err(dev, "Invalid dai_count: %d", dai_count); return -EINVAL; } for (i = 0; i < dai_count; i++) dai_index[i] = IPC4_ALH_DAI_INDEX(alh_blob->alh_cfg.mapping[i].alh_id); } else { - comp_err(parent_dev, "No ipc4_alh_multi_gtw_cfg found in blob!"); + comp_err(dev, "No ipc4_alh_multi_gtw_cfg found in blob!"); return -EINVAL; } } else { @@ -237,7 +237,7 @@ int copier_dai_create(struct comp_dev *parent_dev, struct copier_data *cd, ret = ipc4_find_dma_config(&dai, (uint8_t *)copier->gtw_cfg.config_data, copier->gtw_cfg.config_length * 4); if (ret != 0) { - comp_err(parent_dev, "No dmic dma_config found in blob!"); + comp_err(dev, "No dmic dma_config found in blob!"); return -EINVAL; } dai.out_fmt = &copier->out_fmt; @@ -248,10 +248,10 @@ int copier_dai_create(struct comp_dev *parent_dev, struct copier_data *cd, for (i = 0; i < dai_count; i++) { dai.dai_index = dai_index[i]; - ret = copier_dai_init(parent_dev, config, copier, pipeline, &dai, type, i, + ret = copier_dai_init(dev, config, copier, pipeline, &dai, type, i, dai_count); if (ret) { - comp_err(parent_dev, "failed to create dai"); + comp_err(dev, "failed to create dai"); return ret; } } @@ -260,22 +260,22 @@ int copier_dai_create(struct comp_dev *parent_dev, struct copier_data *cd, get_converter_func(&copier->base.audio_fmt, &copier->out_fmt, type, IPC4_DIRECTION(dai.direction)); if (!cd->converter[IPC4_COPIER_GATEWAY_PIN]) { - comp_err(parent_dev, "failed to get converter type %d, dir %d", + comp_err(dev, "failed to get converter type %d, dir %d", type, dai.direction); return -EINVAL; } /* create multi_endpoint_buffer for ALH multi-gateway case */ if (dai_count > 1) { - ret = create_endpoint_buffer(parent_dev, cd, config, copier, type, true, 0); + ret = create_endpoint_buffer(dev, cd, config, copier, type, true, 0); if (ret < 0) return ret; } if (cd->direction == SOF_IPC_STREAM_PLAYBACK) { - pipeline->sink_comp = parent_dev; + pipeline->sink_comp = dev; } else { - pipeline->source_comp = parent_dev; + pipeline->source_comp = dev; /* set max sink count for capture */ mod->max_sinks = IPC4_COPIER_MODULE_OUTPUT_PINS_COUNT; diff --git a/src/audio/copier/copier_generic.c b/src/audio/copier/copier_generic.c index 9ffbc8102f1e..bcc10d49fd6e 100644 --- a/src/audio/copier/copier_generic.c +++ b/src/audio/copier/copier_generic.c @@ -129,7 +129,7 @@ void copier_update_params(struct copier_data *cd, struct comp_dev *dev, } } -int create_endpoint_buffer(struct comp_dev *parent_dev, +int create_endpoint_buffer(struct comp_dev *dev, struct copier_data *cd, struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier_cfg, @@ -200,7 +200,7 @@ int create_endpoint_buffer(struct comp_dev *parent_dev, chan_map = copier_cfg->base.audio_fmt.ch_map; } - parent_dev->ipc_config.frame_fmt = config->frame_fmt; + dev->ipc_config.frame_fmt = config->frame_fmt; memset(&ipc_buf, 0, sizeof(ipc_buf)); ipc_buf.size = buf_size; diff --git a/src/audio/copier/copier_host.c b/src/audio/copier/copier_host.c index 3bf690bb32b0..6eff9d676bf1 100644 --- a/src/audio/copier/copier_host.c +++ b/src/audio/copier/copier_host.c @@ -43,12 +43,12 @@ static int init_pipeline_reg(struct comp_dev *dev) * Sof host component can support this case so copier reuses host * component to support host gateway. */ -int copier_host_create(struct comp_dev *parent_dev, struct copier_data *cd, +int copier_host_create(struct comp_dev *dev, struct copier_data *cd, const struct ipc4_copier_module_cfg *copier_cfg, struct pipeline *pipeline) { - struct processing_module *mod = comp_get_drvdata(parent_dev); - struct comp_ipc_config *config = &parent_dev->ipc_config; + struct processing_module *mod = comp_get_drvdata(dev); + struct comp_ipc_config *config = &dev->ipc_config; struct ipc_config_host ipc_host; struct host_data *hd; int dir = cd->direction; @@ -77,9 +77,9 @@ int copier_host_create(struct comp_dev *parent_dev, struct copier_data *cd, if (!hd) return -ENOMEM; - ret = host_common_new(hd, parent_dev, &ipc_host, config->id); + ret = host_common_new(hd, dev, &ipc_host, config->id); if (ret < 0) { - comp_err(parent_dev, "copier: host new failed with exit"); + comp_err(dev, "copier: host new failed with exit"); goto e_data; } @@ -88,7 +88,7 @@ int copier_host_create(struct comp_dev *parent_dev, struct copier_data *cd, &copier_cfg->out_fmt, ipc4_gtw_host, IPC4_DIRECTION(dir)); if (!cd->converter[IPC4_COPIER_GATEWAY_PIN]) { - comp_err(parent_dev, "failed to get converter for host, dir %d", dir); + comp_err(dev, "failed to get converter for host, dir %d", dir); ret = -EINVAL; goto e_conv; } @@ -98,8 +98,8 @@ int copier_host_create(struct comp_dev *parent_dev, struct copier_data *cd, if (cd->direction == SOF_IPC_STREAM_PLAYBACK) { config->frame_fmt = in_frame_fmt; - pipeline->source_comp = parent_dev; - ret = init_pipeline_reg(parent_dev); + pipeline->source_comp = dev; + ret = init_pipeline_reg(dev); if (ret) goto e_conv; @@ -107,9 +107,9 @@ int copier_host_create(struct comp_dev *parent_dev, struct copier_data *cd, mod->max_sinks = IPC4_COPIER_MODULE_OUTPUT_PINS_COUNT; } else { config->frame_fmt = out_frame_fmt; - pipeline->sink_comp = parent_dev; + pipeline->sink_comp = dev; } - parent_dev->ipc_config.frame_fmt = config->frame_fmt; + dev->ipc_config.frame_fmt = config->frame_fmt; return 0; diff --git a/src/audio/copier/copier_ipcgtw.c b/src/audio/copier/copier_ipcgtw.c index 890da553d45b..0992bf8662e8 100644 --- a/src/audio/copier/copier_ipcgtw.c +++ b/src/audio/copier/copier_ipcgtw.c @@ -223,7 +223,7 @@ void copier_ipcgtw_reset(struct comp_dev *dev) } } -int copier_ipcgtw_create(struct comp_dev *parent_dev, struct copier_data *cd, +int copier_ipcgtw_create(struct comp_dev *dev, struct copier_data *cd, struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier, struct pipeline *pipeline) { @@ -234,7 +234,7 @@ int copier_ipcgtw_create(struct comp_dev *parent_dev, struct copier_data *cd, gtw_cfg = &copier->gtw_cfg; if (!gtw_cfg->config_length) { - comp_err(parent_dev, "ipcgtw_create(): empty ipc4_gateway_config_data"); + comp_err(dev, "ipcgtw_create(): empty ipc4_gateway_config_data"); return -EINVAL; } @@ -246,7 +246,7 @@ int copier_ipcgtw_create(struct comp_dev *parent_dev, struct copier_data *cd, */ config->type = SOF_COMP_HOST; - ret = create_endpoint_buffer(parent_dev, cd, config, copier, ipc4_gtw_none, false, 0); + ret = create_endpoint_buffer(dev, cd, config, copier, ipc4_gtw_none, false, 0); if (ret < 0) return ret; @@ -257,7 +257,7 @@ int copier_ipcgtw_create(struct comp_dev *parent_dev, struct copier_data *cd, } ipcgtw_data->node_id = gtw_cfg->node_id; - ipcgtw_data->dev = parent_dev; + ipcgtw_data->dev = dev; blob = (const struct ipc4_ipc_gateway_config_blob *) ((const struct ipc4_gateway_config_data *)gtw_cfg->config_data)->config_blob; @@ -265,7 +265,7 @@ int copier_ipcgtw_create(struct comp_dev *parent_dev, struct copier_data *cd, /* Endpoint buffer is created in copier with size specified in copier config. That buffer * will be resized to size specified in IPC gateway blob later in ipcgtw_params(). */ - comp_dbg(parent_dev, "ipcgtw_create(): buffer_size: %u", blob->buffer_size); + comp_dbg(dev, "ipcgtw_create(): buffer_size: %u", blob->buffer_size); ipcgtw_data->buf_size = blob->buffer_size; cd->converter[IPC4_COPIER_GATEWAY_PIN] = @@ -273,24 +273,24 @@ int copier_ipcgtw_create(struct comp_dev *parent_dev, struct copier_data *cd, &copier->out_fmt, ipc4_gtw_host, IPC4_DIRECTION(cd->direction)); if (!cd->converter[IPC4_COPIER_GATEWAY_PIN]) { - comp_err(parent_dev, "failed to get converter for IPC gateway, dir %d", + comp_err(dev, "failed to get converter for IPC gateway, dir %d", cd->direction); ret = -EINVAL; goto e_ipcgtw; } if (cd->direction == SOF_IPC_STREAM_PLAYBACK) { - comp_buffer_connect(parent_dev, config->core, + comp_buffer_connect(dev, config->core, cd->endpoint_buffer[cd->endpoint_num], PPL_CONN_DIR_COMP_TO_BUFFER); cd->bsource_buffer = false; - pipeline->source_comp = parent_dev; + pipeline->source_comp = dev; } else { - comp_buffer_connect(parent_dev, config->core, + comp_buffer_connect(dev, config->core, cd->endpoint_buffer[cd->endpoint_num], PPL_CONN_DIR_BUFFER_TO_COMP); cd->bsource_buffer = true; - pipeline->sink_comp = parent_dev; + pipeline->sink_comp = dev; } list_item_append(&ipcgtw_data->item, &ipcgtw_list_head); diff --git a/src/include/ipc4/copier.h b/src/include/ipc4/copier.h index d6965f1c3c22..19a6ddbad649 100644 --- a/src/include/ipc4/copier.h +++ b/src/include/ipc4/copier.h @@ -272,7 +272,7 @@ pcm_converter_func get_converter_func(const struct ipc4_audio_format *in_fmt, enum ipc4_direction_type dir); struct comp_ipc_config; -int create_endpoint_buffer(struct comp_dev *parent_dev, +int create_endpoint_buffer(struct comp_dev *dev, struct copier_data *cd, struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier_cfg, diff --git a/src/include/sof/audio/dai_copier.h b/src/include/sof/audio/dai_copier.h index 839e3b61f871..a0566ce76567 100644 --- a/src/include/sof/audio/dai_copier.h +++ b/src/include/sof/audio/dai_copier.h @@ -57,7 +57,7 @@ int dai_zephyr_unbind(struct dai_data *dd, struct comp_dev *dev, void *data); struct ipc4_copier_module_cfg; struct copier_data; -int copier_dai_create(struct comp_dev *parent_dev, struct copier_data *cd, +int copier_dai_create(struct comp_dev *dev, struct copier_data *cd, struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier, struct pipeline *pipeline); diff --git a/src/include/sof/audio/host_copier.h b/src/include/sof/audio/host_copier.h index 8418d7185704..3f8ffbc1d387 100644 --- a/src/include/sof/audio/host_copier.h +++ b/src/include/sof/audio/host_copier.h @@ -109,7 +109,7 @@ int host_common_params(struct host_data *hd, struct comp_dev *dev, int host_common_copy(struct host_data *hd, struct comp_dev *dev, copy_callback_t cb); void host_common_update(struct host_data *hd, struct comp_dev *dev, uint32_t bytes); void host_common_one_shot(struct host_data *hd, uint32_t bytes); -int copier_host_create(struct comp_dev *parent_dev, struct copier_data *cd, +int copier_host_create(struct comp_dev *dev, struct copier_data *cd, const struct ipc4_copier_module_cfg *copier_cfg, struct pipeline *pipeline); void copier_host_free(struct copier_data *cd); diff --git a/src/include/sof/audio/ipcgtw_copier.h b/src/include/sof/audio/ipcgtw_copier.h index 84c0d7384211..c67bbd37232b 100644 --- a/src/include/sof/audio/ipcgtw_copier.h +++ b/src/include/sof/audio/ipcgtw_copier.h @@ -100,7 +100,7 @@ int copier_ipcgtw_params(struct ipcgtw_data *ipcgtw_data, struct comp_dev *dev, void copier_ipcgtw_reset(struct comp_dev *dev); -int copier_ipcgtw_create(struct comp_dev *parent_dev, struct copier_data *cd, +int copier_ipcgtw_create(struct comp_dev *dev, struct copier_data *cd, struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier, struct pipeline *pipeline); From 24476a4c0f6cb4db1d60d8c8dcbedfeb7917d41f Mon Sep 17 00:00:00 2001 From: Baofeng Tian Date: Thu, 3 Aug 2023 10:41:07 +0800 Subject: [PATCH 03/12] copier-host: remove duplicated frame format assignment since there is only one dev, there is no need to do duplicated frame format assignment. Signed-off-by: Baofeng Tian --- src/audio/copier/copier_host.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/audio/copier/copier_host.c b/src/audio/copier/copier_host.c index 6eff9d676bf1..27044eae0f1b 100644 --- a/src/audio/copier/copier_host.c +++ b/src/audio/copier/copier_host.c @@ -109,7 +109,6 @@ int copier_host_create(struct comp_dev *dev, struct copier_data *cd, config->frame_fmt = out_frame_fmt; pipeline->sink_comp = dev; } - dev->ipc_config.frame_fmt = config->frame_fmt; return 0; From f8a127d20c7267f0524888178184430147ed55bd Mon Sep 17 00:00:00 2001 From: Baofeng Tian Date: Wed, 12 Jul 2023 09:37:20 +0800 Subject: [PATCH 04/12] copier: refine dai init code refine dai init code with reduce one more parameter. Signed-off-by: Baofeng Tian --- src/audio/copier/copier.c | 3 +-- src/audio/copier/copier_dai.c | 2 +- src/include/sof/audio/dai_copier.h | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/audio/copier/copier.c b/src/audio/copier/copier.c index 6f7705d90d20..dcb95fb71634 100644 --- a/src/audio/copier/copier.c +++ b/src/audio/copier/copier.c @@ -114,8 +114,7 @@ static int copier_init(struct processing_module *mod) case ipc4_i2s_link_input_class: case ipc4_alh_link_output_class: case ipc4_alh_link_input_class: - ret = copier_dai_create(dev, cd, &dev->ipc_config, - copier, ipc_pipe->pipeline); + ret = copier_dai_create(dev, cd, copier, ipc_pipe->pipeline); if (ret < 0) { comp_err(dev, "unable to create dai"); goto error; diff --git a/src/audio/copier/copier_dai.c b/src/audio/copier/copier_dai.c index 71faa939a6aa..46d8ce7389b3 100644 --- a/src/audio/copier/copier_dai.c +++ b/src/audio/copier/copier_dai.c @@ -138,11 +138,11 @@ static int copier_dai_init(struct comp_dev *dev, * reuses dai component to support non-host gateway. */ int copier_dai_create(struct comp_dev *dev, struct copier_data *cd, - struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier, struct pipeline *pipeline) { struct processing_module *mod = comp_get_drvdata(dev); + struct comp_ipc_config *config = &dev->ipc_config; int dai_index[IPC4_ALH_MAX_NUMBER_OF_GTW]; union ipc4_connector_node_id node_id; enum ipc4_gateway_type type; diff --git a/src/include/sof/audio/dai_copier.h b/src/include/sof/audio/dai_copier.h index a0566ce76567..6219b92fb5b7 100644 --- a/src/include/sof/audio/dai_copier.h +++ b/src/include/sof/audio/dai_copier.h @@ -58,7 +58,6 @@ int dai_zephyr_unbind(struct dai_data *dd, struct comp_dev *dev, void *data); struct ipc4_copier_module_cfg; struct copier_data; int copier_dai_create(struct comp_dev *dev, struct copier_data *cd, - struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier, struct pipeline *pipeline); From fcaa478e6ef60a70aac3522ce9ed4f7a33da6400 Mon Sep 17 00:00:00 2001 From: Baofeng Tian Date: Thu, 3 Aug 2023 10:45:28 +0800 Subject: [PATCH 05/12] copier-dai: remove duplicated frame format assignment After dai device was removed, there is no parent device and dai device classification, only one device left for copier. The input ipc config is exactly copier device config, no need extra assignment. Signed-off-by: Baofeng Tian --- src/audio/copier/copier_dai.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/audio/copier/copier_dai.c b/src/audio/copier/copier_dai.c index 46d8ce7389b3..41ce4093ed88 100644 --- a/src/audio/copier/copier_dai.c +++ b/src/audio/copier/copier_dai.c @@ -99,8 +99,6 @@ static int copier_dai_init(struct comp_dev *dev, pipeline->source_comp = dev; } - dev->ipc_config.frame_fmt = config->frame_fmt; - /* save the channel map and count for ALH multi-gateway */ if (type == ipc4_gtw_alh && is_multi_gateway(copier->gtw_cfg.node_id)) { ret = copier_set_alh_multi_gtw_channel_map(dev, copier, index); From 0314da739bbf8427b50d965e44a5a4f982d5f916 Mon Sep 17 00:00:00 2001 From: Baofeng Tian Date: Wed, 12 Jul 2023 11:13:45 +0800 Subject: [PATCH 06/12] aria: simplify aria parameter update Use function to simplify buffer parameter update instead of update one by one. Signed-off-by: Baofeng Tian --- src/audio/aria/aria.c | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/audio/aria/aria.c b/src/audio/aria/aria.c index 7599c6c41383..9d9c16c9c1d9 100644 --- a/src/audio/aria/aria.c +++ b/src/audio/aria/aria.c @@ -154,23 +154,11 @@ static void aria_set_stream_params(struct comp_buffer *buffer, struct processing_module *mod) { struct comp_buffer __sparse_cache *buffer_c; - enum sof_ipc_frame valid_fmt, frame_fmt; const struct ipc4_audio_format *audio_fmt = &mod->priv.cfg.base_cfg.audio_fmt; - struct aria_data *cd = module_get_private_data(mod); buffer_c = buffer_acquire(buffer); - audio_stream_fmt_conversion(audio_fmt->depth, - audio_fmt->valid_bit_depth, - &frame_fmt, &valid_fmt, - audio_fmt->s_type); - audio_stream_set_buffer_fmt(&buffer_c->stream, - audio_fmt->interleaving_style); - audio_stream_set_frm_fmt(&buffer_c->stream, frame_fmt); - audio_stream_set_valid_fmt(&buffer_c->stream, valid_fmt); - audio_stream_set_channels(&buffer_c->stream, cd->chan_cnt); - audio_stream_set_rate(&buffer_c->stream, audio_fmt->sampling_frequency); - + ipc4_update_buffer_format(buffer_c, audio_fmt); #ifdef ARIA_GENERIC audio_stream_init_alignment_constants(1, 1, &buffer_c->stream); #else From 1519a7494ce0911bb59446017fb899f97537bfbd Mon Sep 17 00:00:00 2001 From: Baofeng Tian Date: Wed, 12 Jul 2023 13:54:27 +0800 Subject: [PATCH 07/12] google-rtc: simplify google-rtc parameters use helper function to update stream parameters for sink buffers. Signed-off-by: Baofeng Tian --- src/audio/google/google_rtc_audio_processing.c | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/audio/google/google_rtc_audio_processing.c b/src/audio/google/google_rtc_audio_processing.c index 5c54acd00f95..513f8dbb3334 100644 --- a/src/audio/google/google_rtc_audio_processing.c +++ b/src/audio/google/google_rtc_audio_processing.c @@ -109,22 +109,7 @@ static int google_rtc_audio_processing_params( sink = list_first_item(&dev->bsink_list, struct comp_buffer, source_list); sink_c = buffer_acquire(sink); - - audio_stream_fmt_conversion(out_fmt->depth, - out_fmt->valid_bit_depth, - &frame_fmt, &valid_fmt, - out_fmt->s_type); - - audio_stream_set_frm_fmt(&sink_c->stream, frame_fmt); - audio_stream_set_valid_fmt(&sink_c->stream, valid_fmt); - audio_stream_set_channels(&sink_c->stream, cd->config.output_fmt.channels_count); - audio_stream_set_rate(&sink_c->stream, cd->config.output_fmt.sampling_frequency); - - sink_c->buffer_fmt = out_fmt->interleaving_style; - params->frame_fmt = valid_fmt; - - sink_c->hw_params_configured = true; - + ipc4_update_buffer_format(sink_c, out_fmt); buffer_release(sink_c); } #endif From 765e38f3c2f4df7857315c67a4d277dc80c7842d Mon Sep 17 00:00:00 2001 From: Baofeng Tian Date: Wed, 12 Jul 2023 15:55:57 +0800 Subject: [PATCH 08/12] mux: simplify set mux parameters use helper function to update stream parameters for mux buffers. Signed-off-by: Baofeng Tian --- src/audio/mux/mux.c | 70 ++++++--------------------------------------- 1 file changed, 9 insertions(+), 61 deletions(-) diff --git a/src/audio/mux/mux.c b/src/audio/mux/mux.c index 3c877f5be57f..bfecf972e298 100644 --- a/src/audio/mux/mux.c +++ b/src/audio/mux/mux.c @@ -275,9 +275,8 @@ static void set_mux_params(struct processing_module *mod) struct comp_dev *dev = mod->dev; struct comp_buffer *sink, *source; struct comp_buffer __sparse_cache *sink_c, *source_c; - enum sof_ipc_frame frame_fmt, valid_fmt; struct list_item *source_list; - int i, j, valid_bit_depth; + int j, valid_bit_depth; const uint32_t byte_align = 1; const uint32_t frame_align_req = 1; @@ -304,32 +303,16 @@ static void set_mux_params(struct processing_module *mod) &sink_c->stream); if (!sink_c->hw_params_configured) { - struct ipc4_audio_format out_fmt; - - out_fmt = cd->md.output_format; - audio_stream_fmt_conversion(out_fmt.depth, - out_fmt.valid_bit_depth, - &frame_fmt, &valid_fmt, - out_fmt.s_type); - - audio_stream_set_frm_fmt(&sink_c->stream, frame_fmt); - audio_stream_set_valid_fmt(&sink_c->stream, valid_fmt); - audio_stream_set_channels(&sink_c->stream, out_fmt.channels_count); - audio_stream_set_rate(&sink_c->stream, out_fmt.sampling_frequency); - - audio_stream_set_buffer_fmt(&sink_c->stream, out_fmt.interleaving_style); + ipc4_update_buffer_format(sink_c, &cd->md.output_format); params->frame_fmt = audio_stream_get_frm_fmt(&sink_c->stream); - - for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++) - sink_c->chmap[i] = (out_fmt.ch_map >> i * 4) & 0xf; - - sink_c->hw_params_configured = true; } buffer_release(sink_c); } /* update each source format */ if (!list_is_empty(&dev->bsource_list)) { + struct ipc4_audio_format *audio_fmt; + list_for_item(source_list, &dev->bsource_list) { source = container_of(source_list, struct comp_buffer, sink_list); @@ -339,47 +322,12 @@ static void set_mux_params(struct processing_module *mod) j = source_c->id; cd->config.streams[j].pipeline_id = source_c->pipeline_id; valid_bit_depth = cd->md.base_cfg.audio_fmt.valid_bit_depth; - if (j == BASE_CFG_QUEUED_ID) { - audio_stream_set_channels(&source_c->stream, - cd->md.base_cfg.audio_fmt.channels_count); - audio_stream_set_rate(&source_c->stream, - cd->md.base_cfg.audio_fmt.sampling_frequency); - audio_stream_fmt_conversion(cd->md.base_cfg.audio_fmt.depth, - valid_bit_depth, - &frame_fmt, &valid_fmt, - cd->md.base_cfg.audio_fmt.s_type); - - audio_stream_set_buffer_fmt - (&source_c->stream, - cd->md.base_cfg.audio_fmt.interleaving_style); - - for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++) - source_c->chmap[i] = - (cd->md.base_cfg.audio_fmt.ch_map >> i * 4) & 0xf; - } else { - /* set parameters for reference input channels */ - audio_stream_set_channels(&source_c->stream, - cd->md.reference_format.channels_count); - audio_stream_set_rate(&source_c->stream, - cd->md.reference_format.sampling_frequency); - audio_stream_fmt_conversion(cd->md.reference_format.depth, - cd->md.reference_format.valid_bit_depth, - &frame_fmt, &valid_fmt, - cd->md.reference_format.s_type); - - audio_stream_set_buffer_fmt - (&source_c->stream, - cd->md.reference_format.interleaving_style); - - for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++) - source_c->chmap[i] = - (cd->md.reference_format.ch_map >> i * 4) & 0xf; - } - - audio_stream_set_frm_fmt(&source_c->stream, frame_fmt); - audio_stream_set_valid_fmt(&source_c->stream, valid_fmt); + if (j == BASE_CFG_QUEUED_ID) + audio_fmt = &cd->md.base_cfg.audio_fmt; + else + audio_fmt = &cd->md.reference_format; - source_c->hw_params_configured = true; + ipc4_update_buffer_format(source_c, audio_fmt); buffer_release(source_c); } } From 8548bc39c46ff0c0478265d52ff330e1478d89b6 Mon Sep 17 00:00:00 2001 From: Baofeng Tian Date: Wed, 12 Jul 2023 16:11:44 +0800 Subject: [PATCH 09/12] selector: simplify selector parameters use helper function to update stream parameters selector buffers. Signed-off-by: Baofeng Tian --- src/audio/selector/selector.c | 39 +++-------------------------------- 1 file changed, 3 insertions(+), 36 deletions(-) diff --git a/src/audio/selector/selector.c b/src/audio/selector/selector.c index 5ac8dfca56f6..8a39db81b2ef 100644 --- a/src/audio/selector/selector.c +++ b/src/audio/selector/selector.c @@ -701,24 +701,10 @@ static void set_selector_params(struct processing_module *mod, struct comp_buffer *sink_buf = container_of(sink_list, struct comp_buffer, source_list); struct comp_buffer __sparse_cache *sink = buffer_acquire(sink_buf); - enum sof_ipc_frame frame_fmt, valid_fmt; - audio_stream_fmt_conversion(out_fmt->depth, - out_fmt->valid_bit_depth, - &frame_fmt, &valid_fmt, - out_fmt->s_type); - - audio_stream_set_frm_fmt(&sink->stream, frame_fmt); - audio_stream_set_valid_fmt(&sink->stream, valid_fmt); + ipc4_update_buffer_format(sink, out_fmt); audio_stream_set_channels(&sink->stream, params->channels); audio_stream_set_rate(&sink->stream, params->rate); - - audio_stream_set_buffer_fmt(&sink->stream, out_fmt->interleaving_style); - - for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++) - sink->chmap[i] = (out_fmt->ch_map >> i * 4) & 0xf; - - sink->hw_params_configured = true; buffer_release(sink); } @@ -730,28 +716,9 @@ static void set_selector_params(struct processing_module *mod, */ src_buf = list_first_item(&dev->bsource_list, struct comp_buffer, sink_list); source = buffer_acquire(src_buf); - if (!source->hw_params_configured) { - struct ipc4_audio_format *in_fmt; - enum sof_ipc_frame frame_fmt, valid_fmt; - - in_fmt = &mod->priv.cfg.base_cfg.audio_fmt; - audio_stream_fmt_conversion(in_fmt->depth, - in_fmt->valid_bit_depth, - &frame_fmt, &valid_fmt, - in_fmt->s_type); - audio_stream_set_frm_fmt(&source->stream, frame_fmt); - audio_stream_set_valid_fmt(&source->stream, valid_fmt); - audio_stream_set_channels(&source->stream, in_fmt->channels_count); - audio_stream_set_rate(&source->stream, in_fmt->sampling_frequency); - - audio_stream_set_buffer_fmt(&source->stream, in_fmt->interleaving_style); - - for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++) - source->chmap[i] = (in_fmt->ch_map >> i * 4) & 0xf; - - source->hw_params_configured = true; - } + if (!source->hw_params_configured) + ipc4_update_buffer_format(source, &mod->priv.cfg.base_cfg.audio_fmt); buffer_release(source); } From 830a9b38d017b601e4404bac4f60ce76f5d9f3b9 Mon Sep 17 00:00:00 2001 From: Baofeng Tian Date: Wed, 12 Jul 2023 16:22:27 +0800 Subject: [PATCH 10/12] smart_amp: simplify smart amp parameters use helper function to update stream parameters. Signed-off-by: Baofeng Tian --- src/samples/audio/smart_amp_test_ipc4.c | 26 ++----------------------- 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/src/samples/audio/smart_amp_test_ipc4.c b/src/samples/audio/smart_amp_test_ipc4.c index 658c175c3fb4..a256de9c3d28 100644 --- a/src/samples/audio/smart_amp_test_ipc4.c +++ b/src/samples/audio/smart_amp_test_ipc4.c @@ -88,25 +88,13 @@ static int smart_amp_init(struct processing_module *mod) static void smart_amp_set_params(struct processing_module *mod) { - const struct ipc4_audio_format *audio_fmt = &mod->priv.cfg.base_cfg.audio_fmt; struct sof_ipc_stream_params *params = mod->stream_params; struct comp_dev *dev = mod->dev; struct smart_amp_data *sad = module_get_private_data(mod); struct comp_buffer *sink; struct comp_buffer __sparse_cache *sink_c; - enum sof_ipc_frame frame_fmt, valid_fmt; - int i; - - memset(params, 0, sizeof(*params)); - params->channels = audio_fmt->channels_count; - params->rate = audio_fmt->sampling_frequency; - params->sample_container_bytes = audio_fmt->depth / 8; - params->sample_valid_bytes = audio_fmt->valid_bit_depth / 8; - params->buffer_fmt = audio_fmt->interleaving_style; - params->buffer.size = mod->priv.cfg.base_cfg.ibs; - for (i = 0; i < SOF_IPC_MAX_CHANNELS; i++) - params->chmap[i] = (audio_fmt->ch_map >> i * 4) & 0xf; + ipc4_base_module_cfg_to_stream_params(&mod->priv.cfg.base_cfg, params); /* update sink format */ if (!list_is_empty(&dev->bsink_list)) { @@ -116,18 +104,8 @@ static void smart_amp_set_params(struct processing_module *mod) sink = list_first_item(&dev->bsink_list, struct comp_buffer, source_list); sink_c = buffer_acquire(sink); - audio_stream_fmt_conversion(out_fmt.depth, - out_fmt.valid_bit_depth, - &frame_fmt, &valid_fmt, - out_fmt.s_type); - - audio_stream_set_frm_fmt(&sink_c->stream, frame_fmt); - audio_stream_set_valid_fmt(&sink_c->stream, valid_fmt); - audio_stream_set_channels(&sink_c->stream, out_fmt.channels_count); - audio_stream_set_rate(&sink_c->stream, out_fmt.sampling_frequency); - audio_stream_set_buffer_fmt(&sink_c->stream, out_fmt.interleaving_style); + ipc4_update_buffer_format(sink_c, &out_fmt); params->frame_fmt = audio_stream_get_frm_fmt(&sink_c->stream); - sink_c->hw_params_configured = true; buffer_release(sink_c); } } From dfee09322320d5c18f756058febd3a5b6065e9a9 Mon Sep 17 00:00:00 2001 From: Baofeng Tian Date: Tue, 18 Jul 2023 14:20:53 +0800 Subject: [PATCH 11/12] copier:simplify ipcgtw create parameters remove duplicate parameters and make function parameters looks more simple. Signed-off-by: Baofeng Tian --- src/audio/copier/copier.c | 3 +-- src/audio/copier/copier_ipcgtw.c | 2 +- src/include/sof/audio/ipcgtw_copier.h | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/audio/copier/copier.c b/src/audio/copier/copier.c index dcb95fb71634..ae03226be8c1 100644 --- a/src/audio/copier/copier.c +++ b/src/audio/copier/copier.c @@ -123,8 +123,7 @@ static int copier_init(struct processing_module *mod) #if CONFIG_IPC4_GATEWAY case ipc4_ipc_output_class: case ipc4_ipc_input_class: - ret = copier_ipcgtw_create(dev, cd, &dev->ipc_config, - copier, ipc_pipe->pipeline); + ret = copier_ipcgtw_create(dev, cd, copier, ipc_pipe->pipeline); if (ret < 0) { comp_err(dev, "unable to create IPC gateway"); goto error; diff --git a/src/audio/copier/copier_ipcgtw.c b/src/audio/copier/copier_ipcgtw.c index 0992bf8662e8..0b63fe9cce56 100644 --- a/src/audio/copier/copier_ipcgtw.c +++ b/src/audio/copier/copier_ipcgtw.c @@ -224,9 +224,9 @@ void copier_ipcgtw_reset(struct comp_dev *dev) } int copier_ipcgtw_create(struct comp_dev *dev, struct copier_data *cd, - struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier, struct pipeline *pipeline) { + struct comp_ipc_config *config = &dev->ipc_config; struct ipcgtw_data *ipcgtw_data; const struct ipc4_copier_gateway_cfg *gtw_cfg; const struct ipc4_ipc_gateway_config_blob *blob; diff --git a/src/include/sof/audio/ipcgtw_copier.h b/src/include/sof/audio/ipcgtw_copier.h index c67bbd37232b..6a52e25e61e8 100644 --- a/src/include/sof/audio/ipcgtw_copier.h +++ b/src/include/sof/audio/ipcgtw_copier.h @@ -101,7 +101,6 @@ int copier_ipcgtw_params(struct ipcgtw_data *ipcgtw_data, struct comp_dev *dev, void copier_ipcgtw_reset(struct comp_dev *dev); int copier_ipcgtw_create(struct comp_dev *dev, struct copier_data *cd, - struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier, struct pipeline *pipeline); void copier_ipcgtw_free(struct copier_data *cd); From f9e6328aab99fbe5b31dbcd4fd9d510aa4e3dfef Mon Sep 17 00:00:00 2001 From: Baofeng Tian Date: Tue, 18 Jul 2023 14:30:21 +0800 Subject: [PATCH 12/12] copier: remove redundant parameters when create endpoint buffer Remove no use or redundant parameters in create endpoint buffer function. Signed-off-by: Baofeng Tian --- src/audio/copier/copier_dai.c | 2 +- src/audio/copier/copier_generic.c | 6 ++---- src/audio/copier/copier_ipcgtw.c | 2 +- src/include/ipc4/copier.h | 5 +---- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/audio/copier/copier_dai.c b/src/audio/copier/copier_dai.c index 41ce4093ed88..31b832b81d01 100644 --- a/src/audio/copier/copier_dai.c +++ b/src/audio/copier/copier_dai.c @@ -265,7 +265,7 @@ int copier_dai_create(struct comp_dev *dev, struct copier_data *cd, /* create multi_endpoint_buffer for ALH multi-gateway case */ if (dai_count > 1) { - ret = create_endpoint_buffer(dev, cd, config, copier, type, true, 0); + ret = create_endpoint_buffer(dev, cd, copier, true); if (ret < 0) return ret; } diff --git a/src/audio/copier/copier_generic.c b/src/audio/copier/copier_generic.c index bcc10d49fd6e..e9ca748a8b2e 100644 --- a/src/audio/copier/copier_generic.c +++ b/src/audio/copier/copier_generic.c @@ -131,12 +131,10 @@ void copier_update_params(struct copier_data *cd, struct comp_dev *dev, int create_endpoint_buffer(struct comp_dev *dev, struct copier_data *cd, - struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier_cfg, - enum ipc4_gateway_type type, - bool create_multi_endpoint_buffer, - int index) + bool create_multi_endpoint_buffer) { + struct comp_ipc_config *config = &dev->ipc_config; enum sof_ipc_frame in_frame_fmt, out_frame_fmt; enum sof_ipc_frame in_valid_fmt, out_valid_fmt; enum sof_ipc_frame valid_fmt; diff --git a/src/audio/copier/copier_ipcgtw.c b/src/audio/copier/copier_ipcgtw.c index 0b63fe9cce56..967467f098ad 100644 --- a/src/audio/copier/copier_ipcgtw.c +++ b/src/audio/copier/copier_ipcgtw.c @@ -246,7 +246,7 @@ int copier_ipcgtw_create(struct comp_dev *dev, struct copier_data *cd, */ config->type = SOF_COMP_HOST; - ret = create_endpoint_buffer(dev, cd, config, copier, ipc4_gtw_none, false, 0); + ret = create_endpoint_buffer(dev, cd, copier, false); if (ret < 0) return ret; diff --git a/src/include/ipc4/copier.h b/src/include/ipc4/copier.h index 19a6ddbad649..568e9cbe8ce6 100644 --- a/src/include/ipc4/copier.h +++ b/src/include/ipc4/copier.h @@ -274,11 +274,8 @@ pcm_converter_func get_converter_func(const struct ipc4_audio_format *in_fmt, struct comp_ipc_config; int create_endpoint_buffer(struct comp_dev *dev, struct copier_data *cd, - struct comp_ipc_config *config, const struct ipc4_copier_module_cfg *copier_cfg, - enum ipc4_gateway_type type, - bool create_multi_endpoint_buffer, - int index); + bool create_multi_endpoint_buffer); enum sof_ipc_stream_direction get_gateway_direction(enum ipc4_connector_node_id_type node_id_type);