xref: /linux/drivers/gpu/drm/tyr/file.rs (revision 570f7e331f5febb30f1384817463c7e42b65ca7d)
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     TyrDrmRegistrationData, //
17 };
18 
19 #[pin_data]
20 pub(crate) struct TyrDrmFileData {}
21 
22 /// Convenience type alias for our DRM `File` type
23 pub(crate) type TyrDrmFile = drm::file::File<TyrDrmFileData>;
24 
25 impl drm::file::DriverFile for TyrDrmFileData {
26     type Driver = TyrDrmDriver;
27 
28     fn open(_dev: &drm::Device<Self::Driver>) -> Result<Pin<KBox<Self>>> {
29         KBox::try_pin_init(try_pin_init!(Self {}), GFP_KERNEL)
30     }
31 }
32 
33 impl TyrDrmFileData {
34     pub(crate) fn dev_query(
35         _ddev: &TyrDrmDevice<Registered>,
36         reg_data: &TyrDrmRegistrationData<'_>,
37         devquery: &mut uapi::drm_panthor_dev_query,
38         _file: &TyrDrmFile,
39     ) -> Result<u32> {
40         if devquery.pointer == 0 {
41             match devquery.type_ {
42                 uapi::drm_panthor_dev_query_type_DRM_PANTHOR_DEV_QUERY_GPU_INFO => {
43                     devquery.size = core::mem::size_of_val(&reg_data.gpu_info) as u32;
44                     Ok(0)
45                 }
46                 _ => Err(EINVAL),
47             }
48         } else {
49             match devquery.type_ {
50                 uapi::drm_panthor_dev_query_type_DRM_PANTHOR_DEV_QUERY_GPU_INFO => {
51                     let mut writer = UserSlice::new(
52                         UserPtr::from_addr(devquery.pointer as usize),
53                         devquery.size as usize,
54                     )
55                     .writer();
56 
57                     writer.write(&reg_data.gpu_info)?;
58 
59                     Ok(0)
60                 }
61                 _ => Err(EINVAL),
62             }
63         }
64     }
65 }
66