xref: /linux/drivers/gpu/drm/tyr/file.rs (revision 07fdad3a93756b872da7b53647715c48d0f4a2d0)
1 // SPDX-License-Identifier: GPL-2.0 or MIT
2 
3 use kernel::drm;
4 use kernel::prelude::*;
5 use kernel::uaccess::UserSlice;
6 use kernel::uapi;
7 
8 use crate::driver::TyrDevice;
9 use crate::TyrDriver;
10 
11 #[pin_data]
12 pub(crate) struct File {}
13 
14 /// Convenience type alias for our DRM `File` type
15 pub(crate) type DrmFile = drm::file::File<File>;
16 
17 impl drm::file::DriverFile for File {
18     type Driver = TyrDriver;
19 
20     fn open(_dev: &drm::Device<Self::Driver>) -> Result<Pin<KBox<Self>>> {
21         KBox::try_pin_init(try_pin_init!(Self {}), GFP_KERNEL)
22     }
23 }
24 
25 impl File {
26     pub(crate) fn dev_query(
27         tdev: &TyrDevice,
28         devquery: &mut uapi::drm_panthor_dev_query,
29         _file: &DrmFile,
30     ) -> Result<u32> {
31         if devquery.pointer == 0 {
32             match devquery.type_ {
33                 uapi::drm_panthor_dev_query_type_DRM_PANTHOR_DEV_QUERY_GPU_INFO => {
34                     devquery.size = core::mem::size_of_val(&tdev.gpu_info) as u32;
35                     Ok(0)
36                 }
37                 _ => Err(EINVAL),
38             }
39         } else {
40             match devquery.type_ {
41                 uapi::drm_panthor_dev_query_type_DRM_PANTHOR_DEV_QUERY_GPU_INFO => {
42                     let mut writer = UserSlice::new(
43                         UserPtr::from_addr(devquery.pointer as usize),
44                         devquery.size as usize,
45                     )
46                     .writer();
47 
48                     writer.write(&tdev.gpu_info)?;
49 
50                     Ok(0)
51                 }
52                 _ => Err(EINVAL),
53             }
54         }
55     }
56 }
57