metal: add lease infrastructure
This commit is contained in:
parent
1f18b46135
commit
e92c92bf49
6 changed files with 502 additions and 58 deletions
|
|
@ -21,7 +21,7 @@ use {
|
|||
bstr::{BString, ByteSlice},
|
||||
indexmap::IndexSet,
|
||||
std::{
|
||||
cell::RefCell,
|
||||
cell::{Cell, RefCell},
|
||||
ffi::CString,
|
||||
fmt::{Debug, Display, Formatter},
|
||||
mem::{self, MaybeUninit},
|
||||
|
|
@ -40,8 +40,8 @@ use crate::{
|
|||
video::{
|
||||
dmabuf::DmaBuf,
|
||||
drm::sys::{
|
||||
drm_format_modifier, drm_format_modifier_blob, get_version, DRM_CAP_CURSOR_HEIGHT,
|
||||
DRM_CAP_CURSOR_WIDTH, FORMAT_BLOB_CURRENT,
|
||||
drm_format_modifier, drm_format_modifier_blob, get_version, revoke_lease,
|
||||
DRM_CAP_CURSOR_HEIGHT, DRM_CAP_CURSOR_WIDTH, FORMAT_BLOB_CURRENT,
|
||||
},
|
||||
Modifier, INVALID_MODIFIER,
|
||||
},
|
||||
|
|
@ -137,6 +137,8 @@ pub enum DrmError {
|
|||
Merge(#[source] OsError),
|
||||
#[error("Could not import a sync file into a sync obj")]
|
||||
ImportSyncFile(#[source] OsError),
|
||||
#[error("Could not create a lease")]
|
||||
CreateLease(#[source] OsError),
|
||||
}
|
||||
|
||||
fn render_node_name(fd: c::c_int) -> Result<Ustring, DrmError> {
|
||||
|
|
@ -242,6 +244,36 @@ impl Deref for DrmMaster {
|
|||
}
|
||||
}
|
||||
|
||||
pub struct DrmLease {
|
||||
drm_fd: Rc<OwnedFd>,
|
||||
lessee_id: u32,
|
||||
lessee_fd: Rc<OwnedFd>,
|
||||
revoked: Cell<bool>,
|
||||
}
|
||||
|
||||
impl DrmLease {
|
||||
pub fn lessee_fd(&self) -> &Rc<OwnedFd> {
|
||||
&self.lessee_fd
|
||||
}
|
||||
|
||||
pub fn try_revoke(&self) -> bool {
|
||||
if self.revoked.get() {
|
||||
return true;
|
||||
}
|
||||
match revoke_lease(self.drm_fd.raw(), self.lessee_id) {
|
||||
Ok(_) => {
|
||||
log::info!("Revoked lease {}/{}", self.drm_fd.raw(), self.lessee_id);
|
||||
self.revoked.set(true);
|
||||
true
|
||||
}
|
||||
Err(e) => {
|
||||
log::error!("Could not revoke lease: {}", ErrorFmt(e));
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl DrmMaster {
|
||||
pub fn new(ring: &Rc<IoUring>, fd: Rc<OwnedFd>) -> Self {
|
||||
Self {
|
||||
|
|
@ -516,6 +548,18 @@ impl DrmMaster {
|
|||
}
|
||||
Ok(self.events.pop())
|
||||
}
|
||||
|
||||
pub fn lease(&self, objs: &[u32]) -> Result<DrmLease, DrmError> {
|
||||
let (fd, lessee_id) =
|
||||
create_lease(self.raw(), objs, c::O_CLOEXEC as _).map_err(DrmError::CreateLease)?;
|
||||
log::info!("Created lease {}/{}", self.fd.raw(), lessee_id);
|
||||
Ok(DrmLease {
|
||||
drm_fd: self.fd.clone(),
|
||||
lessee_id,
|
||||
lessee_fd: Rc::new(fd),
|
||||
revoked: Cell::new(false),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pub enum DrmEvent {
|
||||
|
|
|
|||
|
|
@ -70,6 +70,21 @@ pub fn create_lease(fd: c::c_int, objects: &[u32], flags: u32) -> Result<(OwnedF
|
|||
Ok((OwnedFd::new(create.fd as _), create.lessee_id))
|
||||
}
|
||||
|
||||
const DRM_IOCTL_MODE_REVOKE_LEASE: u64 = drm_iowr::<drm_mode_revoke_lease>(0xc9);
|
||||
|
||||
#[repr(C)]
|
||||
struct drm_mode_revoke_lease {
|
||||
lessee_id: u32,
|
||||
}
|
||||
|
||||
pub fn revoke_lease(fd: c::c_int, lessee_id: u32) -> Result<(), OsError> {
|
||||
let mut revoke = drm_mode_revoke_lease { lessee_id };
|
||||
unsafe {
|
||||
ioctl(fd, DRM_IOCTL_MODE_REVOKE_LEASE, &mut revoke)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn get_node_type_from_fd(fd: c::c_int) -> Result<NodeType, OsError> {
|
||||
let (_, _, min) = drm_stat(fd)?;
|
||||
get_minor_type(min)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue