@@ -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+
31323157static 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