@@ -733,3 +733,87 @@ void module_adapter_free(struct comp_dev *dev)
733733 rfree (mod );
734734 rfree (dev );
735735}
736+
737+ #if CONFIG_IPC_MAJOR_4
738+ int module_set_large_config (struct comp_dev * dev , uint32_t param_id , bool first_block ,
739+ bool last_block , uint32_t data_offset_size , char * data )
740+ {
741+ struct processing_module * mod = comp_get_drvdata (dev );
742+ struct module_data * md = & mod -> priv ;
743+ enum module_cfg_fragment_position pos ;
744+ size_t fragment_size ;
745+
746+ /* set fragment position */
747+ if (first_block ) {
748+ if (last_block )
749+ pos = MODULE_CFG_FRAGMENT_SINGLE ;
750+ else
751+ pos = MODULE_CFG_FRAGMENT_FIRST ;
752+ } else {
753+ if (!last_block )
754+ pos = MODULE_CFG_FRAGMENT_MIDDLE ;
755+ else
756+ pos = MODULE_CFG_FRAGMENT_LAST ;
757+ }
758+
759+ switch (pos ) {
760+ case MODULE_CFG_FRAGMENT_SINGLE :
761+ fragment_size = data_offset_size ;
762+ break ;
763+ case MODULE_CFG_FRAGMENT_MIDDLE :
764+ case MODULE_CFG_FRAGMENT_FIRST :
765+ fragment_size = SOF_IPC_MSG_MAX_SIZE ;
766+ break ;
767+ case MODULE_CFG_FRAGMENT_LAST :
768+ fragment_size = md -> new_cfg_size - data_offset_size ;
769+ break ;
770+ default :
771+ comp_err (dev , "module_set_large_config(): invalid fragment position" );
772+ return - EINVAL ;
773+ }
774+
775+ if (md -> ops -> set_configuration )
776+ return md -> ops -> set_configuration (mod , param_id , pos , data_offset_size ,
777+ (const uint8_t * )data ,
778+ fragment_size , NULL , 0 );
779+ return 0 ;
780+ }
781+
782+ int module_get_large_config (struct comp_dev * dev , uint32_t param_id , bool first_block ,
783+ bool last_block , uint32_t * data_offset_size , char * data )
784+ {
785+ struct processing_module * mod = comp_get_drvdata (dev );
786+ struct module_data * md = & mod -> priv ;
787+ size_t fragment_size ;
788+
789+ /* set fragment size */
790+ if (first_block ) {
791+ if (last_block )
792+ fragment_size = md -> cfg .size ;
793+ else
794+ fragment_size = SOF_IPC_MSG_MAX_SIZE ;
795+ } else {
796+ if (!last_block )
797+ fragment_size = SOF_IPC_MSG_MAX_SIZE ;
798+ else
799+ fragment_size = md -> cfg .size - * data_offset_size ;
800+ }
801+
802+ if (md -> ops -> get_configuration )
803+ return md -> ops -> get_configuration (mod , param_id , data_offset_size ,
804+ (uint8_t * )data , fragment_size );
805+ return 0 ;
806+ }
807+ #else
808+ int module_set_large_config (struct comp_dev * dev , uint32_t param_id , bool first_block ,
809+ bool last_block , uint32_t data_offset , char * data )
810+ {
811+ return 0 ;
812+ }
813+
814+ int module_get_large_config (struct comp_dev * dev , uint32_t param_id , bool first_block ,
815+ bool last_block , uint32_t * data_offset , char * data )
816+ {
817+ return 0 ;
818+ }
819+ #endif
0 commit comments