Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at nocache-cleanup 56 lines 1.6 kB view raw
1// SPDX-License-Identifier: GPL-2.0 or MIT 2 3use kernel::drm; 4use kernel::prelude::*; 5use kernel::uaccess::UserSlice; 6use kernel::uapi; 7 8use crate::driver::TyrDevice; 9use crate::TyrDriver; 10 11#[pin_data] 12pub(crate) struct File {} 13 14/// Convenience type alias for our DRM `File` type 15pub(crate) type DrmFile = drm::file::File<File>; 16 17impl 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 25impl 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}