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