Skip to content

Commit 568dab8

Browse files
author
Jyri Sarha
committed
ASoC: SOF: ipc4-topology: Refactor sof_ipc4_widget_mod_init_msg_payload()
Refactor sof_ipc4_widget_mod_init_msg_payload() to be easier to extend. Signed-off-by: Jyri Sarha <jyri.sarha@linux.intel.com>
1 parent 22d776b commit 568dab8

1 file changed

Lines changed: 40 additions & 28 deletions

File tree

sound/soc/sof/ipc4-topology.c

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3129,28 +3129,43 @@ static int sof_ipc4_control_setup(struct snd_sof_dev *sdev, struct snd_sof_contr
31293129
return 0;
31303130
}
31313131

3132+
static void sof_ipc4_add_init_ext_dp_memory_data(struct snd_sof_dev *sdev,
3133+
struct snd_sof_widget *swidget,
3134+
u32 *payload, u32 *ext_pos,
3135+
struct sof_ipc4_module_init_ext_object **hdr)
3136+
{
3137+
/* Add memory_data if comp_domain indicates DP */
3138+
if (swidget->comp_domain == SOF_COMP_DOMAIN_DP) {
3139+
struct sof_ipc4_mod_init_ext_dp_memory_data *dp_mem_data;
3140+
3141+
*hdr = (struct sof_ipc4_module_init_ext_object *)&payload[*ext_pos];
3142+
(*hdr)->header =
3143+
SOF_IPC4_MOD_INIT_EXT_OBJ_ID(SOF_IPC4_MOD_INIT_DATA_ID_DP_DATA) |
3144+
SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS(DIV_ROUND_UP(sizeof(*dp_mem_data),
3145+
sizeof(u32)));
3146+
*ext_pos += DIV_ROUND_UP(sizeof(**hdr), sizeof(u32));
3147+
dp_mem_data = (struct sof_ipc4_mod_init_ext_dp_memory_data *)&payload[*ext_pos];
3148+
dp_mem_data->domain_id = swidget->domain_id;
3149+
dp_mem_data->stack_bytes = swidget->stack_bytes;
3150+
dp_mem_data->interim_heap_bytes = swidget->interim_bytes;
3151+
dp_mem_data->lifetime_heap_bytes = swidget->lifetime_bytes;
3152+
dp_mem_data->shared_bytes = swidget->shared_bytes;
3153+
*ext_pos += DIV_ROUND_UP(sizeof(*dp_mem_data), sizeof(u32));
3154+
}
3155+
}
3156+
31323157
static int sof_ipc4_widget_mod_init_msg_payload(struct snd_sof_dev *sdev,
31333158
struct snd_sof_widget *swidget,
31343159
struct sof_ipc4_msg *msg,
31353160
void *ipc_data, u32 ipc_size,
31363161
void **new_data)
31373162
{
3138-
struct sof_ipc4_mod_init_ext_dp_memory_data *dp_mem_data;
31393163
struct sof_ipc4_module_init_ext_init *ext_init;
3140-
struct sof_ipc4_module_init_ext_object *hdr;
3164+
struct sof_ipc4_module_init_ext_object *hdr = NULL;
31413165
int new_size;
31423166
u32 *payload;
31433167
u32 ext_pos;
31443168

3145-
/* For the moment the only reason for adding init_ext_init payload is DP
3146-
* memory data. If both stack and heap size are 0 (= use default), then
3147-
* there is no need for init_ext_init payload.
3148-
*/
3149-
if (swidget->comp_domain != SOF_COMP_DOMAIN_DP) {
3150-
msg->extension &= ~SOF_IPC4_MOD_EXT_EXTENDED_INIT_MASK;
3151-
return 0;
3152-
}
3153-
31543169
payload = kzalloc(sdev->ipc->max_payload_size, GFP_KERNEL);
31553170
if (!payload)
31563171
return -ENOMEM;
@@ -3161,25 +3176,22 @@ static int sof_ipc4_widget_mod_init_msg_payload(struct snd_sof_dev *sdev,
31613176

31623177
/* Add object array objects after ext_init */
31633178

3164-
/* Add memory_data if comp_domain indicates DP */
3165-
if (swidget->comp_domain == SOF_COMP_DOMAIN_DP) {
3166-
ext_init->word0 |= SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_MASK;
3179+
sof_ipc4_add_init_ext_dp_memory_data(sdev, swidget, payload, &ext_pos, &hdr);
31673180

3168-
hdr = (struct sof_ipc4_module_init_ext_object *)&payload[ext_pos];
3169-
hdr->header = SOF_IPC4_MOD_INIT_EXT_OBJ_LAST_MASK |
3170-
SOF_IPC4_MOD_INIT_EXT_OBJ_ID(SOF_IPC4_MOD_INIT_DATA_ID_DP_DATA) |
3171-
SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS(DIV_ROUND_UP(sizeof(*dp_mem_data),
3172-
sizeof(u32)));
3173-
ext_pos += DIV_ROUND_UP(sizeof(*hdr), sizeof(u32));
3174-
dp_mem_data = (struct sof_ipc4_mod_init_ext_dp_memory_data *)&payload[ext_pos];
3175-
dp_mem_data->domain_id = swidget->domain_id;
3176-
dp_mem_data->stack_bytes = swidget->stack_bytes;
3177-
dp_mem_data->interim_heap_bytes = swidget->interim_bytes;
3178-
dp_mem_data->lifetime_heap_bytes = swidget->lifetime_bytes;
3179-
dp_mem_data->shared_bytes = swidget->shared_bytes;
3180-
ext_pos += DIV_ROUND_UP(sizeof(*dp_mem_data), sizeof(u32));
3181+
/* Add following object array items here */
3182+
3183+
if (!hdr) {
3184+
/*
3185+
* NOTE: Remove this early bail out, when struct
3186+
* sof_ipc4_module_init_ext_init alone has some
3187+
* function.
3188+
*/
3189+
kfree(payload);
3190+
return 0;
31813191
}
3182-
/* If another array object is added, remember clear previous OBJ_LAST bit */
3192+
3193+
ext_init->word0 |= SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_MASK;
3194+
hdr->header |= SOF_IPC4_MOD_INIT_EXT_OBJ_LAST_MASK;
31833195

31843196
/* Calculate final size and check that it fits to max payload size */
31853197
new_size = ext_pos * sizeof(u32) + ipc_size;

0 commit comments

Comments
 (0)