// SPDX-License-Identifier: GPL-2.0 or MIT use kernel::{ drm, prelude::*, uaccess::UserSlice, uapi, // }; use crate::driver::{ TyrDrmDevice, TyrDrmDriver, // }; #[pin_data] pub(crate) struct TyrDrmFileData {} /// Convenience type alias for our DRM `File` type pub(crate) type TyrDrmFile = drm::file::File; impl drm::file::DriverFile for TyrDrmFileData { type Driver = TyrDrmDriver; fn open(_dev: &drm::Device) -> Result>> { KBox::try_pin_init(try_pin_init!(Self {}), GFP_KERNEL) } } impl TyrDrmFileData { pub(crate) fn dev_query( ddev: &TyrDrmDevice, devquery: &mut uapi::drm_panthor_dev_query, _file: &TyrDrmFile, ) -> Result { if devquery.pointer == 0 { match devquery.type_ { uapi::drm_panthor_dev_query_type_DRM_PANTHOR_DEV_QUERY_GPU_INFO => { devquery.size = core::mem::size_of_val(&ddev.gpu_info) as u32; Ok(0) } _ => Err(EINVAL), } } else { match devquery.type_ { uapi::drm_panthor_dev_query_type_DRM_PANTHOR_DEV_QUERY_GPU_INFO => { let mut writer = UserSlice::new( UserPtr::from_addr(devquery.pointer as usize), devquery.size as usize, ) .writer(); writer.write(&ddev.gpu_info)?; Ok(0) } _ => Err(EINVAL), } } } }