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