Skip to content

Commit 9e793ed

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 eb13b52 commit 9e793ed

File tree

1 file changed

+41
-28
lines changed

1 file changed

+41
-28
lines changed

sound/soc/sof/ipc4-topology.c

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3064,28 +3064,43 @@ static int sof_ipc4_control_setup(struct snd_sof_dev *sdev, struct snd_sof_contr
30643064
return 0;
30653065
}
30663066

3067+
static void sof_ipc4_add_init_ext_dp_memory_data(struct snd_sof_dev *sdev,
3068+
struct snd_sof_widget *swidget,
3069+
u32 *payload, u32 *ext_pos,
3070+
struct sof_ipc4_module_init_ext_object **hdr)
3071+
{
3072+
/* Add memory_data if comp_domain indicates DP */
3073+
if (swidget->comp_domain == SOF_COMP_DOMAIN_DP) {
3074+
struct sof_ipc4_mod_init_ext_dp_memory_data *dp_mem_data;
3075+
3076+
*hdr = (struct sof_ipc4_module_init_ext_object *)&payload[*ext_pos];
3077+
(*hdr)->header =
3078+
SOF_IPC4_MOD_INIT_EXT_OBJ_ID(SOF_IPC4_MOD_INIT_DATA_ID_DP_DATA) |
3079+
SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS(DIV_ROUND_UP(sizeof(*dp_mem_data),
3080+
sizeof(u32)));
3081+
*ext_pos += DIV_ROUND_UP(sizeof(**hdr), sizeof(u32));
3082+
dp_mem_data = (struct sof_ipc4_mod_init_ext_dp_memory_data *)&payload[*ext_pos];
3083+
dp_mem_data->domain_id = swidget->domain_id;
3084+
dp_mem_data->stack_bytes = swidget->stack_bytes;
3085+
dp_mem_data->interim_heap_bytes = swidget->interim_bytes;
3086+
dp_mem_data->lifetime_heap_bytes = swidget->lifetime_bytes;
3087+
dp_mem_data->shared_bytes = swidget->shared_bytes;
3088+
*ext_pos += DIV_ROUND_UP(sizeof(*dp_mem_data), sizeof(u32));
3089+
}
3090+
}
3091+
30673092
static int sof_ipc4_widget_mod_init_msg_payload(struct snd_sof_dev *sdev,
30683093
struct snd_sof_widget *swidget,
30693094
struct sof_ipc4_msg *msg,
30703095
void *ipc_data, u32 ipc_size,
30713096
void **new_data)
30723097
{
3073-
struct sof_ipc4_mod_init_ext_dp_memory_data *dp_mem_data;
30743098
struct sof_ipc4_module_init_ext_init *ext_init;
3075-
struct sof_ipc4_module_init_ext_object *hdr;
3099+
struct sof_ipc4_module_init_ext_object *hdr = NULL;
30763100
int new_size;
30773101
u32 *payload;
30783102
u32 ext_pos;
30793103

3080-
/* For the moment the only reason for adding init_ext_init payload is DP
3081-
* memory data. If both stack and heap size are 0 (= use default), then
3082-
* there is no need for init_ext_init payload.
3083-
*/
3084-
if (swidget->comp_domain != SOF_COMP_DOMAIN_DP) {
3085-
msg->extension &= ~SOF_IPC4_MOD_EXT_EXTENDED_INIT_MASK;
3086-
return 0;
3087-
}
3088-
30893104
payload = kzalloc(sdev->ipc->max_payload_size, GFP_KERNEL);
30903105
if (!payload)
30913106
return -ENOMEM;
@@ -3096,25 +3111,23 @@ static int sof_ipc4_widget_mod_init_msg_payload(struct snd_sof_dev *sdev,
30963111

30973112
/* Add object array objects after ext_init */
30983113

3099-
/* Add memory_data if comp_domain indicates DP */
3100-
if (swidget->comp_domain == SOF_COMP_DOMAIN_DP) {
3101-
ext_init->word0 |= SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_MASK;
3114+
sof_ipc4_add_init_ext_dp_memory_data(sdev, swidget, payload, &ext_pos, &hdr);
3115+
3116+
/* Add following object array items here */
31023117

3103-
hdr = (struct sof_ipc4_module_init_ext_object *)&payload[ext_pos];
3104-
hdr->header = SOF_IPC4_MOD_INIT_EXT_OBJ_LAST_MASK |
3105-
SOF_IPC4_MOD_INIT_EXT_OBJ_ID(SOF_IPC4_MOD_INIT_DATA_ID_DP_DATA) |
3106-
SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS(DIV_ROUND_UP(sizeof(*dp_mem_data),
3107-
sizeof(u32)));
3108-
ext_pos += DIV_ROUND_UP(sizeof(*hdr), sizeof(u32));
3109-
dp_mem_data = (struct sof_ipc4_mod_init_ext_dp_memory_data *)&payload[ext_pos];
3110-
dp_mem_data->domain_id = swidget->domain_id;
3111-
dp_mem_data->stack_bytes = swidget->stack_bytes;
3112-
dp_mem_data->interim_heap_bytes = swidget->interim_bytes;
3113-
dp_mem_data->lifetime_heap_bytes = swidget->lifetime_bytes;
3114-
dp_mem_data->shared_bytes = swidget->shared_bytes;
3115-
ext_pos += DIV_ROUND_UP(sizeof(*dp_mem_data), sizeof(u32));
3116-
}
31173118
/* If another array object is added, remember clear previous OBJ_LAST bit */
3119+
if (hdr) {
3120+
ext_init->word0 |= SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_MASK;
3121+
hdr->header |= SOF_IPC4_MOD_INIT_EXT_OBJ_LAST_MASK;
3122+
} else {
3123+
/*
3124+
* NOTE: Remove this early bail out, when struct
3125+
* sof_ipc4_module_init_ext_init alone has some
3126+
* function.
3127+
*/
3128+
kfree(payload);
3129+
return 0;
3130+
}
31183131

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

0 commit comments

Comments
 (0)