driver.rs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // SPDX-License-Identifier: GPL-2.0
  2. use kernel::{
  3. auxiliary,
  4. device::Core,
  5. drm::{
  6. self,
  7. gem,
  8. ioctl, //
  9. },
  10. prelude::*,
  11. sync::aref::ARef, //
  12. };
  13. use crate::file::File;
  14. use crate::gem::NovaObject;
  15. pub(crate) struct NovaDriver {
  16. #[expect(unused)]
  17. drm: ARef<drm::Device<Self>>,
  18. }
  19. /// Convienence type alias for the DRM device type for this driver
  20. pub(crate) type NovaDevice = drm::Device<NovaDriver>;
  21. #[pin_data]
  22. pub(crate) struct NovaData {
  23. pub(crate) adev: ARef<auxiliary::Device>,
  24. }
  25. const INFO: drm::DriverInfo = drm::DriverInfo {
  26. major: 0,
  27. minor: 0,
  28. patchlevel: 0,
  29. name: c"nova",
  30. desc: c"Nvidia Graphics",
  31. };
  32. const NOVA_CORE_MODULE_NAME: &CStr = c"NovaCore";
  33. const AUXILIARY_NAME: &CStr = c"nova-drm";
  34. kernel::auxiliary_device_table!(
  35. AUX_TABLE,
  36. MODULE_AUX_TABLE,
  37. <NovaDriver as auxiliary::Driver>::IdInfo,
  38. [(
  39. auxiliary::DeviceId::new(NOVA_CORE_MODULE_NAME, AUXILIARY_NAME),
  40. ()
  41. )]
  42. );
  43. impl auxiliary::Driver for NovaDriver {
  44. type IdInfo = ();
  45. const ID_TABLE: auxiliary::IdTable<Self::IdInfo> = &AUX_TABLE;
  46. fn probe(adev: &auxiliary::Device<Core>, _info: &Self::IdInfo) -> impl PinInit<Self, Error> {
  47. let data = try_pin_init!(NovaData { adev: adev.into() });
  48. let drm = drm::Device::<Self>::new(adev.as_ref(), data)?;
  49. drm::Registration::new_foreign_owned(&drm, adev.as_ref(), 0)?;
  50. Ok(Self { drm })
  51. }
  52. }
  53. #[vtable]
  54. impl drm::Driver for NovaDriver {
  55. type Data = NovaData;
  56. type File = File;
  57. type Object = gem::Object<NovaObject>;
  58. const INFO: drm::DriverInfo = INFO;
  59. kernel::declare_drm_ioctls! {
  60. (NOVA_GETPARAM, drm_nova_getparam, ioctl::RENDER_ALLOW, File::get_param),
  61. (NOVA_GEM_CREATE, drm_nova_gem_create, ioctl::AUTH | ioctl::RENDER_ALLOW, File::gem_create),
  62. (NOVA_GEM_INFO, drm_nova_gem_info, ioctl::AUTH | ioctl::RENDER_ALLOW, File::gem_info),
  63. }
  64. }