Initial commit

master
itycodes 2 months ago
commit ca3f6c4d60

1
.gitignore vendored

@ -0,0 +1 @@
/target

306
Cargo.lock generated

@ -0,0 +1,306 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "aho-corasick"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
[[package]]
name = "bindgen"
version = "0.70.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f"
dependencies = [
"bitflags",
"cexpr",
"clang-sys",
"itertools",
"log",
"prettyplease",
"proc-macro2",
"quote",
"regex",
"rustc-hash",
"shlex",
"syn",
]
[[package]]
name = "bitflags"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
[[package]]
name = "cexpr"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
dependencies = [
"nom",
]
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cfg_aliases"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
[[package]]
name = "clang-sys"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
dependencies = [
"glob",
"libc",
"libloading",
]
[[package]]
name = "either"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
[[package]]
name = "glob"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
[[package]]
name = "intel_gpu_uapi"
version = "0.1.0"
dependencies = [
"bindgen",
"libc",
"nix",
]
[[package]]
name = "itertools"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
dependencies = [
"either",
]
[[package]]
name = "libc"
version = "0.2.161"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1"
[[package]]
name = "libloading"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4"
dependencies = [
"cfg-if",
"windows-targets",
]
[[package]]
name = "log"
version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
[[package]]
name = "memchr"
version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "minimal-lexical"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "nix"
version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
dependencies = [
"bitflags",
"cfg-if",
"cfg_aliases",
"libc",
]
[[package]]
name = "nom"
version = "7.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
dependencies = [
"memchr",
"minimal-lexical",
]
[[package]]
name = "prettyplease"
version = "0.2.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033"
dependencies = [
"proc-macro2",
"syn",
]
[[package]]
name = "proc-macro2"
version = "1.0.89"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
dependencies = [
"proc-macro2",
]
[[package]]
name = "regex"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "rustc-hash"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]]
name = "shlex"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "syn"
version = "2.0.87"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "unicode-ident"
version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
[[package]]
name = "windows-targets"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_gnullvm",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_i686_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"

@ -0,0 +1,15 @@
[package]
name = "intel_gpu_uapi"
version = "0.1.0"
edition = "2021"
[dependencies]
libc = "0.2.161"
[build-dependencies]
bindgen = "0.70.1"
[dev-dependencies]
libc = "0.2.161"
nix = { version = "0.29.0", features = ["fs"] }

@ -0,0 +1,15 @@
use std::env;
use std::path::PathBuf;
fn main() {
let bindings = bindgen::Builder::default()
.header("clib/wrapper.h")
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
.generate()
.expect("Unable to generate bindings");
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}

@ -0,0 +1,14 @@
#include <libdrm/drm.h>
#include <libdrm/i915_drm.h>
const __u64 _DRM_IOCTL_VERSION = DRM_IOCTL_VERSION;
#undef DRM_IOCTL_VERSION
const __u64 DRM_IOCTL_VERSION = _DRM_IOCTL_VERSION;
const __u64 _DRM_IOCTL_I915_QUERY = DRM_IOCTL_I915_QUERY;
#undef DRM_IOCTL_I915_QUERY
const __u64 DRM_IOCTL_I915_QUERY = _DRM_IOCTL_I915_QUERY;
const __u64 _DRM_IOCTL_I915_GETPARAM = DRM_IOCTL_I915_GETPARAM;
#undef DRM_IOCTL_I915_GETPARAM
const __u64 DRM_IOCTL_I915_GETPARAM = _DRM_IOCTL_I915_GETPARAM;

