dd.rs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  1. use core::intrinsics::unlikely;
  2. use alloc::{string::ToString, sync::Arc};
  3. use intertrait::cast::CastArc;
  4. use crate::{
  5. driver::base::kobject::KObject,
  6. filesystem::{
  7. sysfs::{
  8. file::sysfs_emit_str, sysfs_instance, Attribute, SysFSOpsSupport, SYSFS_ATTR_MODE_WO,
  9. },
  10. vfs::syscall::ModeType,
  11. },
  12. libs::wait_queue::WaitQueue,
  13. };
  14. use system_error::SystemError;
  15. use super::{
  16. bus::BusNotifyEvent,
  17. device_manager,
  18. driver::{driver_manager, Driver, DriverManager},
  19. Device, DeviceManager,
  20. };
  21. static PROBE_WAIT_QUEUE: WaitQueue = WaitQueue::INIT;
  22. impl DeviceManager {
  23. /// 尝试把一个设备与一个驱动匹配
  24. ///
  25. /// 当前函数会遍历整个bus的驱动列表,并且尝试把设备与每一个驱动进行匹配。
  26. /// 一旦有一个驱动匹配成功,就会返回。
  27. ///
  28. /// ## 参数
  29. ///
  30. /// - `dev`: 设备
  31. ///
  32. /// ## 返回
  33. ///
  34. /// - Ok(true): 匹配成功
  35. /// - Ok(false): 没有匹配成功
  36. /// - Err(SystemError::ENODEV): 设备还没被注册
  37. ///
  38. /// ## 参考
  39. ///
  40. /// https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c#1049
  41. pub fn device_attach(&self, dev: &Arc<dyn Device>) -> Result<bool, SystemError> {
  42. return self.do_device_attach(dev, false);
  43. }
  44. pub fn device_initial_probe(&self, dev: &Arc<dyn Device>) -> Result<bool, SystemError> {
  45. return self.do_device_attach(dev, true);
  46. }
  47. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c#978
  48. fn do_device_attach(
  49. &self,
  50. dev: &Arc<dyn Device>,
  51. allow_async: bool,
  52. ) -> Result<bool, SystemError> {
  53. if unlikely(allow_async) {
  54. // todo!("do_device_attach: allow_async")
  55. kwarn!("do_device_attach: allow_async is true, but currently not supported");
  56. }
  57. if dev.is_dead() {
  58. return Ok(false);
  59. }
  60. kwarn!("do_device_attach: dev: '{}'", dev.name());
  61. let mut do_async = false;
  62. let mut r = Ok(false);
  63. if dev.driver().is_some() {
  64. if self.device_is_bound(dev) {
  65. return Ok(true);
  66. }
  67. if self.device_bind_driver(dev).is_ok() {
  68. return Ok(true);
  69. } else {
  70. dev.set_driver(None);
  71. return Ok(false);
  72. }
  73. } else {
  74. let bus = dev
  75. .bus()
  76. .map(|bus| bus.upgrade())
  77. .flatten()
  78. .ok_or(SystemError::EINVAL)?;
  79. let mut data = DeviceAttachData::new(dev.clone(), allow_async, false);
  80. let mut flag = false;
  81. for driver in bus.subsystem().drivers().iter() {
  82. let r = self.do_device_attach_driver(&driver, &mut data);
  83. if unlikely(r.is_err()) {
  84. flag = false;
  85. break;
  86. } else {
  87. if r.unwrap() == true {
  88. flag = true;
  89. break;
  90. }
  91. }
  92. }
  93. if flag {
  94. r = Ok(true);
  95. }
  96. if !flag && allow_async && data.have_async {
  97. // If we could not find appropriate driver
  98. // synchronously and we are allowed to do
  99. // async probes and there are drivers that
  100. // want to probe asynchronously, we'll
  101. // try them.
  102. do_async = true;
  103. kdebug!(
  104. "do_device_attach: try scheduling asynchronous probe for device: {}",
  105. dev.name()
  106. );
  107. }
  108. }
  109. if do_async {
  110. todo!("do_device_attach: do_async")
  111. }
  112. return r;
  113. }
  114. /// 匹配设备和驱动
  115. ///
  116. /// ## 参数
  117. ///
  118. /// - `driver`: 驱动
  119. /// - `data`: 匹配数据
  120. ///
  121. /// ## 返回
  122. ///
  123. /// - Ok(true): 匹配成功
  124. /// - Ok(false): 没有匹配成功
  125. /// - Err(SystemError): 匹配过程中出现意外错误,没有匹配成功
  126. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c#899
  127. fn do_device_attach_driver(
  128. &self,
  129. driver: &Arc<dyn Driver>,
  130. data: &mut DeviceAttachData,
  131. ) -> Result<bool, SystemError> {
  132. if let Some(bus) = driver.bus().map(|bus| bus.upgrade()).flatten() {
  133. let r = bus.match_device(&data.dev, driver);
  134. if let Err(e) = r {
  135. // 如果不是ENOSYS,则总线出错
  136. if e != SystemError::ENOSYS {
  137. kdebug!(
  138. "do_device_attach_driver: bus.match_device() failed, dev: '{}', err: {:?}",
  139. data.dev.name(),
  140. e
  141. );
  142. return Err(e);
  143. }
  144. } else {
  145. if r.unwrap() == false {
  146. return Ok(false);
  147. }
  148. }
  149. }
  150. let async_allowed = driver.allows_async_probing();
  151. if data.check_async && async_allowed != data.want_async {
  152. return Ok(false);
  153. }
  154. return driver_manager()
  155. .probe_device(driver, &data.dev)
  156. .map(|_| true);
  157. }
  158. /// 检查设备是否绑定到驱动程序
  159. ///
  160. /// ## 参数
  161. ///
  162. /// - `dev`: 设备
  163. ///
  164. /// ## 返回
  165. ///
  166. /// 如果传递的设备已成功完成对驱动程序的探测,则返回true,否则返回false。
  167. pub fn device_is_bound(&self, dev: &Arc<dyn Device>) -> bool {
  168. if dev.driver().is_some() {
  169. return true;
  170. } else {
  171. return false;
  172. }
  173. }
  174. /// 把一个驱动绑定到设备上
  175. ///
  176. /// 允许手动绑定驱动到设备上。调用者需要设置好dev.driver(),保证其不为None
  177. ///
  178. /// ## 参数
  179. ///
  180. /// - `dev`: 设备
  181. ///
  182. /// ## 建议
  183. ///
  184. /// 使用device_manager().driver_attach()会更好
  185. ///
  186. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c#496
  187. pub fn device_bind_driver(&self, dev: &Arc<dyn Device>) -> Result<(), SystemError> {
  188. let r = driver_manager().driver_sysfs_add(dev);
  189. if let Err(e) = r {
  190. self.device_links_force_bind(dev);
  191. driver_manager().driver_bound(dev);
  192. return Err(e);
  193. } else {
  194. if let Some(bus) = dev.bus().map(|bus| bus.upgrade()).flatten() {
  195. bus.subsystem().bus_notifier().call_chain(
  196. BusNotifyEvent::DriverNotBound,
  197. Some(dev),
  198. None,
  199. );
  200. }
  201. }
  202. return r;
  203. }
  204. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?fi=driver_attach#528
  205. fn unbind_cleanup(&self, dev: &Arc<dyn Device>) {
  206. dev.set_driver(None);
  207. // todo: 添加更多操作,清理数据
  208. }
  209. }
  210. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c#866
  211. #[derive(Debug)]
  212. #[allow(dead_code)]
  213. struct DeviceAttachData {
  214. dev: Arc<dyn Device>,
  215. /// Indicates whether we are considering asynchronous probing or
  216. /// not. Only initial binding after device or driver registration
  217. /// (including deferral processing) may be done asynchronously, the
  218. /// rest is always synchronous, as we expect it is being done by
  219. /// request from userspace.
  220. check_async: bool,
  221. /// Indicates if we are binding synchronous or asynchronous drivers.
  222. /// When asynchronous probing is enabled we'll execute 2 passes
  223. /// over drivers: first pass doing synchronous probing and second
  224. /// doing asynchronous probing (if synchronous did not succeed -
  225. /// most likely because there was no driver requiring synchronous
  226. /// probing - and we found asynchronous driver during first pass).
  227. /// The 2 passes are done because we can't shoot asynchronous
  228. /// probe for given device and driver from bus_for_each_drv() since
  229. /// driver pointer is not guaranteed to stay valid once
  230. /// bus_for_each_drv() iterates to the next driver on the bus.
  231. want_async: bool,
  232. /// We'll set have_async to 'true' if, while scanning for matching
  233. /// driver, we'll encounter one that requests asynchronous probing.
  234. have_async: bool,
  235. }
  236. impl DeviceAttachData {
  237. pub fn new(dev: Arc<dyn Device>, check_async: bool, want_async: bool) -> Self {
  238. Self {
  239. dev,
  240. check_async,
  241. want_async,
  242. have_async: false,
  243. }
  244. }
  245. #[allow(dead_code)]
  246. #[inline(always)]
  247. fn set_have_async(&mut self) {
  248. self.have_async = true;
  249. }
  250. }
  251. impl DriverManager {
  252. /// 尝试把驱动绑定到现有的设备上
  253. ///
  254. /// 这个函数会遍历驱动现有的全部设备,然后尝试把他们匹配。
  255. /// 一旦有一个设备匹配成功,就会返回,并且设备的driver字段会被设置。
  256. pub fn driver_attach(&self, driver: &Arc<dyn Driver>) -> Result<(), SystemError> {
  257. let bus = driver
  258. .bus()
  259. .map(|bus| bus.upgrade())
  260. .flatten()
  261. .ok_or(SystemError::EINVAL)?;
  262. for dev in bus.subsystem().devices().iter() {
  263. if self.do_driver_attach(&dev, &driver) {
  264. // 匹配成功
  265. return Ok(());
  266. }
  267. }
  268. return Ok(());
  269. }
  270. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?fi=driver_attach#1134
  271. fn do_driver_attach(&self, device: &Arc<dyn Device>, driver: &Arc<dyn Driver>) -> bool {
  272. let r = self.match_device(driver, device).unwrap_or(false);
  273. if r == false {
  274. // 不匹配
  275. return false;
  276. }
  277. if driver.allows_async_probing() {
  278. unimplemented!(
  279. "do_driver_attach: probe driver '{}' asynchronously",
  280. driver.name()
  281. );
  282. }
  283. if self.probe_device(driver, device).is_err() {
  284. return false;
  285. }
  286. return true;
  287. }
  288. #[inline(always)]
  289. pub fn match_device(
  290. &self,
  291. driver: &Arc<dyn Driver>,
  292. device: &Arc<dyn Device>,
  293. ) -> Result<bool, SystemError> {
  294. return driver
  295. .bus()
  296. .map(|bus| bus.upgrade())
  297. .flatten()
  298. .unwrap()
  299. .match_device(device, driver);
  300. }
  301. /// 尝试把设备和驱动绑定在一起
  302. ///
  303. ///
  304. /// ## 返回
  305. ///
  306. /// - Ok(): 绑定成功
  307. /// - Err(ENODEV): 设备未注册
  308. /// - Err(EBUSY): 设备已经绑定到驱动上
  309. ///
  310. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?fi=driver_attach#802
  311. fn probe_device(
  312. &self,
  313. driver: &Arc<dyn Driver>,
  314. device: &Arc<dyn Device>,
  315. ) -> Result<(), SystemError> {
  316. let r = self.do_probe_device(driver, device);
  317. PROBE_WAIT_QUEUE.wakeup_all(None);
  318. return r;
  319. }
  320. fn do_probe_device(
  321. &self,
  322. driver: &Arc<dyn Driver>,
  323. device: &Arc<dyn Device>,
  324. ) -> Result<(), SystemError> {
  325. if device.is_dead() || (!device.is_registered()) {
  326. return Err(SystemError::ENODEV);
  327. }
  328. if device.driver().is_some() {
  329. return Err(SystemError::EBUSY);
  330. }
  331. device.set_can_match(true);
  332. self.really_probe(driver, device)?;
  333. return Ok(());
  334. }
  335. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?fi=driver_attach#584
  336. fn really_probe(
  337. &self,
  338. driver: &Arc<dyn Driver>,
  339. device: &Arc<dyn Device>,
  340. ) -> Result<(), SystemError> {
  341. let bind_failed = || {
  342. device_manager().unbind_cleanup(device);
  343. };
  344. let sysfs_failed = || {
  345. if let Some(bus) = device.bus().map(|bus| bus.upgrade()).flatten() {
  346. bus.subsystem().bus_notifier().call_chain(
  347. BusNotifyEvent::DriverNotBound,
  348. Some(device),
  349. None,
  350. );
  351. }
  352. };
  353. let probe_failed = || {
  354. self.remove_from_sysfs(device);
  355. };
  356. let dev_groups_failed = || {
  357. device_manager().remove(device);
  358. };
  359. device.set_driver(Some(Arc::downgrade(driver)));
  360. self.add_to_sysfs(device).map_err(|e| {
  361. kerror!(
  362. "really_probe: add_to_sysfs failed, dev: '{}', err: {:?}",
  363. device.name(),
  364. e
  365. );
  366. sysfs_failed();
  367. bind_failed();
  368. e
  369. })?;
  370. self.call_driver_probe(device, driver).map_err(|e| {
  371. kerror!(
  372. "really_probe: call_driver_probe failed, dev: '{}', err: {:?}",
  373. device.name(),
  374. e
  375. );
  376. probe_failed();
  377. sysfs_failed();
  378. bind_failed();
  379. e
  380. })?;
  381. device_manager()
  382. .add_groups(device, driver.dev_groups())
  383. .map_err(|e| {
  384. kerror!(
  385. "really_probe: add_groups failed, dev: '{}', err: {:?}",
  386. device.name(),
  387. e
  388. );
  389. dev_groups_failed();
  390. probe_failed();
  391. sysfs_failed();
  392. bind_failed();
  393. e
  394. })?;
  395. // 我们假设所有的设备都有 sync_state 这个属性。如果没有的话,也创建属性文件。
  396. device_manager()
  397. .create_file(device, &DeviceAttrStateSynced)
  398. .map_err(|e| {
  399. kerror!(
  400. "really_probe: create_file failed, dev: '{}', err: {:?}",
  401. device.name(),
  402. e
  403. );
  404. dev_groups_failed();
  405. probe_failed();
  406. sysfs_failed();
  407. bind_failed();
  408. e
  409. })?;
  410. self.driver_bound(device);
  411. return Ok(());
  412. }
  413. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?fi=driver_attach#434
  414. fn add_to_sysfs(&self, device: &Arc<dyn Device>) -> Result<(), SystemError> {
  415. let driver = device.driver().ok_or(SystemError::EINVAL)?;
  416. if let Some(bus) = device.bus().map(|bus| bus.upgrade()).flatten() {
  417. bus.subsystem().bus_notifier().call_chain(
  418. BusNotifyEvent::BindDriver,
  419. Some(&device),
  420. None,
  421. );
  422. }
  423. let driver_kobj = driver.clone() as Arc<dyn KObject>;
  424. let device_kobj = device.clone() as Arc<dyn KObject>;
  425. sysfs_instance().create_link(Some(&driver_kobj), &device_kobj, device.name())?;
  426. let fail_rm_dev_link = || {
  427. sysfs_instance().remove_link(&driver_kobj, device.name());
  428. };
  429. sysfs_instance()
  430. .create_link(Some(&device_kobj), &driver_kobj, "driver".to_string())
  431. .map_err(|e| {
  432. fail_rm_dev_link();
  433. e
  434. })?;
  435. device_manager()
  436. .create_file(device, &DeviceAttrCoredump)
  437. .map_err(|e| {
  438. sysfs_instance().remove_link(&device_kobj, "driver".to_string());
  439. fail_rm_dev_link();
  440. e
  441. })?;
  442. return Ok(());
  443. }
  444. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?fi=driver_attach#469
  445. fn remove_from_sysfs(&self, _device: &Arc<dyn Device>) {
  446. todo!("remove_from_sysfs")
  447. }
  448. fn call_driver_probe(
  449. &self,
  450. device: &Arc<dyn Device>,
  451. driver: &Arc<dyn Driver>,
  452. ) -> Result<(), SystemError> {
  453. let bus = device
  454. .bus()
  455. .map(|bus| bus.upgrade())
  456. .flatten()
  457. .ok_or(SystemError::EINVAL)?;
  458. let r = bus.probe(device);
  459. if r == Err(SystemError::EOPNOTSUPP_OR_ENOTSUP) {
  460. kerror!(
  461. "call_driver_probe: bus.probe() failed, dev: '{}', err: {:?}",
  462. device.name(),
  463. r
  464. );
  465. return r;
  466. }
  467. if r.is_ok() {
  468. return Ok(());
  469. }
  470. let err = r.unwrap_err();
  471. match err {
  472. SystemError::ENODEV | SystemError::ENXIO => {
  473. kdebug!(
  474. "driver'{}': probe of {} rejects match {:?}",
  475. driver.name(),
  476. device.name(),
  477. err
  478. );
  479. }
  480. _ => {
  481. kwarn!(
  482. "driver'{}': probe of {} failed with error {:?}",
  483. driver.name(),
  484. device.name(),
  485. err
  486. );
  487. }
  488. }
  489. return Err(err);
  490. }
  491. /// 当设备被成功探测,进行了'设备->驱动'绑定后,调用这个函数,完成'驱动->设备'的绑定
  492. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c#393
  493. fn driver_bound(&self, device: &Arc<dyn Device>) {
  494. if self.driver_is_bound(device) {
  495. kwarn!("driver_bound: device '{}' is already bound.", device.name());
  496. return;
  497. }
  498. let driver = device.driver().unwrap();
  499. driver.add_device(device.clone());
  500. if let Some(bus) = device.bus().map(|bus| bus.upgrade()).flatten() {
  501. bus.subsystem().bus_notifier().call_chain(
  502. BusNotifyEvent::BoundDriver,
  503. Some(device),
  504. None,
  505. );
  506. }
  507. // todo: 发送kobj bind的uevent
  508. }
  509. fn driver_is_bound(&self, device: &Arc<dyn Device>) -> bool {
  510. if let Some(driver) = device.driver() {
  511. if driver.find_device_by_name(&device.name()).is_some() {
  512. return true;
  513. }
  514. }
  515. return false;
  516. }
  517. }
  518. /// 设备文件夹下的`dev`文件的属性
  519. #[derive(Debug, Clone, Copy)]
  520. pub struct DeviceAttrStateSynced;
  521. impl Attribute for DeviceAttrStateSynced {
  522. fn mode(&self) -> ModeType {
  523. // 0o444
  524. return ModeType::S_IRUGO;
  525. }
  526. fn name(&self) -> &str {
  527. "state_synced"
  528. }
  529. fn show(&self, kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError> {
  530. let dev = kobj.cast::<dyn Device>().map_err(|kobj| {
  531. kerror!(
  532. "Intertrait casting not implemented for kobj: {}",
  533. kobj.name()
  534. );
  535. SystemError::EOPNOTSUPP_OR_ENOTSUP
  536. })?;
  537. let val = dev.state_synced();
  538. let val = if val { 1 } else { 0 };
  539. return sysfs_emit_str(buf, format!("{}\n", val).as_str());
  540. }
  541. fn support(&self) -> SysFSOpsSupport {
  542. SysFSOpsSupport::ATTR_SHOW
  543. }
  544. }
  545. #[derive(Debug)]
  546. struct DeviceAttrCoredump;
  547. impl Attribute for DeviceAttrCoredump {
  548. fn name(&self) -> &str {
  549. "coredump"
  550. }
  551. fn mode(&self) -> ModeType {
  552. SYSFS_ATTR_MODE_WO
  553. }
  554. fn support(&self) -> SysFSOpsSupport {
  555. SysFSOpsSupport::ATTR_STORE
  556. }
  557. fn store(&self, kobj: Arc<dyn KObject>, buf: &[u8]) -> Result<usize, SystemError> {
  558. let dev = kobj.cast::<dyn Device>().map_err(|kobj| {
  559. kerror!(
  560. "Intertrait casting not implemented for kobj: {}",
  561. kobj.name()
  562. );
  563. SystemError::EOPNOTSUPP_OR_ENOTSUP
  564. })?;
  565. let drv = dev.driver().ok_or(SystemError::EINVAL)?;
  566. drv.coredump(&dev)?;
  567. return Ok(buf.len());
  568. }
  569. }