// SPDX-License-Identifier: GPL-2.0 or MIT use kernel::drm; use kernel::prelude::*; use kernel::uaccess::UserSlice; use kernel::uapi; use crate::driver::TyrDevice; use crate::TyrDriver; #[pin_data] pub(crate) struct File {} /// Convenience type alias for our DRM `File` type pub(crate) type DrmFile = drm::file::File; impl drm::file::DriverFile for File { type Driver = TyrDriver; fn open(_dev: &drm::Device) -> Result>> { KBox::try_pin_init(try_pin_init!(Self {}), GFP_KERNEL) } } impl File { pub(crate) fn dev_query( tdev: &TyrDevice, devquery: &mut uapi::drm_panthor_dev_query, _file: &DrmFile, ) -> 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(&tdev.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(&tdev.gpu_info)?; Ok(0) } _ => Err(EINVAL), } } } }