From 325cc1731313f70d4a217302cd00eafb16293f23 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 2 Dec 2020 08:49:53 -0700 Subject: [PATCH] FORCE_POWER --- you-ass-bee-see/Cargo.lock | 121 ++++++++++++++++++++++++++++++++++++ you-ass-bee-see/Cargo.toml | 1 + you-ass-bee-see/src/main.rs | 31 ++++++++- 3 files changed, 151 insertions(+), 2 deletions(-) diff --git a/you-ass-bee-see/Cargo.lock b/you-ass-bee-see/Cargo.lock index 8e4ddcd..d51e07a 100644 --- a/you-ass-bee-see/Cargo.lock +++ b/you-ass-bee-see/Cargo.lock @@ -24,6 +24,29 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +[[package]] +name = "coreboot-collector" +version = "0.1.0" +dependencies = [ + "err-derive", + "libc", + "sysfs-class", +] + +[[package]] +name = "err-derive" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22deed3a8124cff5fa835713fa105621e43bbdc46690c3a6b68328a012d350d4" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "rustversion", + "syn", + "synstructure", +] + [[package]] name = "i2cdev" version = "0.4.4" @@ -55,6 +78,103 @@ dependencies = [ "void", ] +[[package]] +name = "numtoa" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e521b6adefa0b2c1fa5d2abdf9a5216288686fe6146249215d884c0e5ab320b0" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustversion" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5d2a036dc6d2d8fd16fde3498b04306e29bd193bf306a57427019b823d5acd" + +[[package]] +name = "syn" +version = "1.0.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8833e20724c24de12bbaba5ad230ea61c3eafb05b881c7c9d3cfe8638b187e68" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "synstructure" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + +[[package]] +name = "sysfs-class" +version = "0.1.3" +source = "git+https://github.com/pop-os/sysfs-class.git#c3b86e07c36feb9b705b8c24af1498cbd396de4e" +dependencies = [ + "numtoa", +] + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "version_check" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" + [[package]] name = "void" version = "1.0.2" @@ -65,5 +185,6 @@ checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" name = "you-ass-bee-see" version = "0.1.0" dependencies = [ + "coreboot-collector", "i2cdev", ] diff --git a/you-ass-bee-see/Cargo.toml b/you-ass-bee-see/Cargo.toml index 1668143..108ca77 100644 --- a/you-ass-bee-see/Cargo.toml +++ b/you-ass-bee-see/Cargo.toml @@ -7,4 +7,5 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +coreboot-collector = { path = "../tools/coreboot-collector" } i2cdev = "0.4.4" diff --git a/you-ass-bee-see/src/main.rs b/you-ass-bee-see/src/main.rs index 9b5302f..de7fe40 100644 --- a/you-ass-bee-see/src/main.rs +++ b/you-ass-bee-see/src/main.rs @@ -1,6 +1,7 @@ +use coreboot_collector::sideband::Sideband; use i2cdev::core::I2CDevice; use i2cdev::linux::LinuxI2CDevice; -use std::fs; +use std::{fs, thread, time}; const IECS_CMD: u8 = 8; const IECS_DATA: u8 = 9; @@ -12,6 +13,8 @@ const CMD_BLKW: u32 = 0x574b4c42; const CMD_BOPS: u32 = 0x53504f42; const CMD_PCYC: u32 = 0x43594350; +const GPIO_FORCE_POWER: (u8, u8) = (0x6E, 0x82); // GPP_A23 + fn read(dev: &mut I, reg: u8) -> Result { let bytes = dev.smbus_read_block_data(reg)?; //TODO: return error on bytes.len() != 4 @@ -46,7 +49,20 @@ fn command(dev: &mut I, cmd: u32) -> Result { } fn main() { - //TODO: force power and sleep 40ms + //TODO: check model + + let sideband = unsafe { Sideband::new(0xFD00_0000).unwrap() }; + + // Set FORCE_POWER high + unsafe { + let (port, pad) = GPIO_FORCE_POWER; + let mut value = sideband.gpio(port, pad); + value |= 1; + sideband.set_gpio(port, pad, value); + } + + // Sleep 40ms + thread::sleep(time::Duration::from_millis(40)); let mut dev = LinuxI2CDevice::new("/dev/i2c-11", 0x40).unwrap(); eprintln!("Vendor: {:X}", read(&mut dev, 0).unwrap()); @@ -58,6 +74,9 @@ fn main() { println!("{}: {:X}", i, read(&mut dev, i).unwrap()); } + write(&mut dev, IECS_DATA, 0).unwrap(); + println!("IECS_DATA: {:X}", read(&mut dev, IECS_DATA).unwrap()); + /* eprintln!("Set offset to 0"); write(&mut dev, IECS_DATA, 0).unwrap(); @@ -105,4 +124,12 @@ fn main() { eprintln!("Successfully flashed retimer"); */ + + // Set FORCE_POWER low + unsafe { + let (port, pad) = GPIO_FORCE_POWER; + let mut value = sideband.gpio(port, pad); + value &= !1; + sideband.set_gpio(port, pad, value); + } }