diff options
Diffstat (limited to 'drivers/gpu/drm/nova/uapi.rs')
-rw-r--r-- | drivers/gpu/drm/nova/uapi.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nova/uapi.rs b/drivers/gpu/drm/nova/uapi.rs new file mode 100644 index 000000000000..eb228a58d423 --- /dev/null +++ b/drivers/gpu/drm/nova/uapi.rs @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-2.0 + +use kernel::uapi; + +// TODO Work out some common infrastructure to avoid boilerplate code for uAPI abstractions. + +macro_rules! define_uapi_abstraction { + ($name:ident <= $inner:ty) => { + #[repr(transparent)] + pub struct $name(::kernel::types::Opaque<$inner>); + + impl ::core::convert::From<&::kernel::types::Opaque<$inner>> for &$name { + fn from(value: &::kernel::types::Opaque<$inner>) -> Self { + // SAFETY: `Self` is a transparent wrapper of `$inner`. + unsafe { ::core::mem::transmute(value) } + } + } + }; +} + +define_uapi_abstraction!(Getparam <= uapi::drm_nova_getparam); + +impl Getparam { + pub fn param(&self) -> u64 { + // SAFETY: `self.get()` is a valid pointer to a `struct drm_nova_getparam`. + unsafe { (*self.0.get()).param } + } + + pub fn set_value(&self, v: u64) { + // SAFETY: `self.get()` is a valid pointer to a `struct drm_nova_getparam`. + unsafe { (*self.0.get()).value = v }; + } +} + +define_uapi_abstraction!(GemCreate <= uapi::drm_nova_gem_create); + +impl GemCreate { + pub fn size(&self) -> u64 { + // SAFETY: `self.get()` is a valid pointer to a `struct drm_nova_gem_create`. + unsafe { (*self.0.get()).size } + } + + pub fn set_handle(&self, handle: u32) { + // SAFETY: `self.get()` is a valid pointer to a `struct drm_nova_gem_create`. + unsafe { (*self.0.get()).handle = handle }; + } +} + +define_uapi_abstraction!(GemInfo <= uapi::drm_nova_gem_info); + +impl GemInfo { + pub fn handle(&self) -> u32 { + // SAFETY: `self.get()` is a valid pointer to a `struct drm_nova_gem_info`. + unsafe { (*self.0.get()).handle } + } + + pub fn set_size(&self, size: u64) { + // SAFETY: `self.get()` is a valid pointer to a `struct drm_nova_gem_info`. + unsafe { (*self.0.get()).size = size }; + } +} |