From ff3769ae5a7a8d6209b853913e468410550f6bcc Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Thu, 5 Dec 2024 09:50:03 -0700 Subject: [PATCH] meer9: set ME_OVERRIDE high --- src/app/bios.rs | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/src/app/bios.rs b/src/app/bios.rs index 4d4e538..ba2f7ee 100644 --- a/src/app/bios.rs +++ b/src/app/bios.rs @@ -17,6 +17,7 @@ use std::vars::{get_boot_item, get_boot_order, set_boot_item, set_boot_order}; use super::{ cmos, pci_mcfg, shell, Component, UefiMapper, FIRMWARECAP, FIRMWAREDIR, FIRMWARENSH, FIRMWAREROM, H2OFFT, IFLASHV, UEFIFLASH, + sideband::Sideband, }; fn copy_region( @@ -217,11 +218,41 @@ impl Component for BiosComponent { fn validate(&self) -> Result { let data = load(self.path())?; - if let Some((mut spi, _hsfsts_ctl)) = self.spi() { - // if hsfsts_ctl.contains(HsfStsCtl::FDOPSS) { - // println!("SPI currently locked, attempting to unlock"); - // Self::spi_unlock(); - // } + if let Some((mut spi, hsfsts_ctl)) = self.spi() { + #[allow(clippy::single_match)] + match self.system_version.as_str() { + "meer9" => { + if hsfsts_ctl.contains(HsfStsCtl::FDOPSS) { + println!("SPI currently locked, attempting to unlock"); + + // Set ME_OVERRIDE (GPP_D09) high + unsafe { + let sideband = Sideband::new(0xE000_0000); + let port = 0xD5; + let pad = 0x44; + let mut value = sideband.gpio(port, pad); + value |= 1; + sideband.set_gpio(port, pad, value); + } + + println!("System will reboot in 5 seconds"); + let _ = (std::system_table().BootServices.Stall)(5_000_000); + + (std::system_table().RuntimeServices.ResetSystem)( + ResetType::Cold, + Status(0), + 0, + ptr::null(), + ); + } + }, + _ => { + // if hsfsts_ctl.contains(HsfStsCtl::FDOPSS) { + // println!("SPI currently locked, attempting to unlock"); + // Self::spi_unlock(); + // } + } + } let len = spi.len().map_err(|_| Status::DEVICE_ERROR)?; Ok(data.len() == len)