bus.rs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. use alloc::{
  2. string::{String, ToString},
  3. sync::Arc,
  4. };
  5. use crate::{
  6. driver::base::{
  7. device::{
  8. bus::{bus_manager, Bus},
  9. driver::Driver,
  10. Device,
  11. },
  12. subsys::SubSysPrivate,
  13. },
  14. syscall::SystemError,
  15. };
  16. use super::AcpiManager;
  17. impl AcpiManager {
  18. /// 通过acpi来匹配驱动
  19. ///
  20. /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/acpi/bus.c#949
  21. pub fn driver_match_device(
  22. &self,
  23. _driver: &Arc<dyn Driver>,
  24. _device: &Arc<dyn Device>,
  25. ) -> Result<bool, SystemError> {
  26. // todo:
  27. return Ok(false);
  28. }
  29. /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1286
  30. pub(super) fn bus_init(&self) -> Result<(), SystemError> {
  31. self.acpi_sysfs_init()?;
  32. let acpi_bus = AcpiBus::new();
  33. bus_manager()
  34. .register(acpi_bus as Arc<dyn Bus>)
  35. .expect("acpi_bus register failed");
  36. return Ok(());
  37. }
  38. }
  39. /// ACPI总线
  40. ///
  41. /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1072
  42. #[derive(Debug)]
  43. pub(super) struct AcpiBus {
  44. private: SubSysPrivate,
  45. }
  46. impl AcpiBus {
  47. pub fn new() -> Arc<Self> {
  48. let bus = Arc::new(Self {
  49. private: SubSysPrivate::new("acpi".to_string(), None, None, &[]),
  50. });
  51. bus.subsystem()
  52. .set_bus(Some(Arc::downgrade(&(bus.clone() as Arc<dyn Bus>))));
  53. return bus;
  54. }
  55. }
  56. impl Bus for AcpiBus {
  57. fn name(&self) -> String {
  58. return self.private.subsys().as_kobject().name();
  59. }
  60. fn dev_name(&self) -> String {
  61. self.name()
  62. }
  63. /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1056
  64. fn remove(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
  65. todo!("acpi_bus: remove")
  66. }
  67. fn shutdown(&self, _device: &Arc<dyn Device>) {
  68. return;
  69. }
  70. fn resume(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
  71. return Ok(());
  72. }
  73. /// 通过acpi来匹配驱动
  74. ///
  75. /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1005
  76. fn match_device(
  77. &self,
  78. _device: &Arc<dyn Device>,
  79. _driver: &Arc<dyn Driver>,
  80. ) -> Result<bool, SystemError> {
  81. // todo: 通过acpi来匹配驱动
  82. return Ok(false);
  83. }
  84. /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/acpi/bus.c#1019
  85. fn probe(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
  86. todo!("acpi_bus: probe")
  87. }
  88. fn subsystem(&self) -> &SubSysPrivate {
  89. return &self.private;
  90. }
  91. }
  92. /// Acpi设备应当实现的trait
  93. ///
  94. /// 所有的实现了 AcpiDevice trait的结构体,都应该在结构体上方标注`#[cast_to([sync] AcpiDevice)]
  95. ///
  96. /// todo: 仿照linux的acpi_device去设计这个trait
  97. ///
  98. ///
  99. /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/include/acpi/acpi_bus.h#364
  100. pub trait AcpiDevice: Device {}
  101. /// Acpi驱动应当实现的trait
  102. ///
  103. /// 所有的实现了 AcpiDriver trait的结构体,都应该在结构体上方标注`#[cast_to([sync] AcpiDriver)]
  104. ///
  105. /// todo: 仿照linux的acpi_driver去设计这个trait
  106. ///
  107. /// 参考 https://opengrok.ringotek.cn/xref/linux-6.1.9/include/acpi/acpi_bus.h#163
  108. pub trait AcpiDriver: Driver {}