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