Skip to content

Commit 3ead123

Browse files
lyakhlgirdwood
authored andcommitted
rimage: library: copy module configurations individually
Files on rimage command line don't have to follow in the same order as modules in TOML. Moreover, the TOML configuration is global, it contains all modules, enabled for this platform, whereas when building libraries we need to select only configurations for used modules. This patch finds and copies each such configuration individually. Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
1 parent 994784b commit 3ead123

1 file changed

Lines changed: 62 additions & 17 deletions

File tree

tools/rimage/src/manifest.c

Lines changed: 62 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

725768
static 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

Comments
 (0)