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