106d5e247SLoGin use alloc::{ 206d5e247SLoGin string::{String, ToString}, 306d5e247SLoGin sync::{Arc, Weak}, 406d5e247SLoGin }; 5a03c4f9dSLoGin use ida::IdAllocator; 606d5e247SLoGin 706d5e247SLoGin use crate::{ 8a03c4f9dSLoGin driver::base::{ 906d5e247SLoGin device::{ 1006d5e247SLoGin bus::{Bus, BusState}, 11a03c4f9dSLoGin device_manager, 12a03c4f9dSLoGin driver::Driver, 1306d5e247SLoGin Device, DeviceNumber, DevicePrivateData, DeviceType, IdTable, 1406d5e247SLoGin }, 1506d5e247SLoGin kobject::{KObjType, KObject, KObjectState, LockedKObjectState}, 1606d5e247SLoGin kset::KSet, 1706d5e247SLoGin }, 1806d5e247SLoGin filesystem::kernfs::KernFSInode, 1906d5e247SLoGin libs::{ 2006d5e247SLoGin rwlock::{RwLockReadGuard, RwLockWriteGuard}, 2106d5e247SLoGin spinlock::SpinLock, 2206d5e247SLoGin }, 23a03c4f9dSLoGin syscall::SystemError, 2406d5e247SLoGin }; 25b087521eSChiichen 26a03c4f9dSLoGin use super::{super::device::DeviceState, platform_bus, platform_bus_device, CompatibleTable}; 27a03c4f9dSLoGin 28a03c4f9dSLoGin /// 平台设备id分配器 29*7b32f508SLoGin static PLATFORM_DEVID_IDA: IdAllocator = IdAllocator::new(0, i32::MAX as usize); 30a03c4f9dSLoGin 31a03c4f9dSLoGin #[inline(always)] 32a03c4f9dSLoGin pub fn platform_device_manager() -> &'static PlatformDeviceManager { 33a03c4f9dSLoGin &PlatformDeviceManager 34a03c4f9dSLoGin } 35a03c4f9dSLoGin 36a03c4f9dSLoGin /// 没有平台设备id 37a03c4f9dSLoGin pub const PLATFORM_DEVID_NONE: i32 = -1; 38a03c4f9dSLoGin /// 请求自动分配这个平台设备id 39a03c4f9dSLoGin pub const PLATFORM_DEVID_AUTO: i32 = -2; 402a7d773dSTingHuang 412a7d773dSTingHuang /// @brief: 实现该trait的设备实例应挂载在platform总线上, 422a7d773dSTingHuang /// 同时应该实现Device trait 43a03c4f9dSLoGin /// 44a03c4f9dSLoGin /// ## 注意 45a03c4f9dSLoGin /// 46a03c4f9dSLoGin /// 应当在所有实现这个trait的结构体上方,添加 `#[cast_to([sync] PlatformDriver)]`, 47a03c4f9dSLoGin /// 否则运行时将报错“该对象不是PlatformDriver” 482a7d773dSTingHuang pub trait PlatformDevice: Device { 49a03c4f9dSLoGin fn pdev_name(&self) -> &str; 50a03c4f9dSLoGin /// 返回平台设备id,以及这个id是否是自动生成的 51a03c4f9dSLoGin /// 52a03c4f9dSLoGin /// 请注意,如果当前设备还没有id,应该返回 53a03c4f9dSLoGin /// (PLATFORM_DEVID_NONE, false) 54a03c4f9dSLoGin fn pdev_id(&self) -> (i32, bool) { 55a03c4f9dSLoGin (PLATFORM_DEVID_NONE, false) 56a03c4f9dSLoGin } 57a03c4f9dSLoGin 58a03c4f9dSLoGin /// 设置平台设备id 59a03c4f9dSLoGin fn set_pdev_id(&self, id: i32); 60a03c4f9dSLoGin /// 设置id是否为自动分配 61a03c4f9dSLoGin fn set_pdev_id_auto(&self, id_auto: bool); 62a03c4f9dSLoGin 630663027bSTingHuang fn compatible_table(&self) -> CompatibleTable; 642a7d773dSTingHuang /// @brief: 判断设备是否初始化 652a7d773dSTingHuang /// @parameter: None 662a7d773dSTingHuang /// @return: 如果已经初始化,返回true,否则,返回false 672a7d773dSTingHuang fn is_initialized(&self) -> bool; 682a7d773dSTingHuang 692a7d773dSTingHuang /// @brief: 设置设备状态 702a7d773dSTingHuang /// @parameter set_state: 设备状态 712a7d773dSTingHuang /// @return: None 722a7d773dSTingHuang fn set_state(&self, set_state: DeviceState); 732a7d773dSTingHuang } 7406d5e247SLoGin 7506d5e247SLoGin #[derive(Debug)] 76a03c4f9dSLoGin pub struct PlatformDeviceManager; 77a03c4f9dSLoGin 78a03c4f9dSLoGin impl PlatformDeviceManager { 79a03c4f9dSLoGin /// platform_device_add - add a platform device to device hierarchy 80a03c4f9dSLoGin pub fn device_add(&self, pdev: Arc<dyn PlatformDevice>) -> Result<(), SystemError> { 81a03c4f9dSLoGin if pdev.parent().is_none() { 82a03c4f9dSLoGin pdev.set_parent(Some(Arc::downgrade( 83a03c4f9dSLoGin &(platform_bus_device() as Arc<dyn KObject>), 84a03c4f9dSLoGin ))); 85a03c4f9dSLoGin } 86a03c4f9dSLoGin 87a03c4f9dSLoGin pdev.set_bus(Some(platform_bus() as Arc<dyn Bus>)); 88a03c4f9dSLoGin 89a03c4f9dSLoGin let id = pdev.pdev_id().0; 90a03c4f9dSLoGin match id { 91a03c4f9dSLoGin PLATFORM_DEVID_NONE => { 92a03c4f9dSLoGin pdev.set_name(format!("{}", pdev.pdev_name())); 93a03c4f9dSLoGin } 94a03c4f9dSLoGin PLATFORM_DEVID_AUTO => { 95a03c4f9dSLoGin let id = PLATFORM_DEVID_IDA.alloc().ok_or(SystemError::EOVERFLOW)?; 96a03c4f9dSLoGin pdev.set_pdev_id(id as i32); 97a03c4f9dSLoGin pdev.set_pdev_id_auto(true); 98a03c4f9dSLoGin pdev.set_name(format!("{}.{}.auto", pdev.pdev_name(), pdev.pdev_id().0)); 99a03c4f9dSLoGin } 100a03c4f9dSLoGin _ => { 101a03c4f9dSLoGin pdev.set_name(format!("{}.{}", pdev.pdev_name(), id)); 102a03c4f9dSLoGin } 103a03c4f9dSLoGin } 104a03c4f9dSLoGin 105a03c4f9dSLoGin // todo: 插入资源: https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/base/platform.c?fi=platform_device_add#691 106a03c4f9dSLoGin let r = device_manager().add_device(pdev.clone() as Arc<dyn Device>); 107a03c4f9dSLoGin if r.is_ok() { 108a03c4f9dSLoGin pdev.set_state(DeviceState::Initialized); 109a03c4f9dSLoGin return Ok(()); // success 110a03c4f9dSLoGin } else { 111a03c4f9dSLoGin // failed 112a03c4f9dSLoGin let pdevid = pdev.pdev_id(); 113a03c4f9dSLoGin if pdevid.1 { 114a03c4f9dSLoGin PLATFORM_DEVID_IDA.free(pdevid.0 as usize); 115a03c4f9dSLoGin pdev.set_pdev_id(PLATFORM_DEVID_AUTO); 116a03c4f9dSLoGin } 117a03c4f9dSLoGin 118a03c4f9dSLoGin return r; 119a03c4f9dSLoGin } 120a03c4f9dSLoGin } 121a03c4f9dSLoGin } 122a03c4f9dSLoGin 123a03c4f9dSLoGin #[derive(Debug)] 12406d5e247SLoGin #[cast_to([sync] Device)] 12506d5e247SLoGin pub struct PlatformBusDevice { 12606d5e247SLoGin inner: SpinLock<InnerPlatformBusDevice>, 12706d5e247SLoGin kobj_state: LockedKObjectState, 12806d5e247SLoGin } 12906d5e247SLoGin 13006d5e247SLoGin impl PlatformBusDevice { 13106d5e247SLoGin /// @brief: 创建一个加锁的platform总线实例 13206d5e247SLoGin /// @parameter: None 13306d5e247SLoGin /// @return: platform总线实例 13406d5e247SLoGin pub fn new( 13506d5e247SLoGin data: DevicePrivateData, 13606d5e247SLoGin parent: Option<Weak<dyn KObject>>, 13706d5e247SLoGin ) -> Arc<PlatformBusDevice> { 13806d5e247SLoGin return Arc::new(PlatformBusDevice { 13906d5e247SLoGin inner: SpinLock::new(InnerPlatformBusDevice::new(data, parent)), 140a03c4f9dSLoGin kobj_state: LockedKObjectState::new(None), 14106d5e247SLoGin }); 14206d5e247SLoGin } 14306d5e247SLoGin 14406d5e247SLoGin /// @brief: 获取总线的匹配表 14506d5e247SLoGin /// @parameter: None 14606d5e247SLoGin /// @return: platform总线匹配表 14706d5e247SLoGin #[inline] 14806d5e247SLoGin #[allow(dead_code)] 14906d5e247SLoGin fn compatible_table(&self) -> CompatibleTable { 15006d5e247SLoGin CompatibleTable::new(vec!["platform"]) 15106d5e247SLoGin } 15206d5e247SLoGin 15306d5e247SLoGin /// @brief: 判断总线是否初始化 15406d5e247SLoGin /// @parameter: None 15506d5e247SLoGin /// @return: 已初始化,返回true,否则,返回false 15606d5e247SLoGin #[inline] 15706d5e247SLoGin #[allow(dead_code)] 15806d5e247SLoGin fn is_initialized(&self) -> bool { 15906d5e247SLoGin let state = self.inner.lock().state; 16006d5e247SLoGin match state { 16106d5e247SLoGin BusState::Initialized => true, 16206d5e247SLoGin _ => false, 16306d5e247SLoGin } 16406d5e247SLoGin } 16506d5e247SLoGin 16606d5e247SLoGin /// @brief: 设置总线状态 16706d5e247SLoGin /// @parameter set_state: 总线状态BusState 16806d5e247SLoGin /// @return: None 16906d5e247SLoGin #[inline] 17006d5e247SLoGin #[allow(dead_code)] 17106d5e247SLoGin fn set_state(&self, set_state: BusState) { 17206d5e247SLoGin let state = &mut self.inner.lock().state; 17306d5e247SLoGin *state = set_state; 17406d5e247SLoGin } 17506d5e247SLoGin 17606d5e247SLoGin /// @brief: 获取总线状态 17706d5e247SLoGin /// @parameter: None 17806d5e247SLoGin /// @return: 总线状态 17906d5e247SLoGin #[inline] 18006d5e247SLoGin #[allow(dead_code)] 18106d5e247SLoGin fn get_state(&self) -> BusState { 18206d5e247SLoGin let state = self.inner.lock().state; 18306d5e247SLoGin return state; 18406d5e247SLoGin } 18506d5e247SLoGin } 18606d5e247SLoGin 18706d5e247SLoGin #[allow(dead_code)] 18806d5e247SLoGin #[derive(Debug, Clone)] 18906d5e247SLoGin pub struct InnerPlatformBusDevice { 19006d5e247SLoGin name: String, 19106d5e247SLoGin data: DevicePrivateData, 19206d5e247SLoGin state: BusState, // 总线状态 19306d5e247SLoGin parent: Option<Weak<dyn KObject>>, // 总线的父对象 19406d5e247SLoGin 19506d5e247SLoGin kernfs_inode: Option<Arc<KernFSInode>>, 19606d5e247SLoGin /// 当前设备挂载到的总线 19706d5e247SLoGin bus: Option<Arc<dyn Bus>>, 19806d5e247SLoGin /// 当前设备已经匹配的驱动 199a03c4f9dSLoGin driver: Option<Weak<dyn Driver>>, 200d7f5742aSLoGin 201d7f5742aSLoGin ktype: Option<&'static dyn KObjType>, 202d7f5742aSLoGin kset: Option<Arc<KSet>>, 20306d5e247SLoGin } 20406d5e247SLoGin 20506d5e247SLoGin impl InnerPlatformBusDevice { 20606d5e247SLoGin pub fn new(data: DevicePrivateData, parent: Option<Weak<dyn KObject>>) -> Self { 20706d5e247SLoGin Self { 20806d5e247SLoGin data, 20906d5e247SLoGin name: "platform".to_string(), 21006d5e247SLoGin state: BusState::NotInitialized, 21106d5e247SLoGin parent, 21206d5e247SLoGin kernfs_inode: None, 21306d5e247SLoGin bus: None, 21406d5e247SLoGin driver: None, 215d7f5742aSLoGin ktype: None, 216d7f5742aSLoGin kset: None, 21706d5e247SLoGin } 21806d5e247SLoGin } 21906d5e247SLoGin } 22006d5e247SLoGin 22106d5e247SLoGin impl KObject for PlatformBusDevice { 22206d5e247SLoGin fn as_any_ref(&self) -> &dyn core::any::Any { 22306d5e247SLoGin self 22406d5e247SLoGin } 22506d5e247SLoGin 22606d5e247SLoGin fn parent(&self) -> Option<Weak<dyn KObject>> { 22706d5e247SLoGin self.inner.lock().parent.clone() 22806d5e247SLoGin } 22906d5e247SLoGin 23006d5e247SLoGin fn inode(&self) -> Option<Arc<KernFSInode>> { 23106d5e247SLoGin self.inner.lock().kernfs_inode.clone() 23206d5e247SLoGin } 23306d5e247SLoGin 23406d5e247SLoGin fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 23506d5e247SLoGin self.inner.lock().kernfs_inode = inode; 23606d5e247SLoGin } 23706d5e247SLoGin 23806d5e247SLoGin fn kobj_type(&self) -> Option<&'static dyn KObjType> { 239d7f5742aSLoGin self.inner.lock().ktype.clone() 24006d5e247SLoGin } 24106d5e247SLoGin 242d7f5742aSLoGin fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { 243d7f5742aSLoGin self.inner.lock().ktype = ktype; 244a03c4f9dSLoGin } 245a03c4f9dSLoGin 24606d5e247SLoGin fn kset(&self) -> Option<Arc<KSet>> { 247d7f5742aSLoGin self.inner.lock().kset.clone() 24806d5e247SLoGin } 24906d5e247SLoGin 25006d5e247SLoGin fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 25106d5e247SLoGin self.kobj_state.read() 25206d5e247SLoGin } 25306d5e247SLoGin 25406d5e247SLoGin fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 25506d5e247SLoGin self.kobj_state.write() 25606d5e247SLoGin } 25706d5e247SLoGin 25806d5e247SLoGin fn set_kobj_state(&self, state: KObjectState) { 25906d5e247SLoGin *self.kobj_state.write() = state; 26006d5e247SLoGin } 26106d5e247SLoGin 26206d5e247SLoGin fn name(&self) -> String { 26306d5e247SLoGin self.inner.lock().name.clone() 26406d5e247SLoGin } 26506d5e247SLoGin 26606d5e247SLoGin fn set_name(&self, name: String) { 26706d5e247SLoGin self.inner.lock().name = name; 26806d5e247SLoGin } 26906d5e247SLoGin 270d7f5742aSLoGin fn set_kset(&self, kset: Option<Arc<KSet>>) { 271d7f5742aSLoGin self.inner.lock().kset = kset; 27206d5e247SLoGin } 27306d5e247SLoGin 27406d5e247SLoGin fn set_parent(&self, parent: Option<Weak<dyn KObject>>) { 27506d5e247SLoGin self.inner.lock().parent = parent; 27606d5e247SLoGin } 27706d5e247SLoGin } 27806d5e247SLoGin 27906d5e247SLoGin /// @brief: 为Platform实现Device trait,platform总线也是一种设备,属于总线设备类型 28006d5e247SLoGin impl Device for PlatformBusDevice { 28106d5e247SLoGin #[inline] 28206d5e247SLoGin #[allow(dead_code)] 28306d5e247SLoGin fn dev_type(&self) -> DeviceType { 28406d5e247SLoGin return DeviceType::Bus; 28506d5e247SLoGin } 28606d5e247SLoGin 28706d5e247SLoGin #[inline] 28806d5e247SLoGin #[allow(dead_code)] 28906d5e247SLoGin fn id_table(&self) -> IdTable { 29006d5e247SLoGin IdTable::new("platform".to_string(), DeviceNumber::new(0)) 29106d5e247SLoGin } 29206d5e247SLoGin 29306d5e247SLoGin fn bus(&self) -> Option<Arc<dyn Bus>> { 29406d5e247SLoGin self.inner.lock().bus.clone() 29506d5e247SLoGin } 29606d5e247SLoGin 297a03c4f9dSLoGin fn set_bus(&self, bus: Option<Arc<dyn Bus>>) { 298a03c4f9dSLoGin self.inner.lock().bus = bus; 299a03c4f9dSLoGin } 300a03c4f9dSLoGin 30106d5e247SLoGin fn driver(&self) -> Option<Arc<dyn Driver>> { 302a03c4f9dSLoGin self.inner.lock().driver.clone()?.upgrade() 30306d5e247SLoGin } 30406d5e247SLoGin 30506d5e247SLoGin #[inline] 30606d5e247SLoGin fn is_dead(&self) -> bool { 30706d5e247SLoGin false 30806d5e247SLoGin } 30906d5e247SLoGin 310a03c4f9dSLoGin fn set_driver(&self, driver: Option<Weak<dyn Driver>>) { 31106d5e247SLoGin self.inner.lock().driver = driver; 31206d5e247SLoGin } 313a03c4f9dSLoGin 314a03c4f9dSLoGin fn can_match(&self) -> bool { 315a03c4f9dSLoGin todo!() 316a03c4f9dSLoGin } 317a03c4f9dSLoGin 318a03c4f9dSLoGin fn set_can_match(&self, _can_match: bool) { 319a03c4f9dSLoGin todo!() 320a03c4f9dSLoGin } 321a03c4f9dSLoGin 322a03c4f9dSLoGin fn state_synced(&self) -> bool { 323a03c4f9dSLoGin todo!() 324a03c4f9dSLoGin } 32506d5e247SLoGin } 326