1 use super::{ 2 driver::{Driver, DriverMatchName, DriverMatcher}, 3 sys_devices_kset, Device, DeviceMatchName, DeviceMatcher, DeviceState, 4 }; 5 use crate::{ 6 driver::base::{ 7 device::{device_manager, driver::driver_manager}, 8 kobject::{KObjType, KObject, KObjectManager}, 9 kset::KSet, 10 subsys::SubSysPrivate, 11 }, 12 filesystem::{ 13 sysfs::{ 14 file::sysfs_emit_str, sysfs_instance, Attribute, AttributeGroup, SysFSOps, 15 SysFSOpsSupport, SYSFS_ATTR_MODE_RW, SYSFS_ATTR_MODE_WO, 16 }, 17 vfs::syscall::ModeType, 18 }, 19 libs::rwlock::RwLock, 20 }; 21 use alloc::{ 22 string::{String, ToString}, 23 sync::{Arc, Weak}, 24 }; 25 use core::{ffi::CStr, fmt::Debug, intrinsics::unlikely}; 26 use hashbrown::HashMap; 27 use intertrait::cast::CastArc; 28 use log::{debug, error, info}; 29 use system_error::SystemError; 30 31 /// `/sys/bus`的kset 32 static mut BUS_KSET_INSTANCE: Option<Arc<KSet>> = None; 33 /// `/sys/devices/system`的kset 34 static mut DEVICES_SYSTEM_KSET_INSTANCE: Option<Arc<KSet>> = None; 35 36 static mut BUS_MANAGER_INSTANCE: Option<BusManager> = None; 37 38 #[inline(always)] 39 pub fn sys_bus_kset() -> Arc<KSet> { 40 unsafe { BUS_KSET_INSTANCE.clone().unwrap() } 41 } 42 43 #[inline(always)] 44 #[allow(dead_code)] 45 pub fn sys_devices_system_kset() -> Arc<KSet> { 46 unsafe { DEVICES_SYSTEM_KSET_INSTANCE.clone().unwrap() } 47 } 48 49 #[inline(always)] 50 pub fn bus_manager() -> &'static BusManager { 51 unsafe { BUS_MANAGER_INSTANCE.as_ref().unwrap() } 52 } 53 54 #[inline(always)] 55 pub fn subsystem_manager() -> &'static SubSystemManager { 56 &SubSystemManager 57 } 58 59 /// @brief: 总线状态 60 #[derive(Debug, Copy, Clone)] 61 pub enum BusState { 62 NotInitialized = 0, // 未初始化 63 Initialized = 1, // 已初始化 64 UnDefined = 2, // 未定义的 65 } 66 67 /// @brief: 将u32类型转换为总线状态类型 68 impl From<u32> for BusState { 69 fn from(state: u32) -> Self { 70 match state { 71 0 => BusState::NotInitialized, 72 1 => BusState::Initialized, 73 _ => BusState::UnDefined, 74 } 75 } 76 } 77 78 /// @brief: 将总线状态类型转换为u32类型 79 impl From<DeviceState> for BusState { 80 fn from(state: DeviceState) -> Self { 81 match state { 82 DeviceState::Initialized => BusState::Initialized, 83 DeviceState::NotInitialized => BusState::NotInitialized, 84 DeviceState::UnDefined => BusState::UnDefined, 85 } 86 } 87 } 88 89 /// @brief: 将总线状态类型转换为设备状态类型 90 impl From<BusState> for DeviceState { 91 fn from(state: BusState) -> Self { 92 match state { 93 BusState::Initialized => DeviceState::Initialized, 94 BusState::NotInitialized => DeviceState::NotInitialized, 95 BusState::UnDefined => DeviceState::UnDefined, 96 } 97 } 98 } 99 100 /// 总线子系统的trait,所有总线都应实现该trait 101 /// 102 /// 请注意,这个trait是用于实现总线子系统的,而不是总线驱动/总线设备。 103 /// https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/device/bus.h#84 104 pub trait Bus: Debug + Send + Sync { 105 fn name(&self) -> String; 106 /// Used for subsystems to enumerate devices like ("foo%u", dev->id). 107 fn dev_name(&self) -> String; 108 fn root_device(&self) -> Option<Weak<dyn Device>> { 109 None 110 } 111 112 fn set_root_device(&self, _dev: Option<Weak<dyn Device>>) {} 113 114 /// 总线上的设备的默认属性组 115 fn dev_groups(&self) -> &'static [&'static dyn AttributeGroup] { 116 &[] 117 } 118 119 /// 总线的默认属性组 120 fn bus_groups(&self) -> &'static [&'static dyn AttributeGroup] { 121 &[] 122 } 123 124 /// 总线上的驱动的默认属性组 125 fn drv_groups(&self) -> &'static [&'static dyn AttributeGroup] { 126 &[] 127 } 128 129 /// 检查设备是否可以被总线绑定,如果可以,就绑定它们。 130 /// 绑定之后,device的driver字段会被设置为驱动实例。 131 /// 132 /// ## 参数 133 /// 134 /// - `device` - 设备实例 135 /// 136 /// ## 默认实现 137 /// 138 /// 如果总线不支持该操作,返回`SystemError::ENOSYS` 139 fn probe(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> { 140 return Err(SystemError::ENOSYS); 141 } 142 fn remove(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError>; 143 fn sync_state(&self, _device: &Arc<dyn Device>) {} 144 fn shutdown(&self, _device: &Arc<dyn Device>); 145 fn suspend(&self, _device: &Arc<dyn Device>) { 146 // todo: implement suspend 147 } 148 149 fn resume(&self, device: &Arc<dyn Device>) -> Result<(), SystemError>; 150 151 /// match device to driver. 152 /// 153 /// ## 参数 154 /// 155 /// * `device` - device 156 /// * `driver` - driver 157 /// 158 /// ## 返回 159 /// 160 /// - `Ok(true)` - 匹配成功 161 /// - `Ok(false)` - 匹配失败 162 /// - `Err(_)` - 由于内部错误导致匹配失败 163 /// - `Err(SystemError::ENOSYS)` - 该总线不支持该操作 164 fn match_device( 165 &self, 166 _device: &Arc<dyn Device>, 167 _driver: &Arc<dyn Driver>, 168 ) -> Result<bool, SystemError> { 169 return Err(SystemError::ENOSYS); 170 } 171 172 fn subsystem(&self) -> &SubSysPrivate; 173 174 /// 对当前总线操作的时候需要获取父级总线的锁 175 fn need_parent_lock(&self) -> bool { 176 false 177 } 178 } 179 180 impl dyn Bus { 181 /// 在bus上,根据条件寻找一个特定的设备 182 /// 183 /// ## 参数 184 /// 185 /// - `matcher` - 匹配器 186 /// - `data` - 传给匹配器的数据 187 pub fn find_device<T: Copy>( 188 &self, 189 matcher: &dyn DeviceMatcher<T>, 190 data: T, 191 ) -> Option<Arc<dyn Device>> { 192 let subsys = self.subsystem(); 193 let guard = subsys.devices(); 194 for dev in guard.iter() { 195 if matcher.match_device(dev, data) { 196 return Some(dev.clone()); 197 } 198 } 199 return None; 200 } 201 202 /// 根据名称匹配设备 203 /// 204 /// ## 参数 205 /// 206 /// - name 设备名称 207 pub fn find_device_by_name(&self, name: &str) -> Option<Arc<dyn Device>> { 208 return self.find_device(&DeviceMatchName, name); 209 } 210 211 /// 在bus上,根据条件寻找一个特定的驱动 212 /// 213 /// ## 参数 214 /// 215 /// - `matcher` - 匹配器 216 /// - `data` - 传给匹配器的数据 217 pub fn find_driver<T: Copy>( 218 &self, 219 matcher: &dyn DriverMatcher<T>, 220 data: T, 221 ) -> Option<Arc<dyn Driver>> { 222 let subsys = self.subsystem(); 223 let guard = subsys.drivers(); 224 for drv in guard.iter() { 225 if matcher.match_driver(drv, data) { 226 return Some(drv.clone()); 227 } 228 } 229 return None; 230 } 231 232 /// 根据名称在bus上匹配驱动 233 pub fn find_driver_by_name(&self, name: &str) -> Option<Arc<dyn Driver>> { 234 return self.find_driver(&DriverMatchName, name); 235 } 236 } 237 238 /// @brief: 总线管理结构体 239 #[derive(Debug)] 240 pub struct BusManager { 241 /// 存储总线bus的kset结构体与bus实例的映射(用于在sysfs callback的时候,根据kset找到bus实例) 242 kset_bus_map: RwLock<HashMap<Arc<KSet>, Arc<dyn Bus>>>, 243 } 244 245 impl BusManager { 246 pub fn new() -> Self { 247 return Self { 248 kset_bus_map: RwLock::new(HashMap::new()), 249 }; 250 } 251 252 /// 把一个设备添加到总线上 253 /// 254 /// ## 描述 255 /// 256 /// - 添加一个设备的与bus相关的属性 257 /// - 在bus和设备文件夹下,创建软链接 258 /// - 把设备添加到它的总线的设备列表中 259 /// 260 /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_add_device#441 261 /// 262 /// ## 参数 263 /// 264 /// - `dev` - 要被添加的设备 265 pub fn add_device(&self, dev: &Arc<dyn Device>) -> Result<(), SystemError> { 266 let bus = dev.bus().and_then(|bus| bus.upgrade()); 267 if let Some(bus) = bus { 268 device_manager().add_groups(dev, bus.dev_groups())?; 269 270 // 增加符号链接 271 let bus_devices_kset = bus 272 .subsystem() 273 .devices_kset() 274 .expect("bus devices kset is none, maybe bus is not registered"); 275 let dev_kobj = dev.clone() as Arc<dyn KObject>; 276 277 sysfs_instance().create_link( 278 Some(&bus_devices_kset.as_kobject()), 279 &dev_kobj, 280 dev.name(), 281 )?; 282 sysfs_instance().create_link( 283 Some(&dev_kobj), 284 &bus.subsystem().subsys().as_kobject(), 285 "subsystem".to_string(), 286 )?; 287 bus.subsystem().add_device_to_vec(dev)?; 288 } 289 return Ok(()); 290 } 291 292 /// 在总线上添加一个驱动 293 /// 294 /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_add_driver#590 295 pub fn add_driver(&self, driver: &Arc<dyn Driver>) -> Result<(), SystemError> { 296 let bus = driver 297 .bus() 298 .and_then(|bus| bus.upgrade()) 299 .ok_or(SystemError::EINVAL)?; 300 debug!("bus '{}' add driver '{}'", bus.name(), driver.name()); 301 302 driver.set_kobj_type(Some(&BusDriverKType)); 303 let kobj = driver.clone() as Arc<dyn KObject>; 304 KObjectManager::add_kobj(kobj, bus.subsystem().drivers_kset())?; 305 306 bus.subsystem().add_driver_to_vec(driver)?; 307 if bus.subsystem().drivers_autoprobe() { 308 let r = driver_manager().driver_attach(driver); 309 if let Err(e) = r { 310 bus.subsystem().remove_driver_from_vec(driver); 311 return Err(e); 312 } 313 } 314 315 driver_manager() 316 .add_groups(driver, bus.drv_groups()) 317 .map_err(|e| { 318 error!( 319 "BusManager::add_driver: driver '{:?}' add_groups failed, err: '{:?}", 320 driver.name(), 321 e 322 ); 323 e 324 }) 325 .ok(); 326 327 if !driver.suppress_bind_attrs() { 328 self.add_bind_files(driver) 329 .map_err(|e| { 330 error!( 331 "BusManager::add_driver: driver '{:?}' add_bind_files failed, err: '{:?}", 332 driver.name(), 333 e 334 ); 335 e 336 }) 337 .ok(); 338 } 339 340 return Ok(()); 341 } 342 343 /// 344 /// bus_register - register a driver-core subsystem 345 /// 346 /// ## 参数 347 /// - `bus` - bus to register 348 /// 349 /// Once we have that, we register the bus with the kobject 350 /// infrastructure, then register the children subsystems it has: 351 /// the devices and drivers that belong to the subsystem. 352 /// 353 /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_register#783 354 /// 355 /// todo: 增加错误处理逻辑 356 pub fn register(&self, bus: Arc<dyn Bus>) -> Result<(), SystemError> { 357 bus.subsystem().set_bus(Some(Arc::downgrade(&bus))); 358 359 let subsys_kset = bus.subsystem().subsys(); 360 subsys_kset.set_name(bus.name()); 361 bus.subsystem().set_drivers_autoprobe(true); 362 363 subsys_kset.register(Some(sys_bus_kset()))?; 364 365 let devices_kset = 366 KSet::new_and_add("devices".to_string(), None, Some(subsys_kset.clone()))?; 367 bus.subsystem().set_devices_kset(devices_kset); 368 let drivers_kset = 369 KSet::new_and_add("drivers".to_string(), None, Some(subsys_kset.clone()))?; 370 bus.subsystem().set_drivers_kset(drivers_kset); 371 372 self.add_probe_files(&bus)?; 373 let bus_groups = bus.bus_groups(); 374 self.add_groups(&bus, bus_groups)?; 375 // 把bus实例添加到总线管理器中(方便在sysfs callback的时候,根据kset找到bus实例) 376 self.kset_bus_map.write().insert(subsys_kset, bus.clone()); 377 return Ok(()); 378 } 379 380 pub fn unregister(&self, _bus: Arc<dyn Bus>) -> Result<(), SystemError> { 381 todo!("bus_unregister") 382 } 383 384 fn add_probe_files(&self, bus: &Arc<dyn Bus>) -> Result<(), SystemError> { 385 self.create_file(bus, &BusAttrDriversProbe)?; 386 let r = self.create_file(bus, &BusAttrDriversAutoprobe); 387 388 if r.is_err() { 389 self.remove_file(bus, &BusAttrDriversProbe); 390 } 391 return r; 392 } 393 394 #[allow(dead_code)] 395 fn remove_probe_files(&self, bus: &Arc<dyn Bus>) { 396 self.remove_file(bus, &BusAttrDriversAutoprobe); 397 self.remove_file(bus, &BusAttrDriversProbe); 398 } 399 400 fn create_file( 401 &self, 402 bus: &Arc<dyn Bus>, 403 attr: &'static dyn Attribute, 404 ) -> Result<(), SystemError> { 405 let bus_kobj = bus.subsystem().subsys() as Arc<dyn KObject>; 406 return sysfs_instance().create_file(&bus_kobj, attr); 407 } 408 409 fn remove_file(&self, bus: &Arc<dyn Bus>, attr: &'static dyn Attribute) { 410 let bus_kobj = bus.subsystem().subsys() as Arc<dyn KObject>; 411 sysfs_instance().remove_file(&bus_kobj, attr); 412 } 413 414 #[inline] 415 fn add_groups( 416 &self, 417 bus: &Arc<dyn Bus>, 418 groups: &[&'static dyn AttributeGroup], 419 ) -> Result<(), SystemError> { 420 let bus_kobj = bus.subsystem().subsys() as Arc<dyn KObject>; 421 return sysfs_instance().create_groups(&bus_kobj, groups); 422 } 423 424 /// 根据bus的kset找到bus实例 425 fn get_bus_by_kset(&self, kset: &Arc<KSet>) -> Option<Arc<dyn Bus>> { 426 return self.kset_bus_map.read().get(kset).cloned(); 427 } 428 429 /// 为bus上的设备选择可能的驱动程序 430 /// 431 /// 这个函数会扫描总线上的所有没有驱动的设备,然后为它们选择可能的驱动程序。 432 /// 433 /// ## 参数 434 /// 435 /// - `bus` - bus实例 436 #[allow(dead_code)] 437 pub fn rescan_devices(&self, bus: &Arc<dyn Bus>) -> Result<(), SystemError> { 438 for dev in bus.subsystem().devices().iter() { 439 rescan_devices_helper(dev)?; 440 } 441 return Ok(()); 442 } 443 444 /// 为新设备探测驱动 445 /// 446 /// Automatically probe for a driver if the bus allows it. 447 pub fn probe_device(&self, dev: &Arc<dyn Device>) { 448 let bus = dev.bus().and_then(|bus| bus.upgrade()); 449 if bus.is_none() { 450 return; 451 } 452 let bus = bus.unwrap(); 453 if bus.subsystem().drivers_autoprobe() { 454 device_manager().device_initial_probe(dev).ok(); 455 } 456 for interface in bus.subsystem().interfaces() { 457 interface.add_device(dev).ok(); 458 } 459 } 460 461 /// 从总线上移除一个驱动 462 /// 463 /// Detach the driver from the devices it controls, and remove 464 /// it from its bus's list of drivers. Finally, we drop the reference 465 /// to the bus. 466 /// 467 /// ## 参数 468 /// 469 /// - `driver` - 驱动实例 470 /// 471 /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_remove_driver#666 472 pub fn remove_driver(&self, _driver: &Arc<dyn Driver>) { 473 todo!("BusManager::remove_driver") 474 } 475 476 fn add_bind_files(&self, driver: &Arc<dyn Driver>) -> Result<(), SystemError> { 477 driver_manager().create_attr_file(driver, &DriverAttrUnbind)?; 478 479 driver_manager() 480 .create_attr_file(driver, &DriverAttrBind) 481 .inspect_err(|_e| { 482 driver_manager().remove_attr_file(driver, &DriverAttrUnbind); 483 })?; 484 485 return Ok(()); 486 } 487 } 488 489 /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?r=&mo=5649&fi=241#684 490 fn rescan_devices_helper(dev: &Arc<dyn Device>) -> Result<(), SystemError> { 491 if dev.driver().is_none() { 492 let need_parent_lock = dev 493 .bus() 494 .map(|bus| bus.upgrade().unwrap().need_parent_lock()) 495 .unwrap_or(false); 496 if unlikely(need_parent_lock) { 497 // todo: lock device parent 498 unimplemented!() 499 } 500 device_manager().device_attach(dev)?; 501 } 502 return Ok(()); 503 } 504 505 /// 506 /// bus_register - register a driver-core subsystem 507 /// 508 /// ## 参数 509 /// - `bus` - bus to register 510 /// 511 /// Once we have that, we register the bus with the kobject 512 /// infrastructure, then register the children subsystems it has: 513 /// the devices and drivers that belong to the subsystem. 514 pub fn bus_register(bus: Arc<dyn Bus>) -> Result<(), SystemError> { 515 return bus_manager().register(bus); 516 } 517 518 /// @brief: 总线注销,并在sys/bus和sys/devices下删除文件夹 519 /// @parameter bus: Bus设备实体 520 /// @return: 成功:() 失败:SystemError 521 #[allow(dead_code)] 522 pub fn bus_unregister(bus: Arc<dyn Bus>) -> Result<(), SystemError> { 523 return bus_manager().unregister(bus); 524 } 525 526 pub fn buses_init() -> Result<(), SystemError> { 527 let bus_kset = KSet::new("bus".to_string()); 528 bus_kset.register(None).expect("bus kset register failed"); 529 unsafe { 530 BUS_KSET_INSTANCE = Some(bus_kset); 531 } 532 533 // 初始化 /sys/devices/system 534 { 535 let devices_system_kset = KSet::new("system".to_string()); 536 let parent = sys_devices_kset() as Arc<dyn KObject>; 537 devices_system_kset.set_parent(Some(Arc::downgrade(&parent))); 538 devices_system_kset 539 .register(Some(sys_devices_kset())) 540 .expect("devices system kset register failed"); 541 unsafe { 542 DEVICES_SYSTEM_KSET_INSTANCE = Some(devices_system_kset); 543 } 544 } 545 546 // 初始化总线管理器 547 { 548 let bus_manager = BusManager::new(); 549 unsafe { 550 BUS_MANAGER_INSTANCE = Some(bus_manager); 551 } 552 } 553 return Ok(()); 554 } 555 556 /// 把一个设备添加到总线上 557 /// 558 /// ## 描述 559 /// 560 /// - 添加一个设备的与bus相关的属性 561 /// - 在bus和设备文件夹下,创建软链接 562 /// - 把设备添加到它的总线的设备列表中 563 /// 564 /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_add_device#441 565 /// 566 /// ## 参数 567 /// 568 /// - `dev` - 要被添加的设备 569 pub fn bus_add_device(dev: &Arc<dyn Device>) -> Result<(), SystemError> { 570 return bus_manager().add_device(dev); 571 } 572 573 /// 自动为设备在总线上寻找可用的驱动程序 574 /// 575 /// Automatically probe for a driver if the bus allows it. 576 /// 577 /// ## 参数 578 /// 579 /// - `dev` - 要被添加的设备 580 /// 581 /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=bus_probe_device#478 582 pub fn bus_probe_device(dev: &Arc<dyn Device>) { 583 info!("bus_probe_device: dev: {:?}", dev.name()); 584 bus_manager().probe_device(dev); 585 } 586 587 #[derive(Debug)] 588 struct BusAttrDriversProbe; 589 590 impl Attribute for BusAttrDriversProbe { 591 fn mode(&self) -> ModeType { 592 return ModeType::S_IWUSR; 593 } 594 595 fn name(&self) -> &str { 596 return "drivers_probe"; 597 } 598 599 fn support(&self) -> SysFSOpsSupport { 600 return SysFSOpsSupport::ATTR_STORE; 601 } 602 603 /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?r=&mo=5649&fi=241#241 604 fn store(&self, kobj: Arc<dyn KObject>, buf: &[u8]) -> Result<usize, SystemError> { 605 let kset: Arc<KSet> = kobj.arc_any().downcast().map_err(|_| SystemError::EINVAL)?; 606 let bus = bus_manager() 607 .get_bus_by_kset(&kset) 608 .ok_or(SystemError::EINVAL)?; 609 610 let name = CStr::from_bytes_with_nul(buf) 611 .map_err(|_| SystemError::EINVAL)? 612 .to_str() 613 .map_err(|_| SystemError::EINVAL)?; 614 615 let device = bus.find_device_by_name(name).ok_or(SystemError::ENODEV)?; 616 617 if rescan_devices_helper(&device).is_ok() { 618 return Ok(buf.len()); 619 } 620 621 return Err(SystemError::EINVAL); 622 } 623 } 624 625 #[derive(Debug)] 626 struct BusAttrDriversAutoprobe; 627 628 impl Attribute for BusAttrDriversAutoprobe { 629 fn mode(&self) -> ModeType { 630 SYSFS_ATTR_MODE_RW 631 } 632 633 fn name(&self) -> &str { 634 return "drivers_autoprobe"; 635 } 636 637 fn support(&self) -> SysFSOpsSupport { 638 return SysFSOpsSupport::ATTR_STORE | SysFSOpsSupport::ATTR_SHOW; 639 } 640 641 /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?r=&mo=5649&fi=241#231 642 fn store(&self, kobj: Arc<dyn KObject>, buf: &[u8]) -> Result<usize, SystemError> { 643 if buf.is_empty() { 644 return Ok(0); 645 } 646 647 let kset: Arc<KSet> = kobj.arc_any().downcast().map_err(|_| SystemError::EINVAL)?; 648 let bus = bus_manager() 649 .get_bus_by_kset(&kset) 650 .ok_or(SystemError::EINVAL)?; 651 652 if buf[0] == b'0' { 653 bus.subsystem().set_drivers_autoprobe(false); 654 } else { 655 bus.subsystem().set_drivers_autoprobe(true); 656 } 657 658 return Ok(buf.len()); 659 } 660 661 /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?r=&mo=5649&fi=241#226 662 fn show(&self, kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError> { 663 let kset: Arc<KSet> = kobj.arc_any().downcast().map_err(|_| SystemError::EINVAL)?; 664 let bus = bus_manager() 665 .get_bus_by_kset(&kset) 666 .ok_or(SystemError::EINVAL)?; 667 let val = if bus.subsystem().drivers_autoprobe() { 668 1 669 } else { 670 0 671 }; 672 return sysfs_emit_str(buf, format!("{val}\n").as_str()); 673 } 674 } 675 676 #[allow(dead_code)] 677 #[derive(Debug, Clone, Copy)] 678 pub enum BusNotifyEvent { 679 /// 一个设备被添加到总线上 680 AddDevice, 681 /// 一个设备将要被移除 682 DelDevice, 683 /// 一个设备已经被移除 684 RemovedDevice, 685 /// 一个驱动将要被绑定 686 BindDriver, 687 /// 一个驱动已经被绑定 688 BoundDriver, 689 /// 一个驱动将要被解绑 690 UnbindDriver, 691 /// 一个驱动已经被解绑 692 UnboundDriver, 693 /// 驱动绑定失败 694 DriverNotBound, 695 } 696 697 #[derive(Debug)] 698 struct BusDriverKType; 699 700 impl KObjType for BusDriverKType { 701 fn sysfs_ops(&self) -> Option<&dyn SysFSOps> { 702 Some(&BusDriverSysFSOps) 703 } 704 705 fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> { 706 None 707 } 708 } 709 710 #[derive(Debug)] 711 struct BusDriverSysFSOps; 712 713 impl SysFSOps for BusDriverSysFSOps { 714 #[inline] 715 fn show( 716 &self, 717 kobj: Arc<dyn KObject>, 718 attr: &dyn Attribute, 719 buf: &mut [u8], 720 ) -> Result<usize, SystemError> { 721 attr.show(kobj, buf) 722 } 723 724 #[inline] 725 fn store( 726 &self, 727 kobj: Arc<dyn KObject>, 728 attr: &dyn Attribute, 729 buf: &[u8], 730 ) -> Result<usize, SystemError> { 731 attr.store(kobj, buf) 732 } 733 } 734 735 #[derive(Debug)] 736 struct DriverAttrUnbind; 737 738 impl Attribute for DriverAttrUnbind { 739 fn mode(&self) -> ModeType { 740 SYSFS_ATTR_MODE_WO 741 } 742 743 fn name(&self) -> &str { 744 "unbind" 745 } 746 747 fn store(&self, kobj: Arc<dyn KObject>, buf: &[u8]) -> Result<usize, SystemError> { 748 let driver = kobj.cast::<dyn Driver>().map_err(|kobj| { 749 error!( 750 "Intertrait casting not implemented for kobj: {}", 751 kobj.name() 752 ); 753 SystemError::ENOSYS 754 })?; 755 756 let bus = driver 757 .bus() 758 .and_then(|bus| bus.upgrade()) 759 .ok_or(SystemError::ENODEV)?; 760 761 let s = CStr::from_bytes_with_nul(buf) 762 .map_err(|_| SystemError::EINVAL)? 763 .to_str() 764 .map_err(|_| SystemError::EINVAL)?; 765 let dev = bus.find_device_by_name(s).ok_or(SystemError::ENODEV)?; 766 let p = dev.driver().ok_or(SystemError::ENODEV)?; 767 if Arc::ptr_eq(&p, &driver) { 768 device_manager().device_driver_detach(&dev); 769 return Ok(buf.len()); 770 } 771 return Err(SystemError::ENODEV); 772 } 773 774 fn support(&self) -> SysFSOpsSupport { 775 SysFSOpsSupport::ATTR_STORE 776 } 777 } 778 779 #[derive(Debug)] 780 struct DriverAttrBind; 781 782 impl Attribute for DriverAttrBind { 783 fn name(&self) -> &str { 784 "bind" 785 } 786 787 fn mode(&self) -> ModeType { 788 SYSFS_ATTR_MODE_WO 789 } 790 791 /* 792 * Manually attach a device to a driver. 793 * Note: the driver must want to bind to the device, 794 * it is not possible to override the driver's id table. 795 */ 796 fn store(&self, kobj: Arc<dyn KObject>, buf: &[u8]) -> Result<usize, SystemError> { 797 let driver = kobj.cast::<dyn Driver>().map_err(|kobj| { 798 error!( 799 "Intertrait casting not implemented for kobj: {}", 800 kobj.name() 801 ); 802 SystemError::ENOSYS 803 })?; 804 805 let bus = driver 806 .bus() 807 .and_then(|bus| bus.upgrade()) 808 .ok_or(SystemError::ENODEV)?; 809 let device = bus 810 .find_device_by_name( 811 CStr::from_bytes_with_nul(buf) 812 .map_err(|_| SystemError::EINVAL)? 813 .to_str() 814 .map_err(|_| SystemError::EINVAL)?, 815 ) 816 .ok_or(SystemError::ENODEV)?; 817 818 if driver_manager().match_device(&driver, &device)? { 819 device_manager().device_driver_attach(&driver, &device)?; 820 return Ok(buf.len()); 821 } 822 return Err(SystemError::ENODEV); 823 } 824 fn support(&self) -> SysFSOpsSupport { 825 SysFSOpsSupport::ATTR_STORE 826 } 827 } 828 829 #[derive(Debug)] 830 pub struct SubSystemManager; 831 832 impl SubSystemManager { 833 /// 注册一个子系统,并在`/sys/bus`和指定的父级文件夹下创建子文件夹 834 /// 835 /// ## 参数 836 /// 837 /// - `subsys` - 子系统实例 838 /// - `fake_root_dev` - 该子系统的伪根设备 839 /// - `parent_of_root` - 该子系统的伪根设备的父级节点 840 /// 841 /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/bus.c?fi=subsys_system_register#1078 842 pub fn subsys_register( 843 &self, 844 subsys: &Arc<dyn Bus>, 845 fake_root_dev: &Arc<dyn Device>, 846 parent_of_root: &Arc<dyn KObject>, 847 ) -> Result<(), SystemError> { 848 bus_manager().register(subsys.clone())?; 849 fake_root_dev.set_name(subsys.name()); 850 fake_root_dev.set_parent(Some(Arc::downgrade(parent_of_root))); 851 852 device_manager().register(fake_root_dev.clone())?; 853 854 subsys.set_root_device(Some(Arc::downgrade(fake_root_dev))); 855 return Ok(()); 856 } 857 858 /// register a subsystem at /sys/devices/system/ 859 /// 并且在/sys/bus和/sys/devices下创建文件夹 860 /// 861 /// All 'system' subsystems have a /sys/devices/system/<name> root device 862 /// with the name of the subsystem. The root device can carry subsystem- 863 /// wide attributes. All registered devices are below this single root 864 /// device and are named after the subsystem with a simple enumeration 865 /// number appended. The registered devices are not explicitly named; 866 /// only 'id' in the device needs to be set. 867 pub fn subsys_system_register( 868 &self, 869 subsys: &Arc<dyn Bus>, 870 fake_root_dev: &Arc<dyn Device>, 871 ) -> Result<(), SystemError> { 872 return self.subsys_register( 873 subsys, 874 fake_root_dev, 875 &(sys_devices_system_kset() as Arc<dyn KObject>), 876 ); 877 } 878 } 879