@@ -694,32 +694,75 @@ static int man_create_modules(struct image *image, struct sof_man_fw_desc *desc,
694694 return 0 ;
695695}
696696
697- static void man_create_modules_in_config (struct image * image , struct sof_man_fw_desc * desc )
697+ /* Copy module "mod_cfg" entries from TOML to manifest */
698+ static int man_create_modules_in_config (struct image * image , struct sof_man_fw_desc * desc )
698699{
699700 struct fw_image_manifest_module * modules ;
700701 struct sof_man_module * man_module ;
701- void * cfg_start ;
702+ uint8_t * cfg_start ;
702703 int i ;
703704
704705 modules = image -> adsp -> modules ;
705706 if (!modules )
706- return ;
707-
708- if (!image -> loadable_module )
709- /* skip modules passed as parameters. Their manifests have
710- * already been copied by the man_create_modules function. */
711- for (i = image -> num_modules ; i < modules -> mod_man_count ; i ++ ) {
712- man_module = (void * )desc + SOF_MAN_MODULE_OFFSET (i );
713- memcpy (man_module , & modules -> mod_man [i ], sizeof (* man_module ));
707+ return 0 ;
708+
709+ if (image -> reloc ) {
710+ /* Number of struct sof_man_mod_config entries for the current module */
711+ unsigned int offset = 0 ;
712+
713+ cfg_start = (uint8_t * )desc + SOF_MAN_MODULE_OFFSET (modules -> output_mod_cfg_count );
714+
715+ /*
716+ * Modules in the output file don't have to follow in the same order
717+ * as in TOML. Moreover, the TOML configuration is global, it contains
718+ * all the modules, enabled for this platform, whereas when building
719+ * libraries we need to select only configurations for included modules.
720+ * This loop finds and copies each such configuration individually.
721+ */
722+ for (i = 0 , man_module = (struct sof_man_module * )((uint8_t * )desc +
723+ SOF_MAN_MODULE_OFFSET (0 ));
724+ i < modules -> output_mod_cfg_count ;
725+ i ++ , man_module ++ ) {
726+ int j = man_module_find_cfg (modules , man_module );
727+
728+ if (j < 0 )
729+ return j ;
730+
731+ man_module -> cfg_offset = offset ;
732+
733+ /* Copy configuration for the module */
734+ size_t size = modules -> mod_man [j ].cfg_count *
735+ sizeof (struct sof_man_mod_config );
736+
737+ memcpy (cfg_start , modules -> mod_cfg + modules -> mod_man [j ].cfg_offset , size );
738+
739+ cfg_start += size ;
740+ offset += modules -> mod_man [j ].cfg_count ;
714741 }
715- else
716- i = modules -> mod_man_count ;
717742
718- /* We need to copy the configurations for all modules. */
719- cfg_start = (void * )desc + SOF_MAN_MODULE_OFFSET (i );
720- memcpy (cfg_start , modules -> mod_cfg , modules -> mod_cfg_count * sizeof (struct sof_man_mod_config ));
743+ /* Update module count */
744+ desc -> header .num_module_entries = modules -> output_mod_cfg_count ;
745+ } else {
746+ if (image -> loadable_module )
747+ i = modules -> mod_man_count ;
748+ else
749+ /* skip modules passed as parameters. Their manifests have
750+ * already been copied by the man_create_modules function. */
751+ for (i = image -> num_modules ; i < modules -> mod_man_count ; i ++ ) {
752+ man_module = (void * )desc + SOF_MAN_MODULE_OFFSET (i );
753+ memcpy (man_module , & modules -> mod_man [i ], sizeof (* man_module ));
754+ }
755+
756+ /* We need to copy the configurations for all modules. */
757+ cfg_start = (uint8_t * )desc + SOF_MAN_MODULE_OFFSET (i );
758+ memcpy (cfg_start , modules -> mod_cfg ,
759+ modules -> mod_cfg_count * sizeof (struct sof_man_mod_config ));
760+
761+ /* Update module count */
762+ desc -> header .num_module_entries = modules -> mod_man_count ;
763+ }
721764
722- desc -> header . num_module_entries = modules -> mod_man_count ;
765+ return 0 ;
723766}
724767
725768static int man_hash_modules (struct image * image , struct sof_man_fw_desc * desc )
@@ -1474,7 +1517,9 @@ int man_write_fw_ace_v1_5(struct image *image)
14741517 goto err ;
14751518
14761519 /* platform config defines some modules except bringup & base modules */
1477- man_create_modules_in_config (image , desc );
1520+ ret = man_create_modules_in_config (image , desc );
1521+ if (ret )
1522+ goto err ;
14781523
14791524 fprintf (stdout , "Firmware completing manifest v2.5\n" );
14801525
0 commit comments