| 1 | |
| 2 |
|
| 3 | use crate::driver::{NovaDevice, NovaDriver};
|
| 4 | use crate::gem::NovaObject;
|
| 5 | use kernel::{
|
| 6 | alloc::flags::*,
|
| 7 | auxiliary,
|
| 8 | device::Bound,
|
| 9 | drm::{
|
| 10 | self,
|
| 11 | gem::BaseObject,
|
| 12 | Registered, |
| 13 | },
|
| 14 | pci,
|
| 15 | prelude::*,
|
| 16 | uapi,
|
| 17 | };
|
| 18 |
|
| 19 | pub(crate) struct File;
|
| 20 |
|
| 21 | impl drm::file::DriverFile for File {
|
| 22 | type Driver = NovaDriver;
|
| 23 |
|
| 24 | fn open(_dev: &NovaDevice) -> Result<Pin<KBox<Self>>> {
|
| 25 | Ok(KBox::new(Self, GFP_KERNEL)?.into())
|
| 26 | }
|
| 27 | }
|
| 28 |
|
| 29 | impl File {
|
| 30 | |
| 31 | pub(crate) fn get_param(
|
| 32 | dev: &NovaDevice<Registered>,
|
| 33 | _reg_data: &(),
|
| 34 | getparam: &mut uapi::drm_nova_getparam,
|
| 35 | _file: &drm::File<File>,
|
| 36 | ) -> Result<u32> {
|
| 37 | let adev: &auxiliary::Device<Bound> = dev.as_ref();
|
| 38 | let pdev: &pci::Device<Bound> = adev.parent().try_into()?;
|
| 39 |
|
| 40 | let value = match getparam.param as u32 {
|
| 41 | uapi::NOVA_GETPARAM_VRAM_BAR_SIZE => pdev.resource_len(1)?,
|
| 42 | _ => return Err(EINVAL),
|
| 43 | };
|
| 44 |
|
| 45 | getparam.value = Into::<u64>::into(value);
|
| 46 |
|
| 47 | Ok(0)
|
| 48 | }
|
| 49 |
|
| 50 | |
| 51 | pub(crate) fn gem_create(
|
| 52 | dev: &NovaDevice<Registered>,
|
| 53 | _reg_data: &(),
|
| 54 | req: &mut uapi::drm_nova_gem_create,
|
| 55 | file: &drm::File<File>,
|
| 56 | ) -> Result<u32> {
|
| 57 | let obj = NovaObject::new(dev, req.size.try_into()?)?;
|
| 58 |
|
| 59 | req.handle = obj.create_handle(file)?;
|
| 60 |
|
| 61 | Ok(0)
|
| 62 | }
|
| 63 |
|
| 64 | |
| 65 | pub(crate) fn gem_info(
|
| 66 | _dev: &NovaDevice<Registered>,
|
| 67 | _reg_data: &(),
|
| 68 | req: &mut uapi::drm_nova_gem_info,
|
| 69 | file: &drm::File<File>,
|
| 70 | ) -> Result<u32> {
|
| 71 | let bo = NovaObject::lookup_handle(file, req.handle)?;
|
| 72 |
|
| 73 | req.size = bo.size().try_into()?;
|
| 74 |
|
| 75 | Ok(0)
|
| 76 | }
|
| 77 | }
|