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