1*cdeaeb9dSDanilo Krummrich // SPDX-License-Identifier: GPL-2.0 2*cdeaeb9dSDanilo Krummrich 3*cdeaeb9dSDanilo Krummrich use kernel::uapi; 4*cdeaeb9dSDanilo Krummrich 5*cdeaeb9dSDanilo Krummrich // TODO Work out some common infrastructure to avoid boilerplate code for uAPI abstractions. 6*cdeaeb9dSDanilo Krummrich 7*cdeaeb9dSDanilo Krummrich macro_rules! define_uapi_abstraction { 8*cdeaeb9dSDanilo Krummrich ($name:ident <= $inner:ty) => { 9*cdeaeb9dSDanilo Krummrich #[repr(transparent)] 10*cdeaeb9dSDanilo Krummrich pub struct $name(::kernel::types::Opaque<$inner>); 11*cdeaeb9dSDanilo Krummrich 12*cdeaeb9dSDanilo Krummrich impl ::core::convert::From<&::kernel::types::Opaque<$inner>> for &$name { 13*cdeaeb9dSDanilo Krummrich fn from(value: &::kernel::types::Opaque<$inner>) -> Self { 14*cdeaeb9dSDanilo Krummrich // SAFETY: `Self` is a transparent wrapper of `$inner`. 15*cdeaeb9dSDanilo Krummrich unsafe { ::core::mem::transmute(value) } 16*cdeaeb9dSDanilo Krummrich } 17*cdeaeb9dSDanilo Krummrich } 18*cdeaeb9dSDanilo Krummrich }; 19*cdeaeb9dSDanilo Krummrich } 20*cdeaeb9dSDanilo Krummrich 21*cdeaeb9dSDanilo Krummrich define_uapi_abstraction!(Getparam <= uapi::drm_nova_getparam); 22*cdeaeb9dSDanilo Krummrich 23*cdeaeb9dSDanilo Krummrich impl Getparam { 24*cdeaeb9dSDanilo Krummrich pub fn param(&self) -> u64 { 25*cdeaeb9dSDanilo Krummrich // SAFETY: `self.get()` is a valid pointer to a `struct drm_nova_getparam`. 26*cdeaeb9dSDanilo Krummrich unsafe { (*self.0.get()).param } 27*cdeaeb9dSDanilo Krummrich } 28*cdeaeb9dSDanilo Krummrich 29*cdeaeb9dSDanilo Krummrich pub fn set_value(&self, v: u64) { 30*cdeaeb9dSDanilo Krummrich // SAFETY: `self.get()` is a valid pointer to a `struct drm_nova_getparam`. 31*cdeaeb9dSDanilo Krummrich unsafe { (*self.0.get()).value = v }; 32*cdeaeb9dSDanilo Krummrich } 33*cdeaeb9dSDanilo Krummrich } 34*cdeaeb9dSDanilo Krummrich 35*cdeaeb9dSDanilo Krummrich define_uapi_abstraction!(GemCreate <= uapi::drm_nova_gem_create); 36*cdeaeb9dSDanilo Krummrich 37*cdeaeb9dSDanilo Krummrich impl GemCreate { 38*cdeaeb9dSDanilo Krummrich pub fn size(&self) -> u64 { 39*cdeaeb9dSDanilo Krummrich // SAFETY: `self.get()` is a valid pointer to a `struct drm_nova_gem_create`. 40*cdeaeb9dSDanilo Krummrich unsafe { (*self.0.get()).size } 41*cdeaeb9dSDanilo Krummrich } 42*cdeaeb9dSDanilo Krummrich 43*cdeaeb9dSDanilo Krummrich pub fn set_handle(&self, handle: u32) { 44*cdeaeb9dSDanilo Krummrich // SAFETY: `self.get()` is a valid pointer to a `struct drm_nova_gem_create`. 45*cdeaeb9dSDanilo Krummrich unsafe { (*self.0.get()).handle = handle }; 46*cdeaeb9dSDanilo Krummrich } 47*cdeaeb9dSDanilo Krummrich } 48*cdeaeb9dSDanilo Krummrich 49*cdeaeb9dSDanilo Krummrich define_uapi_abstraction!(GemInfo <= uapi::drm_nova_gem_info); 50*cdeaeb9dSDanilo Krummrich 51*cdeaeb9dSDanilo Krummrich impl GemInfo { 52*cdeaeb9dSDanilo Krummrich pub fn handle(&self) -> u32 { 53*cdeaeb9dSDanilo Krummrich // SAFETY: `self.get()` is a valid pointer to a `struct drm_nova_gem_info`. 54*cdeaeb9dSDanilo Krummrich unsafe { (*self.0.get()).handle } 55*cdeaeb9dSDanilo Krummrich } 56*cdeaeb9dSDanilo Krummrich 57*cdeaeb9dSDanilo Krummrich pub fn set_size(&self, size: u64) { 58*cdeaeb9dSDanilo Krummrich // SAFETY: `self.get()` is a valid pointer to a `struct drm_nova_gem_info`. 59*cdeaeb9dSDanilo Krummrich unsafe { (*self.0.get()).size = size }; 60*cdeaeb9dSDanilo Krummrich } 61*cdeaeb9dSDanilo Krummrich } 62