@@ -29,8 +29,8 @@ struct comp_data_blob_handler {
2929 uint32_t single_blob :1 ; /**< Allocate only one blob. Module can not
3030 * be active while reconfguring.
3131 */
32- void * (* alloc )(size_t size ); /**< alternate allocator, maybe null */
33- void (* free )(void * buf ); /**< alternate free() , maybe null */
32+ void * (* alloc )(struct comp_data_blob_handler * , size_t ); /**< allocator, maybe null */
33+ void (* free )(struct comp_data_blob_handler * , void * ); /**< deallocator , maybe null */
3434
3535 /** validator for new data, maybe null */
3636 int (* validator )(struct comp_dev * dev , void * new_data , uint32_t new_data_size );
@@ -43,8 +43,8 @@ static void comp_free_data_blob(struct comp_data_blob_handler *blob_handler)
4343 if (!blob_handler -> data )
4444 return ;
4545
46- blob_handler -> free (blob_handler -> data );
47- blob_handler -> free (blob_handler -> data_new );
46+ blob_handler -> free (blob_handler , blob_handler -> data );
47+ blob_handler -> free (blob_handler , blob_handler -> data_new );
4848 blob_handler -> data = NULL ;
4949 blob_handler -> data_new = NULL ;
5050 blob_handler -> data_size = 0 ;
@@ -75,7 +75,7 @@ void *comp_get_data_blob(struct comp_data_blob_handler *blob_handler,
7575 comp_dbg (blob_handler -> dev , "new data available" );
7676
7777 /* Free "old" data blob and set data to data_new pointer */
78- blob_handler -> free (blob_handler -> data );
78+ blob_handler -> free (blob_handler , blob_handler -> data );
7979 blob_handler -> data = blob_handler -> data_new ;
8080 blob_handler -> data_size = blob_handler -> new_data_size ;
8181
@@ -143,7 +143,7 @@ int comp_init_data_blob(struct comp_data_blob_handler *blob_handler,
143143 return 0 ;
144144
145145 /* Data blob allocation */
146- blob_handler -> data = blob_handler -> alloc (size );
146+ blob_handler -> data = blob_handler -> alloc (blob_handler , size );
147147 if (!blob_handler -> data ) {
148148 comp_err (blob_handler -> dev , "model->data allocation failed" );
149149 return - ENOMEM ;
@@ -232,7 +232,7 @@ int comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
232232
233233 if (blob_handler -> single_blob ) {
234234 if (data_offset_size != blob_handler -> data_size ) {
235- blob_handler -> free (blob_handler -> data );
235+ blob_handler -> free (blob_handler , blob_handler -> data );
236236 blob_handler -> data = NULL ;
237237 } else {
238238 blob_handler -> data_new = blob_handler -> data ;
@@ -241,7 +241,7 @@ int comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
241241 }
242242
243243 if (!blob_handler -> data_new ) {
244- blob_handler -> data_new = blob_handler -> alloc (data_offset_size );
244+ blob_handler -> data_new = blob_handler -> alloc (blob_handler , data_offset_size );
245245 if (!blob_handler -> data_new ) {
246246 comp_err (blob_handler -> dev , "blob_handler->data_new allocation failed." );
247247 return - ENOMEM ;
@@ -277,7 +277,7 @@ int comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
277277 blob_handler -> new_data_size );
278278 if (ret < 0 ) {
279279 comp_err (blob_handler -> dev , "new data is invalid! discarding it..." );
280- blob_handler -> free (blob_handler -> data_new );
280+ blob_handler -> free (blob_handler , blob_handler -> data_new );
281281 blob_handler -> data_new = NULL ;
282282 return ret ;
283283 }
@@ -288,7 +288,7 @@ int comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
288288 * the new configuration presence is checked in copy().
289289 */
290290 if (blob_handler -> dev -> state == COMP_STATE_READY ) {
291- blob_handler -> free (blob_handler -> data );
291+ blob_handler -> free (blob_handler , blob_handler -> data );
292292 blob_handler -> data = NULL ;
293293 }
294294
@@ -347,7 +347,7 @@ int ipc4_comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
347347
348348 if (blob_handler -> single_blob ) {
349349 if (data_offset != blob_handler -> data_size ) {
350- blob_handler -> free (blob_handler -> data );
350+ blob_handler -> free (blob_handler , blob_handler -> data );
351351 blob_handler -> data = NULL ;
352352 } else {
353353 blob_handler -> data_new = blob_handler -> data ;
@@ -357,7 +357,7 @@ int ipc4_comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
357357
358358 if (!blob_handler -> data_new ) {
359359 blob_handler -> data_new =
360- blob_handler -> alloc (data_offset );
360+ blob_handler -> alloc (blob_handler , data_offset );
361361
362362 if (!blob_handler -> data_new ) {
363363 comp_err (blob_handler -> dev ,
@@ -376,7 +376,7 @@ int ipc4_comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
376376 blob_handler -> new_data_size , data , valid_data_size );
377377 if (ret ) {
378378 comp_err (blob_handler -> dev , "failed to copy fragment" );
379- blob_handler -> free (blob_handler -> data_new );
379+ blob_handler -> free (blob_handler , blob_handler -> data_new );
380380 blob_handler -> data_new = NULL ;
381381 blob_handler -> new_data_size = 0 ;
382382 blob_handler -> data_pos = 0 ;
@@ -411,7 +411,7 @@ int ipc4_comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
411411 data , valid_data_size );
412412 if (ret ) {
413413 comp_err (blob_handler -> dev , "failed to copy fragment" );
414- blob_handler -> free (blob_handler -> data_new );
414+ blob_handler -> free (blob_handler , blob_handler -> data_new );
415415 blob_handler -> data_new = NULL ;
416416 blob_handler -> new_data_size = 0 ;
417417 blob_handler -> data_pos = 0 ;
@@ -431,7 +431,7 @@ int ipc4_comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
431431 * the new configuration presence is checked in copy().
432432 */
433433 if (blob_handler -> dev -> state == COMP_STATE_READY ) {
434- blob_handler -> free (blob_handler -> data );
434+ blob_handler -> free (blob_handler , blob_handler -> data );
435435 blob_handler -> data = NULL ;
436436 }
437437
@@ -510,7 +510,7 @@ int comp_data_blob_set_cmd(struct comp_data_blob_handler *blob_handler,
510510
511511 if (blob_handler -> single_blob ) {
512512 if (cdata -> data -> size != blob_handler -> data_size ) {
513- blob_handler -> free (blob_handler -> data );
513+ blob_handler -> free (blob_handler , blob_handler -> data );
514514 blob_handler -> data = NULL ;
515515 } else {
516516 blob_handler -> data_new = blob_handler -> data ;
@@ -520,7 +520,7 @@ int comp_data_blob_set_cmd(struct comp_data_blob_handler *blob_handler,
520520
521521 if (!blob_handler -> data_new ) {
522522 blob_handler -> data_new =
523- blob_handler -> alloc (cdata -> data -> size );
523+ blob_handler -> alloc (blob_handler , cdata -> data -> size );
524524 if (!blob_handler -> data_new ) {
525525 comp_err (blob_handler -> dev , "blob_handler->data_new allocation failed." );
526526 return - ENOMEM ;
@@ -556,7 +556,7 @@ int comp_data_blob_set_cmd(struct comp_data_blob_handler *blob_handler,
556556 blob_handler -> new_data_size );
557557 if (ret < 0 ) {
558558 comp_err (blob_handler -> dev , "new data blob invalid, discarding" );
559- blob_handler -> free (blob_handler -> data_new );
559+ blob_handler -> free (blob_handler , blob_handler -> data_new );
560560 blob_handler -> data_new = NULL ;
561561 return ret ;
562562 }
@@ -567,7 +567,7 @@ int comp_data_blob_set_cmd(struct comp_data_blob_handler *blob_handler,
567567 * the new configuration presence is checked in copy().
568568 */
569569 if (blob_handler -> dev -> state == COMP_STATE_READY ) {
570- blob_handler -> free (blob_handler -> data );
570+ blob_handler -> free (blob_handler , blob_handler -> data );
571571 blob_handler -> data = NULL ;
572572 }
573573
@@ -659,28 +659,38 @@ int comp_data_blob_get_cmd(struct comp_data_blob_handler *blob_handler,
659659}
660660EXPORT_SYMBOL (comp_data_blob_get_cmd );
661661
662- static void * default_alloc (size_t size )
662+ static void * default_alloc (struct comp_data_blob_handler * handler , size_t size )
663663{
664+ if (handler -> dev -> mod )
665+ return sof_ctx_alloc (handler -> dev -> mod -> priv .resources .alloc ,
666+ SOF_MEM_FLAG_USER | SOF_MEM_FLAG_LARGE_BUFFER , size , 0 );
664667 return sof_heap_alloc (sof_sys_user_heap_get (),
665668 SOF_MEM_FLAG_USER | SOF_MEM_FLAG_LARGE_BUFFER , size , 0 );
666669}
667670
668- static void default_free (void * buf )
671+ static void default_free (struct comp_data_blob_handler * handler , void * buf )
669672{
670- sof_heap_free (sof_sys_user_heap_get (), buf );
673+ if (handler -> dev -> mod )
674+ sof_ctx_free (handler -> dev -> mod -> priv .resources .alloc , buf );
675+ else
676+ sof_heap_free (sof_sys_user_heap_get (), buf );
671677}
672678
673679struct comp_data_blob_handler *
674680comp_data_blob_handler_new_ext (struct comp_dev * dev , bool single_blob ,
675- void * (* alloc )(size_t size ),
676- void (* free )(void * buf ))
681+ void * (* alloc )(struct comp_data_blob_handler * , size_t ),
682+ void (* free )(struct comp_data_blob_handler * , void * ))
677683{
678684 struct comp_data_blob_handler * handler ;
679685
680686 comp_dbg (dev , "entry" );
681687
682- handler = sof_heap_alloc (sof_sys_user_heap_get (), SOF_MEM_FLAG_USER ,
683- sizeof (struct comp_data_blob_handler ), 0 );
688+ if (dev -> mod )
689+ handler = sof_ctx_alloc (dev -> mod -> priv .resources .alloc , 0 ,
690+ sizeof (struct comp_data_blob_handler ), 0 );
691+ else
692+ handler = sof_heap_alloc (sof_sys_user_heap_get (), SOF_MEM_FLAG_USER ,
693+ sizeof (struct comp_data_blob_handler ), 0 );
684694
685695 if (handler ) {
686696 memset (handler , 0 , sizeof (* handler ));
@@ -701,6 +711,9 @@ void comp_data_blob_handler_free(struct comp_data_blob_handler *blob_handler)
701711
702712 comp_free_data_blob (blob_handler );
703713
704- sof_heap_free (sof_sys_user_heap_get (), blob_handler );
714+ if (blob_handler -> dev -> mod )
715+ sof_ctx_free (blob_handler -> dev -> mod -> priv .resources .alloc , blob_handler );
716+ else
717+ sof_heap_free (sof_sys_user_heap_get (), blob_handler );
705718}
706719EXPORT_SYMBOL (comp_data_blob_handler_free );
0 commit comments