gem.rs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // SPDX-License-Identifier: GPL-2.0
  2. use kernel::{
  3. drm,
  4. drm::{gem, gem::BaseObject},
  5. page,
  6. prelude::*,
  7. sync::aref::ARef,
  8. };
  9. use crate::{
  10. driver::{NovaDevice, NovaDriver},
  11. file::File,
  12. };
  13. /// GEM Object inner driver data
  14. #[pin_data]
  15. pub(crate) struct NovaObject {}
  16. impl gem::DriverObject for NovaObject {
  17. type Driver = NovaDriver;
  18. fn new(_dev: &NovaDevice, _size: usize) -> impl PinInit<Self, Error> {
  19. try_pin_init!(NovaObject {})
  20. }
  21. }
  22. impl NovaObject {
  23. /// Create a new DRM GEM object.
  24. pub(crate) fn new(dev: &NovaDevice, size: usize) -> Result<ARef<gem::Object<Self>>> {
  25. if size == 0 {
  26. return Err(EINVAL);
  27. }
  28. let aligned_size = page::page_align(size).ok_or(EINVAL)?;
  29. gem::Object::new(dev, aligned_size)
  30. }
  31. /// Look up a GEM object handle for a `File` and return an `ObjectRef` for it.
  32. #[inline]
  33. pub(crate) fn lookup_handle(
  34. file: &drm::File<File>,
  35. handle: u32,
  36. ) -> Result<ARef<gem::Object<Self>>> {
  37. gem::Object::lookup_handle(file, handle)
  38. }
  39. }