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