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