vbios_dump/
vbios_dump.rs

1use libdrm_amdgpu_sys::*;
2use std::fs::File;
3use std::io;
4
5fn dump(image: &[u8], vbios_name: String) -> io::Result<()> {
6    use std::io::Write;
7
8    let path = format!("./{vbios_name}.bin");
9    let mut f = File::create(&path)?;
10
11    f.write_all(&image)?;
12
13    println!("\nDumped to {path}");
14    Ok(())
15}
16
17fn main() {
18    let libdrm_amdgpu = LibDrmAmdgpu::new().unwrap();
19    let device_path = std::env::var("AMDGPU_PATH").unwrap_or("/dev/dri/renderD128".to_string());
20    let (amdgpu_dev, _, _) = {
21        use std::os::fd::IntoRawFd;
22
23        let f = File::open(device_path).unwrap();
24
25        libdrm_amdgpu.init_device_handle(f.into_raw_fd()).unwrap()
26    };
27
28    if let Ok(vbios) = amdgpu_dev.get_vbios_info() {
29        println!("\nVBIOS info:");
30        println!("name: [{}]", vbios.name);
31        println!("pn: [{}]", vbios.pn);
32        println!("ver: [{}]", vbios.ver);
33        println!("date: [{}]", vbios.date);
34        println!("vbios size: {}", vbios.size);
35
36        let args: Vec<String> = std::env::args().collect();
37
38        if args.contains(&"-d".to_string()) || args.contains(&"--dump".to_string()) {
39            // if let Ok(vbios_image) = unsafe { amdgpu_dev.get_vbios_image_with_size(vbios.size) } {
40            if let Ok(vbios_image) = amdgpu_dev.get_vbios_image() {
41                let name = vbios.name.replace(' ', "_").replace('/', "_");
42                dump(&vbios_image, name).unwrap();
43            }
44        } else {
45            println!("If you need a VBIOS image, add \"-d\" or \"--dump\" as an argument and run.");
46        }
47    }
48}