@ -0,0 +1,61 @@
use std::{ffi::OsString, os::fd::{AsRawFd, OwnedFd}};
use super::super::uapi;
use std::path::Path;
use std::fs::File;
#[derive(Debug)]
pub struct DrmDeviceNode {
pub fd: OwnedFd,
pub path: Option<OsString>,
}
#[derive(Debug)]
pub struct Device {
pub node: DrmDeviceNode,
pub driver: uapi::DrmVersion,
}
#[derive(Debug)]
pub struct Engine {
pub info: uapi::DrmI915EngineInfo,
}
pub fn find_i915_device() -> Option<Device> {
uapi::find_i915_node().and_then(|file| Device::from_path(file.path?))
}
impl Device {
pub fn from_fd(fd: OwnedFd) -> Option<Device> {
let driver = uapi::get_drm_version(fd.as_raw_fd())?;
Some(Device {
node: DrmDeviceNode {
fd: fd,
path: None,
},
driver: driver,
})
}
pub fn from_path(path: OsString) -> Option<Device> {
let file = File::open(Path::new(&path)).ok()?;
let driver = uapi::get_drm_version(file.as_raw_fd())?;
Some(Device {
node: DrmDeviceNode {
fd: OwnedFd::from(file),
path: Some(path),
},
driver: driver,
})
}
pub fn get_engines(&self) -> Option<Vec<Engine>> {
uapi::get_engines(self.node.fd.as_raw_fd()).map(|engines| {
engines.into_iter().map(|engine_info| {
Engine {
info: engine_info,
}
}).collect()
})
}
pub fn get_param(&self, param: u32) -> Option<i32> {
uapi::get_param(self.node.fd.as_raw_fd(), param as i32)
}
}

@ -0,0 +1 @@
pub mod drm_i915;

@ -0,0 +1,3 @@
pub mod native;
pub mod uapi;
pub mod gpu;

@ -0,0 +1,4 @@
#![allow(non_upper_case_globals)]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
include!(concat!(env!("OUT_DIR"), "/bindings.rs"));

