Skip to content

Commit 7147741

Browse files
committed
Flash backup ROM for open EC
1 parent 6d2be02 commit 7147741

File tree

2 files changed

+25
-14
lines changed

2 files changed

+25
-14
lines changed

Cargo.lock

Lines changed: 11 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/app/ec.rs

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

Comments
 (0)