@@ -703,7 +703,7 @@ impl CrosEc {
703703 /// | 3C000 | 3FFFF | 04000 | Preserved |
704704 /// | 40000 | 3C000 | 39000 | RO Region |
705705 /// | 79000 | 79FFF | 01000 | Flash Flags |
706- pub fn reflash ( & self , data : & [ u8 ] , ft : EcFlashType ) -> EcResult < ( ) > {
706+ pub fn reflash ( & self , data : & [ u8 ] , ft : EcFlashType , dry_run : bool ) -> EcResult < ( ) > {
707707 let mut res = Ok ( ( ) ) ;
708708 if ft == EcFlashType :: Full || ft == EcFlashType :: Ro {
709709 if let Some ( version) = ec_binary:: read_ec_version ( data, true ) {
@@ -724,11 +724,6 @@ impl CrosEc {
724724 }
725725 }
726726
727- if ft == EcFlashType :: Full || ft == EcFlashType :: Ro {
728- println ! ( "For safety reasons flashing RO firmware is disabled." ) ;
729- return Ok ( ( ) ) ;
730- }
731-
732727 println ! ( "Unlocking flash" ) ;
733728 self . flash_notify ( MecFlashNotify :: AccessSpi ) ?;
734729 self . flash_notify ( MecFlashNotify :: FirmwareStart ) ?;
@@ -741,12 +736,12 @@ impl CrosEc {
741736 if ft == EcFlashType :: Full || ft == EcFlashType :: Rw {
742737 let rw_data = & data[ FLASH_RW_BASE as usize ..( FLASH_RW_BASE + FLASH_RW_SIZE ) as usize ] ;
743738
744- println ! ( "Erasing RW region" ) ;
745- self . erase_ec_flash ( FLASH_BASE + FLASH_RW_BASE , FLASH_RW_SIZE ) ?;
739+ println ! ( "Erasing RW region{}" , if dry_run { " (DRY RUN)" } else { "" } ) ;
740+ self . erase_ec_flash ( FLASH_BASE + FLASH_RW_BASE , FLASH_RW_SIZE , dry_run ) ?;
746741 println ! ( " Done" ) ;
747742
748- println ! ( "Writing RW region" ) ;
749- self . write_ec_flash ( FLASH_BASE + FLASH_RW_BASE , rw_data) ?;
743+ println ! ( "Writing RW region{}" , if dry_run { " (DRY RUN)" } else { "" } ) ;
744+ self . write_ec_flash ( FLASH_BASE + FLASH_RW_BASE , rw_data, dry_run ) ?;
750745 println ! ( " Done" ) ;
751746
752747 println ! ( "Verifying RW region" ) ;
@@ -763,11 +758,11 @@ impl CrosEc {
763758 let ro_data = & data[ FLASH_RO_BASE as usize ..( FLASH_RO_BASE + FLASH_RO_SIZE ) as usize ] ;
764759
765760 println ! ( "Erasing RO region" ) ;
766- self . erase_ec_flash ( FLASH_BASE + FLASH_RO_BASE , FLASH_RO_SIZE ) ?;
761+ self . erase_ec_flash ( FLASH_BASE + FLASH_RO_BASE , FLASH_RO_SIZE , dry_run ) ?;
767762 println ! ( " Done" ) ;
768763
769764 println ! ( "Writing RO region" ) ;
770- self . write_ec_flash ( FLASH_BASE + FLASH_RO_BASE , ro_data) ?;
765+ self . write_ec_flash ( FLASH_BASE + FLASH_RO_BASE , ro_data, dry_run ) ?;
771766 println ! ( " Done" ) ;
772767
773768 println ! ( "Verifying RO region" ) ;
@@ -792,7 +787,7 @@ impl CrosEc {
792787 }
793788
794789 /// Write a big section of EC flash. Must be unlocked already
795- fn write_ec_flash ( & self , addr : u32 , data : & [ u8 ] ) -> EcResult < ( ) > {
790+ fn write_ec_flash ( & self , addr : u32 , data : & [ u8 ] , dry_run : bool ) -> EcResult < ( ) > {
796791 // TODO: Use flash info to help guide ideal chunk size
797792 // let info = EcRequestFlashInfo {}.send_command(self)?;
798793 //let chunk_size = ((0x80 / info.write_ideal_size) * info.write_ideal_size) as usize;
@@ -822,10 +817,12 @@ impl CrosEc {
822817 }
823818
824819 let chunk = & data[ offset..offset + cur_chunk_size] ;
825- let res = self . write_ec_flash_chunk ( addr + offset as u32 , chunk) ;
826- if let Err ( err) = res {
827- println ! ( " Failed to write chunk: {:?}" , err) ;
828- return Err ( err) ;
820+ if !dry_run {
821+ let res = self . write_ec_flash_chunk ( addr + offset as u32 , chunk) ;
822+ if let Err ( err) = res {
823+ println ! ( " Failed to write chunk: {:?}" , err) ;
824+ return Err ( err) ;
825+ }
829826 }
830827 }
831828 println ! ( ) ;
@@ -843,7 +840,7 @@ impl CrosEc {
843840 . send_command_extra ( self , data)
844841 }
845842
846- fn erase_ec_flash ( & self , offset : u32 , size : u32 ) -> EcResult < ( ) > {
843+ fn erase_ec_flash ( & self , offset : u32 , size : u32 , dry_run : bool ) -> EcResult < ( ) > {
847844 // Erasing a big section takes too long sometimes and the linux kernel driver times out, so
848845 // split it up into chunks. One chunk is 1/8 of EC ROM size.
849846 let chunk_size = 0x10000 ;
@@ -860,11 +857,13 @@ impl CrosEc {
860857 "EcRequestFlashErase (0x{:05X}, 0x{:05X})" ,
861858 cur_offset, cur_size
862859 ) ;
863- EcRequestFlashErase {
864- offset : cur_offset,
865- size : cur_size,
860+ if !dry_run {
861+ EcRequestFlashErase {
862+ offset : cur_offset,
863+ size : cur_size,
864+ }
865+ . send_command ( self ) ?;
866866 }
867- . send_command ( self ) ?;
868867 cur_offset += chunk_size;
869868 }
870869 Ok ( ( ) )
0 commit comments