@ -0,0 +1,209 @@
#![allow(non_camel_case_types)]
use std::os::fd::{AsRawFd, OwnedFd, RawFd};
use std::ffi::{CStr, OsString, c_void};
use libc;
use crate::gpu::drm_i915::DrmDeviceNode;
use super::native;
use std::fs;
use std::fs::File;
#[derive(Debug)]
pub struct DrmVersion {
pub version_major: i32,
pub version_minor: i32,
pub version_patchlevel: i32,
pub name: OsString,
pub date: OsString,
pub desc: OsString,
}
pub fn get_drm_version(fd: RawFd) -> Option<DrmVersion> {
unsafe {
let name_vec = libc::malloc(128);
libc::memset(name_vec, 0, 128);
let date_vec = libc::malloc(128);
libc::memset(date_vec, 0, 128);
let desc_vec = libc::malloc(128);
libc::memset(desc_vec, 0, 128);
let mut version = native::drm_version {
version_major: 0,
version_minor: 0,
version_patchlevel: 0,
name: name_vec as *mut i8,
date: date_vec as *mut i8,
desc: desc_vec as *mut i8,
name_len: 128,
date_len: 128,
desc_len: 128,
};
let res_val = libc::ioctl(fd, native::DRM_IOCTL_VERSION, &mut version) == 0;
let res = if res_val {
let name = CStr::from_ptr(version.name).to_str().expect("Failed to convert name");
let date = CStr::from_ptr(version.date).to_str().expect("Failed to convert date");
let desc = CStr::from_ptr(version.desc).to_str().expect("Failed to convert desc");
let drm_version = DrmVersion {
version_major: version.version_major,
version_minor: version.version_minor,
version_patchlevel: version.version_patchlevel,
name: OsString::from(name.to_string()),
date: OsString::from(date.to_string()),
desc: OsString::from(desc.to_string()),
};
Some(drm_version)
} else {None};
res
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DrmI915EngineClass {
Render, Copy, Video, VideoEnhance, Compute, Invalid
}
#[derive(Debug)]
pub struct DrmI915EngineClassInstance {
pub engine_class: DrmI915EngineClass,
pub engine_instance: u16,
}
pub type DrmI915EngineInfoFlags = u64;
#[derive(Debug)]
pub struct DrmI915EngineInfo {
pub engine: DrmI915EngineClassInstance,
pub logical_instance: u16,
pub flags: DrmI915EngineInfoFlags,
pub capabilities: u64,
}
fn engine_class_from_u16(engine_class: u16) -> DrmI915EngineClass {
match engine_class {
0 => DrmI915EngineClass::Render,
1 => DrmI915EngineClass::Copy,
2 => DrmI915EngineClass::Video,
3 => DrmI915EngineClass::VideoEnhance,
4 => DrmI915EngineClass::Compute,
_ => DrmI915EngineClass::Invalid,
}
}
fn engine_class_instance_from_native(engine_class_instance: native::i915_engine_class_instance) -> DrmI915EngineClassInstance {
DrmI915EngineClassInstance {
engine_class: engine_class_from_u16(engine_class_instance.engine_class),
engine_instance: engine_class_instance.engine_instance,
}
}
fn engine_info_from_native(engine_info: native::drm_i915_engine_info) -> DrmI915EngineInfo {
DrmI915EngineInfo {
engine: engine_class_instance_from_native(engine_info.engine),
logical_instance: engine_info.logical_instance,
flags: engine_info.flags,
capabilities: engine_info.capabilities,
}
}
impl DrmI915EngineInfo {
pub fn to_native(&self) -> native::drm_i915_engine_info {
native::drm_i915_engine_info {
engine: native::i915_engine_class_instance {
engine_class: match self.engine.engine_class {
DrmI915EngineClass::Render => 0,
DrmI915EngineClass::Copy => 1,
DrmI915EngineClass::Video => 2,
DrmI915EngineClass::VideoEnhance => 3,
DrmI915EngineClass::Compute => 4,
DrmI915EngineClass::Invalid => 0xFFFF,
},
engine_instance: self.engine.engine_instance,
},
logical_instance: self.logical_instance,
flags: self.flags,
capabilities: self.capabilities,
rsvd0: 0,
rsvd1: [0; 3],
rsvd2: [0; 3],
}
}
pub fn from_native(engine_info: native::drm_i915_engine_info) -> DrmI915EngineInfo {
engine_info_from_native(engine_info)
}
}
pub fn get_engines(fd: RawFd) -> Option<Vec<DrmI915EngineInfo>> {
unsafe {
let mut query_item = native::drm_i915_query_item {
query_id: native::DRM_I915_QUERY_ENGINE_INFO as u64,
length: 0,
data_ptr: core::ptr::null_mut::<c_void>() as u64,
flags: 0,
};
let mut query = native::drm_i915_query {
items_ptr: (&mut query_item) as *mut native::drm_i915_query_item as u64,
num_items: 1,
flags: 0,
};
let res = libc::ioctl(fd.as_raw_fd(), native::DRM_IOCTL_I915_QUERY, &mut query);
if res != 0 {
return None;
}
let engine_info = libc::malloc(query_item.length as usize)
as *mut native::drm_i915_query_engine_info;
libc::memset(engine_info as *mut c_void, 0, query_item.length as usize);
query_item.data_ptr = engine_info as u64;
let res = libc::ioctl(fd.as_raw_fd(), native::DRM_IOCTL_I915_QUERY, &mut query);
if res != 0 {
return None;
}
let engine_data = engine_info.as_mut().unwrap();
let engines = engine_data.engines.as_mut_slice(engine_data.num_engines as usize);
let mut engines_res: Vec<DrmI915EngineInfo> = Vec::new();
for i in 0..engine_data.num_engines {
let engine = DrmI915EngineInfo::from_native(engines[i as usize]);
engines_res.push(engine);
}
Some(engines_res)
}
}
pub fn get_param(fd: RawFd, param_id: i32) -> Option<i32> {
unsafe {
let mut value: i32 = 0;
let mut param = native::drm_i915_getparam {
param: param_id,
value: &mut value as *mut i32
};
let res = libc::ioctl(fd, native::DRM_IOCTL_I915_GETPARAM, &mut param);
if res != 0 {
return None;
}
Some(value)
}
}
pub fn find_i915_node() -> Option<DrmDeviceNode> {
let inodes = fs::read_dir("/dev/dri").ok()?;
for inode in inodes {
let inode = inode.ok()?;
let path = inode.path();
let path = path.to_str()?;
if path.starts_with("/dev/dri/renderD") {
let file = File::open(path).unwrap();
let dev = get_drm_version(file.as_raw_fd());
if dev.is_some() && dev.unwrap().name.to_str().unwrap() == "i915" {
return Some(DrmDeviceNode {
fd: OwnedFd::from(file),
path: Some(OsString::from(path)),
});
}
}
}
None
}
pub fn find_i915_fd() -> Option<RawFd> {
return find_i915_node().map(|node| node.fd.as_raw_fd());
}

@ -0,0 +1,70 @@
use intel_gpu_uapi::*;
use std::fmt::format;
use std::os::fd::{AsRawFd, OwnedFd, RawFd};
use std::fs::File;
use std::path::Path;
#[test]
fn test_i915_find_device() {
let device = gpu::drm_i915::find_i915_device();
assert!(device.is_some());
let drm_version = device.unwrap().driver;
assert_eq!(drm_version.name.to_str().unwrap(), "i915");
assert_eq!(drm_version.desc.to_str().unwrap(), "Intel Graphics");
}
#[test]
fn test_drm_version() {
let device = gpu::drm_i915::find_i915_device();
assert!(device.is_some());
let drm_version = device.unwrap().driver;
assert_eq!(drm_version.name.to_str().unwrap(), "i915");
assert_eq!(drm_version.desc.to_str().unwrap(), "Intel Graphics");
let fd_null = File::open("/dev/null").expect("Failed to open /dev/null");
assert!(gpu::drm_i915::Device::from_fd(OwnedFd::from(fd_null)).is_none());
}
fn has_engine_class(engines: &Vec<gpu::drm_i915::Engine>, engine_class: uapi::DrmI915EngineClass) -> bool {
engines.iter().filter(|engine| engine.info.engine.engine_class == engine_class).count() > 0
}
#[test]
fn test_i915_get_engines() {
let device = gpu::drm_i915::find_i915_device().expect("Failed to find i915 device");
let drm_version = &device.driver;
assert_eq!(drm_version.name.to_str().unwrap(), "i915");
assert_eq!(drm_version.desc.to_str().unwrap(), "Intel Graphics");
let engines = device.get_engines().expect("Failed to get engines");
assert!(engines.len() > 0);
assert!(has_engine_class(&engines, uapi::DrmI915EngineClass::Render));
assert!(has_engine_class(&engines, uapi::DrmI915EngineClass::Copy));
assert!(has_engine_class(&engines, uapi::DrmI915EngineClass::Video));
assert!(has_engine_class(&engines, uapi::DrmI915EngineClass::VideoEnhance));
// Compute engine is not always present
// assert!(has_engine_class(&engines, uapi::DrmI915EngineClass::Compute));
}
fn get_vendor_for_fd(fd: RawFd) -> String{
unsafe {
let mut stat: libc::stat = std::mem::zeroed();
libc::fstat(fd, &mut stat);
let (major, minor) = (libc::major(stat.st_rdev),
libc::minor(stat.st_rdev));
let sysfs_path = format!("/sys/dev/char/{}:{}/device/device", major, minor);
let sysfs_path = Path::new(&sysfs_path);
let dev_id = std::fs::read_to_string(sysfs_path).expect("Unable to read device id");
return dev_id.trim().to_string();
}
}
#[test]
fn test_i915_get_param() {
let device = gpu::drm_i915::find_i915_device().expect("Failed to find i915 device");
let drm_version = &device.driver;
assert_eq!(drm_version.name.to_str().unwrap(), "i915");
assert_eq!(drm_version.desc.to_str().unwrap(), "Intel Graphics");
let chipset_id = device.get_param(native::I915_PARAM_CHIPSET_ID).expect("Failed to get param");
let chip_id = format!("{:#04x}", chipset_id);
let dev_id = get_vendor_for_fd(device.node.fd.as_raw_fd());
assert_eq!(dev_id, chip_id);
}

@ -0,0 +1,66 @@
use intel_gpu_uapi::*;
use std::ffi::c_void;
use std::ffi::CStr;
use nix::{self};
#[test]
fn test_drm_version_raw() {
// TODO more robust render node detection
let fd = nix::fcntl::open("/dev/dri/renderD129", nix::fcntl::OFlag::O_RDWR | nix::fcntl::OFlag::O_CLOEXEC, nix::sys::stat::Mode::empty())
.expect("Failed to open /dev/dri/renderD129");
unsafe {
let name_vec = libc::malloc(128);
let date_vec = libc::malloc(128);
let desc_vec = libc::malloc(128);
let mut version = native::drm_version {
version_major: 0,
version_minor: 0,
version_patchlevel: 0,
name: name_vec as *mut i8,
date: date_vec as *mut i8,
desc: desc_vec as *mut i8,
name_len: 128,
date_len: 128,
desc_len: 128,
};
assert!(libc::ioctl(fd, native::DRM_IOCTL_VERSION, &mut version) == 0);
println!("version_major: {}, version_minor: {}, version_patchlevel: {}, name: {:?}, date: {:?}, desc: {:?}",
version.version_major,
version.version_minor,
version.version_patchlevel,
CStr::from_ptr(version.name),
CStr::from_ptr(version.date),
CStr::from_ptr(version.desc));
}
}
#[test]
fn test_i915_query_raw() {
let fd = nix::fcntl::open("/dev/dri/renderD129", nix::fcntl::OFlag::O_RDWR | nix::fcntl::OFlag::O_CLOEXEC, nix::sys::stat::Mode::empty())
.expect("Failed to open /dev/dri/renderD129");
unsafe {
let mut query_item = native::drm_i915_query_item {
query_id: native::DRM_I915_QUERY_ENGINE_INFO as u64,
length: 0,
data_ptr: core::ptr::null_mut::<c_void>() as u64,
flags: 0,
};
let mut query = native::drm_i915_query {
items_ptr: (&mut query_item) as *mut native::drm_i915_query_item as u64,
num_items: 1,
flags: 0,
};
assert!(libc::ioctl(fd, native::DRM_IOCTL_I915_QUERY, &mut query) == 0);
let engine_info = libc::malloc(query_item.length as usize)
as *mut native::drm_i915_query_engine_info;
query_item.data_ptr = engine_info as u64;
assert!(libc::ioctl(fd, native::DRM_IOCTL_I915_QUERY, &mut query) == 0);
println!("engine_info: {:?}", *engine_info);
let engine_data = engine_info.as_mut().unwrap();
let engines = engine_data.engines.as_mut_slice(engine_data.num_engines as usize);
for engine in engines {
println!("engine: {:?}", engine);
}
}
}

@ -0,0 +1,20 @@
#![allow(unused_imports)]
use intel_gpu_uapi::*;
use uapi::find_i915_node;
use std::fs;
use std::{fs::File, os::fd::AsRawFd};
#[test]
fn test_drm_version() {
let node = find_i915_node().expect("Failed to find i915 fd");
let drm_version = uapi::get_drm_version(node.fd.as_raw_fd()).expect("Failed to get drm version");
println!("{:?}", drm_version);
}
#[test]
fn test_i915_get_engines() {
let node = find_i915_node().expect("Failed to find i915 fd");
let engines = uapi::get_engines(node.fd.as_raw_fd()).expect("Failed to get engines");
println!("{:?}", engines);
}
Loading…
Cancel
Save