@@ -3133,28 +3133,43 @@ static int sof_ipc4_control_setup(struct snd_sof_dev *sdev, struct snd_sof_contr
31333133 return 0 ;
31343134}
31353135
3136+ static void sof_ipc4_add_init_ext_dp_memory_data (struct snd_sof_dev * sdev ,
3137+ struct snd_sof_widget * swidget ,
3138+ u32 * payload , u32 * ext_pos ,
3139+ struct sof_ipc4_module_init_ext_object * * hdr )
3140+ {
3141+ /* Add memory_data if comp_domain indicates DP */
3142+ if (swidget -> comp_domain == SOF_COMP_DOMAIN_DP ) {
3143+ struct sof_ipc4_mod_init_ext_dp_memory_data * dp_mem_data ;
3144+
3145+ * hdr = (struct sof_ipc4_module_init_ext_object * )& payload [* ext_pos ];
3146+ (* hdr )-> header =
3147+ SOF_IPC4_MOD_INIT_EXT_OBJ_ID (SOF_IPC4_MOD_INIT_DATA_ID_DP_DATA ) |
3148+ SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS (DIV_ROUND_UP (sizeof (* dp_mem_data ),
3149+ sizeof (u32 )));
3150+ * ext_pos += DIV_ROUND_UP (sizeof (* * hdr ), sizeof (u32 ));
3151+ dp_mem_data = (struct sof_ipc4_mod_init_ext_dp_memory_data * )& payload [* ext_pos ];
3152+ dp_mem_data -> domain_id = swidget -> domain_id ;
3153+ dp_mem_data -> stack_bytes = swidget -> stack_bytes ;
3154+ dp_mem_data -> interim_heap_bytes = swidget -> interim_bytes ;
3155+ dp_mem_data -> lifetime_heap_bytes = swidget -> lifetime_bytes ;
3156+ dp_mem_data -> shared_bytes = swidget -> shared_bytes ;
3157+ * ext_pos += DIV_ROUND_UP (sizeof (* dp_mem_data ), sizeof (u32 ));
3158+ }
3159+ }
3160+
31363161static int sof_ipc4_widget_mod_init_msg_payload (struct snd_sof_dev * sdev ,
31373162 struct snd_sof_widget * swidget ,
31383163 struct sof_ipc4_msg * msg ,
31393164 void * ipc_data , u32 ipc_size ,
31403165 void * * new_data )
31413166{
3142- struct sof_ipc4_mod_init_ext_dp_memory_data * dp_mem_data ;
31433167 struct sof_ipc4_module_init_ext_init * ext_init ;
3144- struct sof_ipc4_module_init_ext_object * hdr ;
3168+ struct sof_ipc4_module_init_ext_object * hdr = NULL ;
31453169 int new_size ;
31463170 u32 * payload ;
31473171 u32 ext_pos ;
31483172
3149- /* For the moment the only reason for adding init_ext_init payload is DP
3150- * memory data. If both stack and heap size are 0 (= use default), then
3151- * there is no need for init_ext_init payload.
3152- */
3153- if (swidget -> comp_domain != SOF_COMP_DOMAIN_DP ) {
3154- msg -> extension &= ~SOF_IPC4_MOD_EXT_EXTENDED_INIT_MASK ;
3155- return 0 ;
3156- }
3157-
31583173 payload = kzalloc (sdev -> ipc -> max_payload_size , GFP_KERNEL );
31593174 if (!payload )
31603175 return - ENOMEM ;
@@ -3165,25 +3180,22 @@ static int sof_ipc4_widget_mod_init_msg_payload(struct snd_sof_dev *sdev,
31653180
31663181 /* Add object array objects after ext_init */
31673182
3168- /* Add memory_data if comp_domain indicates DP */
3169- if (swidget -> comp_domain == SOF_COMP_DOMAIN_DP ) {
3170- ext_init -> word0 |= SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_MASK ;
3183+ sof_ipc4_add_init_ext_dp_memory_data (sdev , swidget , payload , & ext_pos , & hdr );
31713184
3172- hdr = (struct sof_ipc4_module_init_ext_object * )& payload [ext_pos ];
3173- hdr -> header = SOF_IPC4_MOD_INIT_EXT_OBJ_LAST_MASK |
3174- SOF_IPC4_MOD_INIT_EXT_OBJ_ID (SOF_IPC4_MOD_INIT_DATA_ID_DP_DATA ) |
3175- SOF_IPC4_MOD_INIT_EXT_OBJ_WORDS (DIV_ROUND_UP (sizeof (* dp_mem_data ),
3176- sizeof (u32 )));
3177- ext_pos += DIV_ROUND_UP (sizeof (* hdr ), sizeof (u32 ));
3178- dp_mem_data = (struct sof_ipc4_mod_init_ext_dp_memory_data * )& payload [ext_pos ];
3179- dp_mem_data -> domain_id = swidget -> domain_id ;
3180- dp_mem_data -> stack_bytes = swidget -> stack_bytes ;
3181- dp_mem_data -> interim_heap_bytes = swidget -> interim_bytes ;
3182- dp_mem_data -> lifetime_heap_bytes = swidget -> lifetime_bytes ;
3183- dp_mem_data -> shared_bytes = swidget -> shared_bytes ;
3184- ext_pos += DIV_ROUND_UP (sizeof (* dp_mem_data ), sizeof (u32 ));
3185+ /* Add following object array items here */
3186+
3187+ if (!hdr ) {
3188+ /*
3189+ * NOTE: Remove this early bail out, when struct
3190+ * sof_ipc4_module_init_ext_init alone has some
3191+ * function.
3192+ */
3193+ kfree (payload );
3194+ return 0 ;
31853195 }
3186- /* If another array object is added, remember clear previous OBJ_LAST bit */
3196+
3197+ ext_init -> word0 |= SOF_IPC4_MOD_INIT_EXT_OBJ_ARRAY_MASK ;
3198+ hdr -> header |= SOF_IPC4_MOD_INIT_EXT_OBJ_LAST_MASK ;
31873199
31883200 /* Calculate final size and check that it fits to max payload size */
31893201 new_size = ext_pos * sizeof (u32 ) + ipc_size ;
0 commit comments