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