1*06d5e247SLoGin use alloc::{ 2*06d5e247SLoGin string::{String, ToString}, 3*06d5e247SLoGin sync::{Arc, Weak}, 4*06d5e247SLoGin }; 5*06d5e247SLoGin 6*06d5e247SLoGin use crate::{ 7*06d5e247SLoGin driver::{ 8*06d5e247SLoGin base::{ 9*06d5e247SLoGin device::{ 10*06d5e247SLoGin bus::{Bus, BusState}, 11*06d5e247SLoGin Device, DeviceNumber, DevicePrivateData, DeviceType, IdTable, 12*06d5e247SLoGin }, 13*06d5e247SLoGin kobject::{KObjType, KObject, KObjectState, LockedKObjectState}, 14*06d5e247SLoGin kset::KSet, 15*06d5e247SLoGin }, 16*06d5e247SLoGin Driver, 17*06d5e247SLoGin }, 18*06d5e247SLoGin filesystem::kernfs::KernFSInode, 19*06d5e247SLoGin libs::{ 20*06d5e247SLoGin rwlock::{RwLockReadGuard, RwLockWriteGuard}, 21*06d5e247SLoGin spinlock::SpinLock, 22*06d5e247SLoGin }, 23*06d5e247SLoGin }; 24b087521eSChiichen 25b087521eSChiichen use super::{super::device::DeviceState, CompatibleTable}; 262a7d773dSTingHuang 272a7d773dSTingHuang /// @brief: 实现该trait的设备实例应挂载在platform总线上, 282a7d773dSTingHuang /// 同时应该实现Device trait 292a7d773dSTingHuang pub trait PlatformDevice: Device { 300663027bSTingHuang fn compatible_table(&self) -> CompatibleTable; 312a7d773dSTingHuang /// @brief: 判断设备是否初始化 322a7d773dSTingHuang /// @parameter: None 332a7d773dSTingHuang /// @return: 如果已经初始化,返回true,否则,返回false 342a7d773dSTingHuang fn is_initialized(&self) -> bool; 352a7d773dSTingHuang 362a7d773dSTingHuang /// @brief: 设置设备状态 372a7d773dSTingHuang /// @parameter set_state: 设备状态 382a7d773dSTingHuang /// @return: None 392a7d773dSTingHuang fn set_state(&self, set_state: DeviceState); 402a7d773dSTingHuang } 41*06d5e247SLoGin 42*06d5e247SLoGin #[derive(Debug)] 43*06d5e247SLoGin #[cast_to([sync] Device)] 44*06d5e247SLoGin pub struct PlatformBusDevice { 45*06d5e247SLoGin inner: SpinLock<InnerPlatformBusDevice>, 46*06d5e247SLoGin kobj_state: LockedKObjectState, 47*06d5e247SLoGin } 48*06d5e247SLoGin 49*06d5e247SLoGin impl PlatformBusDevice { 50*06d5e247SLoGin /// @brief: 创建一个加锁的platform总线实例 51*06d5e247SLoGin /// @parameter: None 52*06d5e247SLoGin /// @return: platform总线实例 53*06d5e247SLoGin pub fn new( 54*06d5e247SLoGin data: DevicePrivateData, 55*06d5e247SLoGin parent: Option<Weak<dyn KObject>>, 56*06d5e247SLoGin ) -> Arc<PlatformBusDevice> { 57*06d5e247SLoGin return Arc::new(PlatformBusDevice { 58*06d5e247SLoGin inner: SpinLock::new(InnerPlatformBusDevice::new(data, parent)), 59*06d5e247SLoGin kobj_state: LockedKObjectState::new(KObjectState::empty()), 60*06d5e247SLoGin }); 61*06d5e247SLoGin } 62*06d5e247SLoGin 63*06d5e247SLoGin /// @brief: 获取总线的匹配表 64*06d5e247SLoGin /// @parameter: None 65*06d5e247SLoGin /// @return: platform总线匹配表 66*06d5e247SLoGin #[inline] 67*06d5e247SLoGin #[allow(dead_code)] 68*06d5e247SLoGin fn compatible_table(&self) -> CompatibleTable { 69*06d5e247SLoGin CompatibleTable::new(vec!["platform"]) 70*06d5e247SLoGin } 71*06d5e247SLoGin 72*06d5e247SLoGin /// @brief: 判断总线是否初始化 73*06d5e247SLoGin /// @parameter: None 74*06d5e247SLoGin /// @return: 已初始化,返回true,否则,返回false 75*06d5e247SLoGin #[inline] 76*06d5e247SLoGin #[allow(dead_code)] 77*06d5e247SLoGin fn is_initialized(&self) -> bool { 78*06d5e247SLoGin let state = self.inner.lock().state; 79*06d5e247SLoGin match state { 80*06d5e247SLoGin BusState::Initialized => true, 81*06d5e247SLoGin _ => false, 82*06d5e247SLoGin } 83*06d5e247SLoGin } 84*06d5e247SLoGin 85*06d5e247SLoGin /// @brief: 设置总线状态 86*06d5e247SLoGin /// @parameter set_state: 总线状态BusState 87*06d5e247SLoGin /// @return: None 88*06d5e247SLoGin #[inline] 89*06d5e247SLoGin #[allow(dead_code)] 90*06d5e247SLoGin fn set_state(&self, set_state: BusState) { 91*06d5e247SLoGin let state = &mut self.inner.lock().state; 92*06d5e247SLoGin *state = set_state; 93*06d5e247SLoGin } 94*06d5e247SLoGin 95*06d5e247SLoGin /// @brief: 获取总线状态 96*06d5e247SLoGin /// @parameter: None 97*06d5e247SLoGin /// @return: 总线状态 98*06d5e247SLoGin #[inline] 99*06d5e247SLoGin #[allow(dead_code)] 100*06d5e247SLoGin fn get_state(&self) -> BusState { 101*06d5e247SLoGin let state = self.inner.lock().state; 102*06d5e247SLoGin return state; 103*06d5e247SLoGin } 104*06d5e247SLoGin 105*06d5e247SLoGin // /// @brief: 106*06d5e247SLoGin // /// @parameter: None 107*06d5e247SLoGin // /// @return: 总线状态 108*06d5e247SLoGin // #[inline] 109*06d5e247SLoGin // #[allow(dead_code)] 110*06d5e247SLoGin // fn set_driver(&self, driver: Option<Arc<LockedPlatformBusDriver>>) { 111*06d5e247SLoGin // self.0.lock().driver = driver; 112*06d5e247SLoGin // } 113*06d5e247SLoGin } 114*06d5e247SLoGin 115*06d5e247SLoGin /// @brief: platform总线 116*06d5e247SLoGin #[allow(dead_code)] 117*06d5e247SLoGin #[derive(Debug, Clone)] 118*06d5e247SLoGin pub struct InnerPlatformBusDevice { 119*06d5e247SLoGin name: String, 120*06d5e247SLoGin data: DevicePrivateData, 121*06d5e247SLoGin state: BusState, // 总线状态 122*06d5e247SLoGin parent: Option<Weak<dyn KObject>>, // 总线的父对象 123*06d5e247SLoGin 124*06d5e247SLoGin kernfs_inode: Option<Arc<KernFSInode>>, 125*06d5e247SLoGin /// 当前设备挂载到的总线 126*06d5e247SLoGin bus: Option<Arc<dyn Bus>>, 127*06d5e247SLoGin /// 当前设备已经匹配的驱动 128*06d5e247SLoGin driver: Option<Arc<dyn Driver>>, 129*06d5e247SLoGin } 130*06d5e247SLoGin 131*06d5e247SLoGin /// @brief: platform方法集 132*06d5e247SLoGin impl InnerPlatformBusDevice { 133*06d5e247SLoGin /// @brief: 创建一个platform总线实例 134*06d5e247SLoGin /// @parameter: None 135*06d5e247SLoGin /// @return: platform总线实例 136*06d5e247SLoGin pub fn new(data: DevicePrivateData, parent: Option<Weak<dyn KObject>>) -> Self { 137*06d5e247SLoGin Self { 138*06d5e247SLoGin data, 139*06d5e247SLoGin name: "platform".to_string(), 140*06d5e247SLoGin state: BusState::NotInitialized, 141*06d5e247SLoGin parent, 142*06d5e247SLoGin kernfs_inode: None, 143*06d5e247SLoGin bus: None, 144*06d5e247SLoGin driver: None, 145*06d5e247SLoGin } 146*06d5e247SLoGin } 147*06d5e247SLoGin } 148*06d5e247SLoGin 149*06d5e247SLoGin impl KObject for PlatformBusDevice { 150*06d5e247SLoGin fn as_any_ref(&self) -> &dyn core::any::Any { 151*06d5e247SLoGin self 152*06d5e247SLoGin } 153*06d5e247SLoGin 154*06d5e247SLoGin fn parent(&self) -> Option<Weak<dyn KObject>> { 155*06d5e247SLoGin self.inner.lock().parent.clone() 156*06d5e247SLoGin } 157*06d5e247SLoGin 158*06d5e247SLoGin fn inode(&self) -> Option<Arc<KernFSInode>> { 159*06d5e247SLoGin self.inner.lock().kernfs_inode.clone() 160*06d5e247SLoGin } 161*06d5e247SLoGin 162*06d5e247SLoGin fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 163*06d5e247SLoGin self.inner.lock().kernfs_inode = inode; 164*06d5e247SLoGin } 165*06d5e247SLoGin 166*06d5e247SLoGin fn kobj_type(&self) -> Option<&'static dyn KObjType> { 167*06d5e247SLoGin None 168*06d5e247SLoGin } 169*06d5e247SLoGin 170*06d5e247SLoGin fn kset(&self) -> Option<Arc<KSet>> { 171*06d5e247SLoGin None 172*06d5e247SLoGin } 173*06d5e247SLoGin 174*06d5e247SLoGin fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 175*06d5e247SLoGin self.kobj_state.read() 176*06d5e247SLoGin } 177*06d5e247SLoGin 178*06d5e247SLoGin fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 179*06d5e247SLoGin self.kobj_state.write() 180*06d5e247SLoGin } 181*06d5e247SLoGin 182*06d5e247SLoGin fn set_kobj_state(&self, state: KObjectState) { 183*06d5e247SLoGin *self.kobj_state.write() = state; 184*06d5e247SLoGin } 185*06d5e247SLoGin 186*06d5e247SLoGin fn name(&self) -> String { 187*06d5e247SLoGin self.inner.lock().name.clone() 188*06d5e247SLoGin } 189*06d5e247SLoGin 190*06d5e247SLoGin fn set_name(&self, name: String) { 191*06d5e247SLoGin self.inner.lock().name = name; 192*06d5e247SLoGin } 193*06d5e247SLoGin 194*06d5e247SLoGin fn set_kset(&self, _kset: Option<Arc<KSet>>) { 195*06d5e247SLoGin todo!() 196*06d5e247SLoGin } 197*06d5e247SLoGin 198*06d5e247SLoGin fn set_parent(&self, parent: Option<Weak<dyn KObject>>) { 199*06d5e247SLoGin self.inner.lock().parent = parent; 200*06d5e247SLoGin } 201*06d5e247SLoGin } 202*06d5e247SLoGin 203*06d5e247SLoGin /// @brief: 为Platform实现Device trait,platform总线也是一种设备,属于总线设备类型 204*06d5e247SLoGin impl Device for PlatformBusDevice { 205*06d5e247SLoGin #[inline] 206*06d5e247SLoGin #[allow(dead_code)] 207*06d5e247SLoGin fn dev_type(&self) -> DeviceType { 208*06d5e247SLoGin return DeviceType::Bus; 209*06d5e247SLoGin } 210*06d5e247SLoGin 211*06d5e247SLoGin #[inline] 212*06d5e247SLoGin #[allow(dead_code)] 213*06d5e247SLoGin fn id_table(&self) -> IdTable { 214*06d5e247SLoGin IdTable::new("platform".to_string(), DeviceNumber::new(0)) 215*06d5e247SLoGin } 216*06d5e247SLoGin 217*06d5e247SLoGin fn bus(&self) -> Option<Arc<dyn Bus>> { 218*06d5e247SLoGin self.inner.lock().bus.clone() 219*06d5e247SLoGin } 220*06d5e247SLoGin 221*06d5e247SLoGin fn driver(&self) -> Option<Arc<dyn Driver>> { 222*06d5e247SLoGin self.inner.lock().driver.clone() 223*06d5e247SLoGin } 224*06d5e247SLoGin 225*06d5e247SLoGin #[inline] 226*06d5e247SLoGin fn is_dead(&self) -> bool { 227*06d5e247SLoGin false 228*06d5e247SLoGin } 229*06d5e247SLoGin 230*06d5e247SLoGin fn set_driver(&self, driver: Option<Arc<dyn Driver>>) { 231*06d5e247SLoGin self.inner.lock().driver = driver; 232*06d5e247SLoGin } 233*06d5e247SLoGin } 234