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