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