77// Author: Jun Lai <jun.lai@dolby.com>
88//
99
10- #include <stdio.h>
11-
1210#include <rtos/atomic.h>
1311#include <rtos/init.h>
1412#include <sof/audio/data_blob.h>
1513#include <sof/audio/module_adapter/module/generic.h>
1614#include <sof/compiler_attributes.h>
17- #include <sof/debug/debug.h>
1815
19- #include <dax_inf.h>
16+ #include "dax.h"
2017
2118LOG_MODULE_REGISTER (dolby_dax_audio_processing , CONFIG_SOF_LOG_LEVEL );
2219SOF_DEFINE_REG_UUID (dolby_dax_audio_processing );
@@ -38,11 +35,6 @@ SOF_DEFINE_REG_UUID(dolby_dax_audio_processing);
3835#define DAX_ENUM_PROFILE_CONTROL_ID 0
3936#define DAX_ENUM_DEVICE_CONTROL_ID 1
4037
41- struct dax_adapter_data {
42- struct sof_dax dax_ctx ;
43- atomic_t proc_flags ;
44- };
45-
4638enum dax_flag_opt_mode {
4739 DAX_FLAG_READ = 0 ,
4840 DAX_FLAG_SET ,
@@ -192,7 +184,7 @@ static int sof_to_dax_buffer_layout(enum sof_ipc_buffer_format sof_buf_fmt)
192184 }
193185}
194186
195- static void dax_buffer_release (struct processing_module * mod , struct dax_buffer * dax_buff )
187+ void dax_buffer_release (struct processing_module * mod , struct dax_buffer * dax_buff )
196188{
197189 if (dax_buff -> addr ) {
198190 mod_free (mod , dax_buff -> addr );
@@ -203,8 +195,7 @@ static void dax_buffer_release(struct processing_module *mod, struct dax_buffer
203195 dax_buff -> free = 0 ;
204196}
205197
206- static int dax_buffer_alloc (struct processing_module * mod ,
207- struct dax_buffer * dax_buff , uint32_t bytes )
198+ int dax_buffer_alloc (struct processing_module * mod , struct dax_buffer * dax_buff , uint32_t bytes )
208199{
209200 dax_buffer_release (mod , dax_buff );
210201 dax_buff -> addr = mod_balloc (mod , bytes );
@@ -241,53 +232,12 @@ static void dax_buffer_produce(struct dax_buffer *dax_buff, uint32_t bytes)
241232 dax_buff -> free = dax_buff -> size - dax_buff -> avail ;
242233}
243234
244- static void destroy_instance (struct processing_module * mod )
235+ static bool is_enabled (struct processing_module * mod )
245236{
246237 struct dax_adapter_data * adapter_data = module_get_private_data (mod );
247238 struct sof_dax * dax_ctx = & adapter_data -> dax_ctx ;
248239
249- dax_free (dax_ctx ); /* free internal dax instance in dax_ctx */
250- dax_buffer_release (mod , & dax_ctx -> persist_buffer );
251- dax_buffer_release (mod , & dax_ctx -> scratch_buffer );
252- }
253-
254- static int establish_instance (struct processing_module * mod )
255- {
256- int ret = 0 ;
257- struct comp_dev * dev = mod -> dev ;
258- struct dax_adapter_data * adapter_data = module_get_private_data (mod );
259- struct sof_dax * dax_ctx = & adapter_data -> dax_ctx ;
260- uint32_t persist_sz ;
261- uint32_t scratch_sz ;
262-
263- persist_sz = dax_query_persist_memory (dax_ctx );
264- if (dax_buffer_alloc (mod , & dax_ctx -> persist_buffer , persist_sz ) != 0 ) {
265- comp_err (dev , "allocate %u bytes failed for persist" , persist_sz );
266- ret = - ENOMEM ;
267- goto err ;
268- }
269- scratch_sz = dax_query_scratch_memory (dax_ctx );
270- if (dax_buffer_alloc (mod , & dax_ctx -> scratch_buffer , scratch_sz ) != 0 ) {
271- comp_err (dev , "allocate %u bytes failed for scratch" , scratch_sz );
272- ret = - ENOMEM ;
273- goto err ;
274- }
275- ret = dax_init (dax_ctx );
276- if (ret != 0 ) {
277- comp_err (dev , "dax instance initialization failed, ret %d" , ret );
278- goto err ;
279- }
280-
281- /* set DAX_ENABLE_MASK bit to trigger the fully update of kcontrol values */
282- flag_process (adapter_data , DAX_ENABLE_MASK , DAX_FLAG_SET );
283-
284- comp_info (dev , "allocated: persist %u, scratch %u. version: %s" ,
285- persist_sz , scratch_sz , dax_get_version ());
286- return 0 ;
287-
288- err :
289- destroy_instance (mod );
290- return ret ;
240+ return dax_ctx -> enable && dax_ctx -> p_dax ;
291241}
292242
293243static int set_tuning_file (struct processing_module * mod , void * value , uint32_t size )
@@ -313,18 +263,11 @@ static int set_tuning_file(struct processing_module *mod, void *value, uint32_t
313263
314264static int set_enable (struct processing_module * mod , int32_t enable )
315265{
316- int ret = 0 ;
266+ int ret ;
317267 struct dax_adapter_data * adapter_data = module_get_private_data (mod );
318268 struct sof_dax * dax_ctx = & adapter_data -> dax_ctx ;
319269
320- if (enable ) {
321- ret = dax_set_enable (1 , dax_ctx );
322- dax_ctx -> enable = (ret == 0 ? 1 : 0 );
323- } else {
324- dax_ctx -> enable = 0 ;
325- dax_set_enable (0 , dax_ctx );
326- }
327-
270+ ret = dax_set_enable (enable , dax_ctx );
328271 comp_info (mod -> dev , "set dax enable %d, ret %d" , enable , ret );
329272 return ret ;
330273}
@@ -335,10 +278,6 @@ static int set_volume(struct processing_module *mod, int32_t abs_volume)
335278 struct dax_adapter_data * adapter_data = module_get_private_data (mod );
336279 struct sof_dax * dax_ctx = & adapter_data -> dax_ctx ;
337280
338- dax_ctx -> volume = abs_volume ;
339- if (!dax_ctx -> enable )
340- return 0 ;
341-
342281 ret = dax_set_volume (abs_volume , dax_ctx );
343282 comp_info (mod -> dev , "set volume %d, ret %d" , abs_volume , ret );
344283 return ret ;
@@ -350,9 +289,7 @@ static int set_device(struct processing_module *mod, int32_t out_device)
350289 struct dax_adapter_data * adapter_data = module_get_private_data (mod );
351290 struct sof_dax * dax_ctx = & adapter_data -> dax_ctx ;
352291
353- dax_ctx -> out_device = out_device ;
354292 ret = dax_set_device (out_device , dax_ctx );
355-
356293 comp_info (mod -> dev , "set device %d, ret %d" , out_device , ret );
357294 return ret ;
358295}
@@ -363,9 +300,7 @@ static int set_crosstalk_cancellation_enable(struct processing_module *mod, int3
363300 struct dax_adapter_data * adapter_data = module_get_private_data (mod );
364301 struct sof_dax * dax_ctx = & adapter_data -> dax_ctx ;
365302
366- dax_ctx -> ctc_enable = enable ;
367303 ret = dax_set_ctc_enable (enable , dax_ctx );
368-
369304 comp_info (mod -> dev , "set ctc enable %d, ret %d" , enable , ret );
370305 return ret ;
371306}
@@ -381,14 +316,9 @@ static int set_profile(struct processing_module *mod, int32_t profile_id)
381316 uint32_t params_sz = 0 ;
382317 void * params ;
383318
384- dax_ctx -> profile = profile_id ;
385- if (!dax_ctx -> enable )
386- return 0 ;
387-
388319 params = dax_find_params (DAX_PARAM_ID_PROFILE , profile_id , & params_sz , dax_ctx );
389320 if (params )
390321 ret = update_params_from_buffer (mod , params , params_sz );
391-
392322 comp_info (dev , "switched to profile %d, ret %d" , profile_id , ret );
393323 return ret ;
394324}
@@ -402,14 +332,9 @@ static int set_tuning_device(struct processing_module *mod, int32_t tuning_devic
402332 uint32_t params_sz = 0 ;
403333 void * params ;
404334
405- dax_ctx -> tuning_device = tuning_device ;
406- if (!dax_ctx -> enable )
407- return 0 ;
408-
409335 params = dax_find_params (DAX_PARAM_ID_TUNING_DEVICE , tuning_device , & params_sz , dax_ctx );
410336 if (params )
411337 ret = update_params_from_buffer (mod , params , params_sz );
412-
413338 comp_info (dev , "switched to tuning device %d, ret %d" , tuning_device , ret );
414339 return ret ;
415340}
@@ -423,14 +348,9 @@ static int set_content_processing_enable(struct processing_module *mod, int32_t
423348 uint32_t params_sz = 0 ;
424349 void * params ;
425350
426- dax_ctx -> content_processing_enable = enable ;
427- if (!dax_ctx -> enable )
428- return 0 ;
429-
430351 params = dax_find_params (DAX_PARAM_ID_CP_ENABLE , enable , & params_sz , dax_ctx );
431352 if (params )
432353 ret = update_params_from_buffer (mod , params , params_sz );
433-
434354 comp_info (dev , "set content processing enable %d, ret %d" , enable , ret );
435355 return ret ;
436356}
@@ -539,17 +459,34 @@ static int update_params_from_buffer(struct processing_module *mod, void *data,
539459
540460static void check_and_update_settings (struct processing_module * mod )
541461{
462+ int ret ;
542463 struct dax_adapter_data * adapter_data = module_get_private_data (mod );
543464 struct sof_dax * dax_ctx = & adapter_data -> dax_ctx ;
544465
466+ /* ret equals to 0 mean a new creation or destruction of dax instance */
467+ ret = dax_check_and_update_instance (mod );
468+ if (ret == 0 ) {
469+ if (is_enabled (mod ) /* A new creation */ ) {
470+ /* set DAX_ENABLE_MASK bit to trigger the fully update of kcontrol values */
471+ flag_process (adapter_data , DAX_ENABLE_MASK , DAX_FLAG_SET );
472+ } else if (!dax_ctx -> p_dax /* A new destruction */ ) {
473+ set_enable (mod , 0 );
474+ comp_info (mod -> dev , "falling back to pass-through mode." );
475+ }
476+ }
477+
545478 if (flag_process (adapter_data , DAX_ENABLE_MASK , DAX_FLAG_READ_AND_CLEAR )) {
546479 set_enable (mod , dax_ctx -> enable );
547- if (dax_ctx -> enable ) {
480+ if (is_enabled ( mod ) ) {
548481 flag_process (adapter_data , DAX_DEVICE_MASK , DAX_FLAG_SET );
549482 flag_process (adapter_data , DAX_VOLUME_MASK , DAX_FLAG_SET );
550483 }
551484 return ;
552485 }
486+
487+ if (!is_enabled (mod ))
488+ return ;
489+
553490 if (flag_process (adapter_data , DAX_DEVICE_MASK , DAX_FLAG_READ_AND_CLEAR )) {
554491 set_device (mod , dax_ctx -> out_device );
555492 set_tuning_device (mod , dax_ctx -> tuning_device );
@@ -586,7 +523,7 @@ static int sof_dax_reset(struct processing_module *mod)
586523 if (flag_process (adapter_data , DAX_PROCESSING_MASK , DAX_FLAG_READ )) {
587524 flag_process (adapter_data , DAX_RESET_MASK , DAX_FLAG_SET );
588525 } else {
589- destroy_instance (mod );
526+ dax_unregister_user (mod );
590527 dax_buffer_release (mod , & dax_ctx -> input_buffer );
591528 dax_buffer_release (mod , & dax_ctx -> output_buffer );
592529 }
@@ -644,6 +581,8 @@ static int sof_dax_init(struct processing_module *mod)
644581 }
645582
646583 adapter_data = module_get_private_data (mod );
584+ adapter_data -> comp_id = dev -> ipc_config .id ;
585+ adapter_data -> priority = DAX_USER_PRIORITY_DEFAULT ;
647586 dax_ctx = & adapter_data -> dax_ctx ;
648587 dax_ctx -> enable = 0 ;
649588 dax_ctx -> profile = 0 ;
@@ -661,6 +600,8 @@ static int sof_dax_init(struct processing_module *mod)
661600 return - ENOMEM ;
662601 }
663602
603+ dax_instance_manager_init ();
604+
664605 return 0 ;
665606}
666607
@@ -757,11 +698,6 @@ static int sof_dax_prepare(struct processing_module *mod, struct sof_source **so
757698 if (ret != 0 )
758699 return ret ;
759700
760- /* dax instance will be established on prepare(), and destroyed on reset() */
761- ret = establish_instance (mod );
762- if (ret != 0 )
763- return ret ;
764-
765701 dax_ctx -> sof_period_bytes = dev -> frames *
766702 dax_ctx -> output_media_format .num_channels *
767703 dax_ctx -> output_media_format .bytes_per_sample ;
@@ -791,6 +727,9 @@ static int sof_dax_prepare(struct processing_module *mod, struct sof_source **so
791727 dax_buffer_produce (& dax_ctx -> output_buffer , dax_ctx -> output_buffer .size );
792728 comp_info (dev , "allocated: ibs %u, obs %u" , ibs , obs );
793729
730+ dax_register_user (mod );
731+ dax_check_and_update_instance (mod );
732+
794733 return 0 ;
795734
796735err :
@@ -1013,7 +952,7 @@ static const struct sof_man_module_manifest main_manifest __section(".module") _
1013952 .name = "DAX" ,
1014953 .uuid = SOF_REG_UUID (dolby_dax_audio_processing ),
1015954 .entry_point = (uint32_t )(& dolby_dax_audio_processing_interface ),
1016- .instance_max_count = 1 ,
955+ .instance_max_count = DAX_MAX_INSTANCE ,
1017956 .type = {
1018957 .load_type = SOF_MAN_MOD_TYPE_LLEXT ,
1019958 .domain_dp = 1 ,
0 commit comments