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(®_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(®_data.gpu_info)?; 58 59 Ok(0) 60 } 61 _ => Err(EINVAL), 62 } 63 } 64 } 65 } 66