@@ -163,7 +163,7 @@ unsafe fn flash_read<S: Spi>(spi: &mut SpiRom<S, UefiTimeout>, rom: &mut [u8], s
163163 Ok ( ( ) )
164164}
165165
166- unsafe fn flash ( firmware_data : & [ u8 ] ) -> core:: result:: Result < ( ) , ectool:: Error > {
166+ unsafe fn flash ( firmware_data : & [ u8 ] , target : SpiTarget ) -> core:: result:: Result < ( ) , ectool:: Error > {
167167 let mut ec = ectool:: Ec :: new ( UefiTimeout :: new ( 1_000_000 ) ) ?;
168168
169169 {
@@ -183,7 +183,6 @@ unsafe fn flash(firmware_data: &[u8]) -> core::result::Result<(), ectool::Error>
183183 }
184184
185185 let rom_size = 128 * 1024 ;
186- let sector_size = 1024 ;
187186
188187 let mut new_rom = firmware_data. to_vec ( ) ;
189188 while new_rom. len ( ) < rom_size {
@@ -195,6 +194,7 @@ unsafe fn flash(firmware_data: &[u8]) -> core::result::Result<(), ectool::Error>
195194 & mut spi_bus,
196195 UefiTimeout :: new ( 1_000_000 )
197196 ) ;
197+ let sector_size = spi. sector_size ( ) ;
198198
199199 let mut rom = vec ! [ 0xFF ; rom_size] ;
200200 flash_read ( & mut spi, & mut rom, sector_size) ?;
@@ -332,7 +332,18 @@ impl Component for EcComponent {
332332 EcKind :: System76 ( _) => {
333333 // System76 EC requires reset to load new firmware
334334 requires_reset = true ;
335- match unsafe { flash ( & firmware_data) } {
335+
336+ // Flash backup ROM first
337+ match unsafe { flash ( & firmware_data, SpiTarget :: Backup ) } {
338+ Ok ( ( ) ) => ( ) ,
339+ Err ( err) => {
340+ println ! ( "{} Backup Flash Error: {:X?}" , self . name( ) , err) ;
341+ return Err ( Error :: DeviceError ) ;
342+ }
343+ }
344+
345+ // Flash main ROM after ensuring backup ROM is good
346+ match unsafe { flash ( & firmware_data, SpiTarget :: Main ) } {
336347 Ok ( ( ) ) => Ok ( ( ) ) ,
337348 Err ( err) => {
338349 println ! ( "{} Flash Error: {:X?}" , self . name( ) , err) ;
0 commit comments