From: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
To: lgirdwood@gmail.com, broonie@kernel.org
Cc: linux-sound@vger.kernel.org, kai.vehmanen@linux.intel.com,
yung-chuan.liao@linux.intel.com, pierre-louis.bossart@linux.dev,
jyri.sarha@linux.intel.com
Subject: [PATCH 6/6] ASoC: SOF: ipc4-topology: Refactor sof_ipc4_widget_mod_init_msg_payload()
Date: Thu, 30 Jul 2026 13:41:41 +0300 [thread overview]
Message-ID: <20260730104141.14817-7-peter.ujfalusi@linux.intel.com> (raw)
In-Reply-To: <20260730104141.14817-1-peter.ujfalusi@linux.intel.com>
From: Jyri Sarha <jyri.sarha@linux.intel.com>
Refactor sof_ipc4_widget_mod_init_msg_payload() to be easier to extend.
Signed-off-by: Jyri Sarha <jyri.sarha@linux.intel.com>
Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
---
sound/soc/sof/ipc4-topology.c | 65 ++++++++++++++++++++++-------------
1 file changed, 42 insertions(+), 23 deletions(-)
diff --git a/sound/soc/sof/ipc4-topology.c b/sound/soc/sof/ipc4-topology.c
index 02948b2a809b..45f434c86cf9 100644
--- a/sound/soc/sof/ipc4-topology.c
+++ b/sound/soc/sof/ipc4-topology.c
@@ -3103,27 +3103,47 @@ static int sof_ipc4_control_setup(struct snd_sof_dev *sdev, struct snd_sof_contr
return 0;
}
+static void sof_ipc4_add_init_ext_dp_memory_data(struct snd_sof_dev *sdev,
+ struct snd_sof_widget *swidget,
+ u32 *payload, u32 *ext_pos,
+ struct sof_ipc4_module_init_ext_object **hdr)
+{
+ /* Add memory_data if comp_domain indicates DP */
+ if (swidget->comp_domain == SOF_COMP_DOMAIN_DP) {
+ struct sof_ipc4_mod_init_ext_dp_memory_data *dp_mem_data;
+
+ *hdr = (struct sof_ipc4_module_init_ext_object *)&payload[*ext_pos];
+ (*hdr)->header =
+ SOF_IPC4_MOD_INIT_EXT_OBJ_ID(SOF_IPC4_MOD_INIT_DATA_ID_DP_DATA) |
+ SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS(DIV_ROUND_UP(sizeof(*dp_mem_data),
+ sizeof(u32)));
+ *ext_pos += DIV_ROUND_UP(sizeof(**hdr), sizeof(u32));
+ dp_mem_data = (struct sof_ipc4_mod_init_ext_dp_memory_data *)&payload[*ext_pos];
+ dp_mem_data->domain_id = swidget->domain_id;
+ dp_mem_data->stack_bytes = swidget->stack_bytes;
+ dp_mem_data->heap_bytes = swidget->heap_bytes;
+ *ext_pos += DIV_ROUND_UP(sizeof(*dp_mem_data), sizeof(u32));
+ }
+}
+
static int sof_ipc4_widget_mod_init_msg_payload(struct snd_sof_dev *sdev,
struct snd_sof_widget *swidget,
struct sof_ipc4_msg *msg,
void *ipc_data, u32 ipc_size,
void **new_data)
{
- struct sof_ipc4_mod_init_ext_dp_memory_data *dp_mem_data;
struct sof_ipc4_module_init_ext_init *ext_init;
- struct sof_ipc4_module_init_ext_object *hdr;
+ struct sof_ipc4_module_init_ext_object *hdr = NULL;
int new_size;
u32 *payload;
u32 ext_pos;
- /* For the moment the only reason for adding init_ext_init payload is DP
- * memory data. If both stack and heap size are 0 (= use default), then
- * there is no need for init_ext_init payload.
+ /*
+ * Only DP widgets currently add init-ext objects here. Avoid allocating
+ * a max-sized payload buffer for widgets that will immediately return 0.
*/
- if (swidget->comp_domain != SOF_COMP_DOMAIN_DP) {
- msg->extension &= ~SOF_IPC4_MOD_EXT_EXTENDED_INIT_MASK;
+ if (swidget->comp_domain != SOF_COMP_DOMAIN_DP)
return 0;
- }
payload = kzalloc(sdev->ipc->max_payload_size, GFP_KERNEL);
if (!payload)
@@ -3135,23 +3155,22 @@ static int sof_ipc4_widget_mod_init_msg_payload(struct snd_sof_dev *sdev,
/* Add object array objects after ext_init */
- /* Add memory_data if comp_domain indicates DP */
- if (swidget->comp_domain == SOF_COMP_DOMAIN_DP) {
- ext_init->word0 |= SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_MASK;
+ sof_ipc4_add_init_ext_dp_memory_data(sdev, swidget, payload, &ext_pos, &hdr);
- hdr = (struct sof_ipc4_module_init_ext_object *)&payload[ext_pos];
- hdr->header = SOF_IPC4_MOD_INIT_EXT_OBJ_LAST_MASK |
- SOF_IPC4_MOD_INIT_EXT_OBJ_ID(SOF_IPC4_MOD_INIT_DATA_ID_DP_DATA) |
- SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS(DIV_ROUND_UP(sizeof(*dp_mem_data),
- sizeof(u32)));
- ext_pos += DIV_ROUND_UP(sizeof(*hdr), sizeof(u32));
- dp_mem_data = (struct sof_ipc4_mod_init_ext_dp_memory_data *)&payload[ext_pos];
- dp_mem_data->domain_id = swidget->domain_id;
- dp_mem_data->stack_bytes = swidget->stack_bytes;
- dp_mem_data->heap_bytes = swidget->heap_bytes;
- ext_pos += DIV_ROUND_UP(sizeof(*dp_mem_data), sizeof(u32));
+ /* Add following object array items here */
+
+ if (!hdr) {
+ /*
+ * NOTE: Remove this early bail out, when struct
+ * sof_ipc4_module_init_ext_init alone has some
+ * function.
+ */
+ kfree(payload);
+ return 0;
}
- /* If another array object is added, remember clear previous OBJ_LAST bit */
+
+ ext_init->word0 |= SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_MASK;
+ hdr->header |= SOF_IPC4_MOD_INIT_EXT_OBJ_LAST_MASK;
/* Calculate final size and check that it fits to max payload size */
new_size = ext_pos * sizeof(u32) + ipc_size;
--
2.55.0
prev parent reply other threads:[~2026-07-30 10:41 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-30 10:41 [PATCH 0/6] ASoC: SOF: ipc4-topology: Update the memory data building Peter Ujfalusi
2026-07-30 10:41 ` [PATCH 1/6] ASoC: SOF: ipc4-topology: Remove dp_ from all module memory attributes Peter Ujfalusi
2026-07-30 10:41 ` [PATCH 2/6] ASoC: SOF: ipc4-topology: Fix SOF_TKN_COMP_STACK_BYTES_REQUIREMENT id Peter Ujfalusi
2026-07-30 10:41 ` [PATCH 3/6] ASoC: SOF: ipc4: Add SOF_IPC4_GLB_CREATE_PIPELINE payload macros and structs Peter Ujfalusi
2026-07-30 10:41 ` [PATCH 4/6] ASoC: SOF: ipc4-topology: Add payload to pipeline create messages Peter Ujfalusi
2026-07-30 23:37 ` Mark Brown
2026-07-30 10:41 ` [PATCH 5/6] ASoC: SOF: ipc4-topology: Fix sof_ipc4_mod_init_ext_dp_memory_data comments Peter Ujfalusi
2026-07-30 10:41 ` Peter Ujfalusi [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260730104141.14817-7-peter.ujfalusi@linux.intel.com \
--to=peter.ujfalusi@linux.intel.com \
--cc=broonie@kernel.org \
--cc=jyri.sarha@linux.intel.com \
--cc=kai.vehmanen@linux.intel.com \
--cc=lgirdwood@gmail.com \
--cc=linux-sound@vger.kernel.org \
--cc=pierre-louis.bossart@linux.dev \
--cc=yung-chuan.liao@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox