vbios_parser/
vbios_parser.rs

1use libdrm_amdgpu_sys::*;
2use AMDGPU::VBIOS::VbiosParser;
3use std::fs::File;
4use std::io;
5
6fn main() {
7    let libdrm_amdgpu = LibDrmAmdgpu::new().unwrap();
8    let device_path = std::env::var("AMDGPU_PATH").unwrap_or("/dev/dri/renderD128".to_string());
9    let (amdgpu_dev, _, _) = {
10        use std::os::fd::IntoRawFd;
11
12        let f = File::open(device_path).unwrap();
13
14        libdrm_amdgpu.init_device_handle(f.into_raw_fd()).unwrap()
15    };
16
17    let Ok(vbios_image) = amdgpu_dev.get_vbios_image() else { return };
18
19    let vbios_parser = VbiosParser::new(vbios_image);
20
21    if !vbios_parser.valid_vbios() || !vbios_parser.check_length() {
22        panic!();
23    }
24
25    if let Some(name) = vbios_parser.get_vbios_name() {
26        println!("name: {name:?}");
27    }
28
29    let rom_header = vbios_parser.get_atom_rom_header().unwrap();
30    println!("{rom_header:#X?}");
31
32    let data_table = vbios_parser.get_atom_data_table(&rom_header).unwrap();
33    println!("{data_table:#X?}");
34
35    if let Some(h) = vbios_parser.get_atom_firmware_info_header(&data_table) {
36        println!("{h:#?}");
37        match (h.format_revision, h.content_revision) {
38            (3, 5) => {
39                let firmware_info = vbios_parser.get_atom_firmware_info_v3_5(&data_table).unwrap();
40                println!("firmwareinfo: {firmware_info:#?}");
41            },
42            _ => {
43                let firmware_info = vbios_parser.get_atom_firmware_info(&data_table).unwrap();
44                println!("firmwareinfo: {firmware_info:#?}");
45            },
46        }
47    }
48}