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