driver.rs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. use alloc::{sync::Arc, vec::Vec};
  2. use system_error::SystemError;
  3. use crate::driver::base::device::{
  4. bus::Bus,
  5. driver::{driver_manager, Driver},
  6. };
  7. use super::{dev_id::PciDeviceID, device::PciDevice, subsys::pci_bus};
  8. /// # trait功能
  9. /// Pci驱动应该实现的trait
  10. ///
  11. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/pci.h#907
  12. #[allow(dead_code)]
  13. pub trait PciDriver: Driver {
  14. /// # 函数的功能
  15. /// 对设备进行probe操作
  16. ///
  17. /// ## 参数:
  18. /// - 'device' :要进行probe的设备
  19. /// - 'id' :设备的ID(暂时不清楚为什么需要这个,依Linux实现是有ID的)
  20. ///
  21. /// ## 返回值:
  22. /// - Ok:probe成功
  23. /// - Err:probe失败
  24. fn probe(&self, device: &Arc<dyn PciDevice>, id: &PciDeviceID) -> Result<(), SystemError>;
  25. fn remove(&self, device: &Arc<dyn PciDevice>) -> Result<(), SystemError>;
  26. fn shutdown(&self, device: &Arc<dyn PciDevice>) -> Result<(), SystemError>;
  27. fn suspend(&self, device: &Arc<dyn PciDevice>) -> Result<(), SystemError>;
  28. fn resume(&self, device: &Arc<dyn PciDevice>) -> Result<(), SystemError>;
  29. /// # 函数的功能
  30. /// 向驱动中加入一个PciDeviceID,表示该驱动可以支持该ID的设备
  31. ///
  32. /// ## 参数:
  33. /// - 'id' :要添加的ID
  34. ///
  35. /// ## 返回值:
  36. /// - 'Ok':添加成功
  37. /// - 'Err':添加失败
  38. fn add_dynid(&mut self, id: PciDeviceID) -> Result<(), SystemError>;
  39. /// # 函数的功能
  40. /// 每个Pci驱动都应该持有一个支持ID的列表,并通过该函数进行访问
  41. ///
  42. /// ## 返回值:
  43. /// - 'Some(Vec)': 支持ID的列表
  44. /// - 'None':未能获取列表
  45. fn locked_dynid_list(&self) -> Option<Vec<Arc<PciDeviceID>>>;
  46. /// # 函数的功能
  47. /// 检测当前驱动是否支持目标设备
  48. ///
  49. /// ## 参数:
  50. /// - 'dev' :要检测的设备
  51. ///
  52. /// ## 返回值:
  53. /// - 'Some(Arc<PciDeviceID>)': 如果支持,则返回支持的ID
  54. /// - 'None': 不支持的设备
  55. fn match_dev(&self, dev: &Arc<dyn PciDevice>) -> Option<Arc<PciDeviceID>> {
  56. for i in self.locked_dynid_list()?.iter() {
  57. if i.match_dev(dev) {
  58. return Some(i.clone());
  59. }
  60. }
  61. return None;
  62. }
  63. }
  64. pub struct PciDriverManager;
  65. pub fn pci_driver_manager() -> &'static PciDriverManager {
  66. &PciDriverManager
  67. }
  68. impl PciDriverManager {
  69. pub fn register(&self, driver: Arc<dyn PciDriver>) -> Result<(), SystemError> {
  70. driver.set_bus(Some(Arc::downgrade(&(pci_bus() as Arc<dyn Bus>))));
  71. return driver_manager().register(driver as Arc<dyn Driver>);
  72. }
  73. #[allow(dead_code)]
  74. pub fn unregister(&self, driver: &Arc<dyn PciDriver>) {
  75. driver_manager().unregister(&(driver.clone() as Arc<dyn Driver>));
  76. }
  77. }