@@ -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+
8598static 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 */
656747static 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 */
750912static int man_write_fw_meu_v1_8 (struct image * image )
751913{
0 commit comments