file.rs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // SPDX-License-Identifier: GPL-2.0
  2. use crate::driver::{NovaDevice, NovaDriver};
  3. use crate::gem::NovaObject;
  4. use kernel::{
  5. alloc::flags::*,
  6. drm::{self, gem::BaseObject},
  7. pci,
  8. prelude::*,
  9. uapi,
  10. };
  11. pub(crate) struct File;
  12. impl drm::file::DriverFile for File {
  13. type Driver = NovaDriver;
  14. fn open(_dev: &NovaDevice) -> Result<Pin<KBox<Self>>> {
  15. Ok(KBox::new(Self, GFP_KERNEL)?.into())
  16. }
  17. }
  18. impl File {
  19. /// IOCTL: get_param: Query GPU / driver metadata.
  20. pub(crate) fn get_param(
  21. dev: &NovaDevice,
  22. getparam: &mut uapi::drm_nova_getparam,
  23. _file: &drm::File<File>,
  24. ) -> Result<u32> {
  25. let adev = &dev.adev;
  26. let parent = adev.parent();
  27. let pdev: &pci::Device = parent.try_into()?;
  28. let value = match getparam.param as u32 {
  29. uapi::NOVA_GETPARAM_VRAM_BAR_SIZE => pdev.resource_len(1)?,
  30. _ => return Err(EINVAL),
  31. };
  32. getparam.value = Into::<u64>::into(value);
  33. Ok(0)
  34. }
  35. /// IOCTL: gem_create: Create a new DRM GEM object.
  36. pub(crate) fn gem_create(
  37. dev: &NovaDevice,
  38. req: &mut uapi::drm_nova_gem_create,
  39. file: &drm::File<File>,
  40. ) -> Result<u32> {
  41. let obj = NovaObject::new(dev, req.size.try_into()?)?;
  42. req.handle = obj.create_handle(file)?;
  43. Ok(0)
  44. }
  45. /// IOCTL: gem_info: Query GEM metadata.
  46. pub(crate) fn gem_info(
  47. _dev: &NovaDevice,
  48. req: &mut uapi::drm_nova_gem_info,
  49. file: &drm::File<File>,
  50. ) -> Result<u32> {
  51. let bo = NovaObject::lookup_handle(file, req.handle)?;
  52. req.size = bo.size().try_into()?;
  53. Ok(0)
  54. }
  55. }