Skip to content

Commit 5d6a43c

Browse files
committed
rimage: manifest: add manifest APIs
add the 1.5 manifest operation APIs Signed-off-by: Zhu Yingjiang <yingjiang.zhu@linux.intel.com>
1 parent dc17f28 commit 5d6a43c

1 file changed

Lines changed: 162 additions & 0 deletions

File tree

rimage/manifest.c

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,19 @@ static int man_open_manifest_file(struct image *image)
8282
return 0;
8383
}
8484

85+
static int man_init_image_v1_5(struct image *image)
86+
{
87+
/* allocate image and copy template manifest */
88+
image->fw_image = calloc(image->adsp->image_size, 1);
89+
if (!image->fw_image)
90+
return -ENOMEM;
91+
92+
memcpy(image->fw_image, image->adsp->man_v1_5,
93+
sizeof(struct fw_image_manifest_v1_5));
94+
95+
return 0;
96+
}
97+
8598
static int man_init_image_v1_8(struct image *image)
8699
{
87100
/* allocate image and copy template manifest */
@@ -652,6 +665,84 @@ static int man_hash_modules(struct image *image, struct sof_man_fw_desc *desc)
652665
return 0;
653666
}
654667

668+
/* used by others */
669+
static int man_write_fw_v1_5(struct image *image)
670+
{
671+
struct sof_man_fw_desc *desc;
672+
struct fw_image_manifest_v1_5 *m;
673+
int ret;
674+
675+
/* init image */
676+
ret = man_init_image_v1_5(image);
677+
if (ret < 0)
678+
goto err;
679+
680+
/* open ROM image */
681+
ret = man_open_rom_file(image);
682+
if (ret < 0)
683+
goto err;
684+
685+
/* open unsigned firmware */
686+
ret = man_open_unsigned_file(image);
687+
if (ret < 0)
688+
goto err;
689+
690+
/* create the manifest */
691+
ret = man_open_manifest_file(image);
692+
if (ret < 0)
693+
goto err;
694+
695+
/* create the module */
696+
m = image->fw_image;
697+
desc = image->fw_image + MAN_DESC_OFFSET;
698+
699+
/* create each module */
700+
m->desc.header.num_module_entries = image->num_modules;
701+
man_create_modules(image, desc);
702+
703+
fprintf(stdout, "Firmware completing manifest v1.5\n");
704+
705+
/* create structures from end of file to start of file */
706+
ri_adsp_meta_data_create(image, MAN_META_EXT_OFFSET_V1_8,
707+
MAN_FW_DESC_OFFSET_V1_8);
708+
ri_plat_ext_data_create(image);
709+
ri_css_hdr_create_v1_8(image);
710+
ri_cse_create(image);
711+
712+
fprintf(stdout, "Firmware file size 0x%x page count %d\n",
713+
FILE_TEXT_OFFSET - MAN_DESC_OFFSET + image->image_end,
714+
desc->header.preload_page_count);
715+
716+
/* calculate hash for each module */
717+
man_hash_modules(image, desc);
718+
719+
/* sign manifest */
720+
ret = ri_manifest_sign_v1_5(image);
721+
if (ret < 0)
722+
goto err;
723+
724+
/* write the firmware */
725+
ret = man_write_fw_mod(image);
726+
if (ret < 0)
727+
goto err;
728+
729+
/* write the unsigned files*/
730+
ret = man_write_unsigned_mod(image, MAN_META_EXT_OFFSET_V1_8,
731+
MAN_FW_DESC_OFFSET_V1_8);
732+
if (ret < 0)
733+
goto err;
734+
735+
fprintf(stdout, "Firmware manifest and signing completed !\n");
736+
return 0;
737+
738+
err:
739+
free(image->rom_image);
740+
free(image->fw_image);
741+
unlink(image->out_file);
742+
unlink(image->out_rom_file);
743+
return ret;
744+
}
745+
655746
/* used by others */
656747
static int man_write_fw_v1_8(struct image *image)
657748
{
@@ -746,6 +837,77 @@ static int man_write_fw_v1_8(struct image *image)
746837
return ret;
747838
}
748839

840+
/* used to sign with MEU */
841+
static int man_write_fw_meu_v1_5(struct image *image)
842+
{
843+
const int meta_start_offset = image->meu_offset -
844+
sizeof(struct sof_man_adsp_meta_file_ext) - MAN_EXT_PADDING;
845+
struct sof_man_adsp_meta_file_ext *meta;
846+
struct sof_man_fw_desc *desc;
847+
uint32_t preload_size;
848+
int ret;
849+
850+
/* allocate image */
851+
image->fw_image = calloc(image->adsp->image_size, 1);
852+
if (!image->fw_image) {
853+
ret = -ENOMEM;
854+
goto err;
855+
}
856+
857+
/* open unsigned firmware */
858+
ret = man_open_unsigned_file(image);
859+
if (ret < 0)
860+
goto err;
861+
862+
/* create the manifest */
863+
ret = man_open_manifest_file(image);
864+
if (ret < 0)
865+
goto err;
866+
867+
/* create the module */
868+
meta = image->fw_image + meta_start_offset;
869+
desc = image->fw_image + MAN_DESC_OFFSET;
870+
871+
/* copy data */
872+
memcpy(desc, &image->adsp->man_v1_5->desc,
873+
sizeof(struct sof_man_fw_desc));
874+
875+
/* create each module */
876+
desc->header.num_module_entries = image->num_modules;
877+
man_create_modules(image, desc);
878+
879+
fprintf(stdout, "Firmware completing manifest v1.5\n");
880+
881+
/* create structures from end of file to start of file */
882+
ri_adsp_meta_data_create(image, meta_start_offset, image->meu_offset);
883+
884+
/* write preload page count */
885+
preload_size = meta->comp_desc[0].limit_offset - MAN_DESC_OFFSET;
886+
preload_size += MAN_PAGE_SIZE - (preload_size % MAN_PAGE_SIZE);
887+
desc->header.preload_page_count = preload_size / MAN_PAGE_SIZE;
888+
889+
/* calculate hash for each module */
890+
man_hash_modules(image, desc);
891+
892+
/* calculate hash for ADSP meta data extension */
893+
ri_hash(image, image->meu_offset, image->image_end -
894+
image->meu_offset, meta->comp_desc[0].hash);
895+
896+
/* write the unsigned files */
897+
ret = man_write_unsigned_mod(image, meta_start_offset,
898+
image->meu_offset);
899+
if (ret < 0)
900+
goto err;
901+
902+
fprintf(stdout, "Firmware manifest completed!\n");
903+
return 0;
904+
905+
err:
906+
free(image->fw_image);
907+
unlink(image->out_file);
908+
return ret;
909+
}
910+
749911
/* used to sign with MEU */
750912
static int man_write_fw_meu_v1_8(struct image *image)
751913
{

0 commit comments

Comments
 (0)