xref: /linux/drivers/gpu/drm/nova/uapi.rs (revision ab93e0dd72c37d378dd936f031ffb83ff2bd87ce)
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