manage.rs 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146
  1. use core::ops::{BitXor, Deref, DerefMut};
  2. use alloc::{string::String, sync::Arc};
  3. use log::{debug, error, warn};
  4. use system_error::SystemError;
  5. use crate::{
  6. driver::base::device::DeviceId,
  7. exception::{
  8. irqchip::IrqChipSetMaskResult,
  9. irqdesc::{irq_desc_manager, InnerIrqDesc, IrqAction},
  10. },
  11. libs::{cpumask::CpuMask, spinlock::SpinLockGuard},
  12. process::{kthread::KernelThreadMechanism, ProcessManager},
  13. smp::cpu::ProcessorId,
  14. };
  15. use super::{
  16. dummychip::no_irq_chip,
  17. irqchip::IrqChipFlags,
  18. irqdata::{IrqData, IrqHandlerData, IrqLineStatus, IrqStatus},
  19. irqdesc::{InnerIrqAction, IrqDesc, IrqDescState, IrqHandleFlags, IrqHandler, IrqReturn},
  20. irqdomain::irq_domain_manager,
  21. IrqNumber,
  22. };
  23. lazy_static! {
  24. /// 默认的中断亲和性
  25. static ref IRQ_DEFAULT_AFFINITY: CpuMask = {
  26. let mut mask = CpuMask::new();
  27. // 默认情况下,中断处理程序将在第一个处理器上运行
  28. mask.set(ProcessorId::new(0), true);
  29. mask
  30. };
  31. }
  32. pub fn irq_manager() -> &'static IrqManager {
  33. &IrqManager
  34. }
  35. /// 中断管理器
  36. pub struct IrqManager;
  37. impl IrqManager {
  38. pub const IRQ_RESEND: bool = true;
  39. #[allow(dead_code)]
  40. pub const IRQ_NORESEND: bool = false;
  41. #[allow(dead_code)]
  42. pub const IRQ_START_FORCE: bool = true;
  43. pub const IRQ_START_COND: bool = false;
  44. /// 在中断线上添加一个处理函数
  45. ///
  46. /// ## 参数
  47. ///
  48. /// - irq: 虚拟中断号(中断线号)
  49. /// - name: 生成该中断的设备名称
  50. /// - handler: 中断处理函数
  51. /// - flags: 中断处理标志
  52. /// - dev_id: 一个用于标识设备的cookie
  53. pub fn request_irq(
  54. &self,
  55. irq: IrqNumber,
  56. name: String,
  57. handler: &'static dyn IrqHandler,
  58. flags: IrqHandleFlags,
  59. dev_id: Option<Arc<DeviceId>>,
  60. ) -> Result<(), SystemError> {
  61. return self.request_threaded_irq(irq, Some(handler), None, flags, name, dev_id);
  62. }
  63. /// 在中断线上添加一个处理函数(可以是线程化的中断)
  64. ///
  65. /// ## 参数
  66. ///
  67. /// - irq: 虚拟中断号
  68. /// - handler: 当中断发生时将被调用的函数,是
  69. /// 线程化中断的初级处理程序。如果handler为`None`并且thread_fn不为`None`,
  70. /// 将安装默认的初级处理程序
  71. /// - thread_fn: 在中断处理程序线程中调用的函数. 如果为`None`,则不会创建irq线程
  72. /// - flags: 中断处理标志
  73. /// - IRQF_SHARED: 中断是共享的
  74. /// - IRQF_TRIGGER*: 指定中断触发方式
  75. /// - IRQF_ONESHOT: 在thread_fn中运行时,中断线被遮蔽
  76. /// - dev_name: 生成该中断的设备名称
  77. /// - dev_id: 一个用于标识设备的cookie
  78. ///
  79. /// ## 说明
  80. ///
  81. /// 此调用分配中断资源并启用中断线和IRQ处理。
  82. /// 从这一点开始,您的处理程序函数可能会被调用。
  83. /// 因此,您必须确保首先初始化您的硬件,
  84. /// 并确保以正确的顺序设置中断处理程序。
  85. ///
  86. /// 如果您想为您的设备设置线程化中断处理程序
  87. /// 则需要提供@handler和@thread_fn。@handler仍然
  88. /// 在硬中断上下文中调用,并且必须检查
  89. /// 中断是否来自设备。如果是,它需要禁用设备上的中断
  90. /// 并返回IRQ_WAKE_THREAD,这将唤醒处理程序线程并运行
  91. /// @thread_fn。这种拆分处理程序设计是为了支持
  92. /// 共享中断。
  93. ///
  94. /// dev_id必须是全局唯一的。通常使用设备数据结构的地址或者uuid
  95. /// 作为cookie。由于处理程序接收这个值,因此使用它是有意义的。
  96. ///
  97. /// 如果您的中断是共享的,您必须传递一个非NULL的dev_id
  98. /// 因为当释放中断时需要它。
  99. pub fn request_threaded_irq(
  100. &self,
  101. irq: IrqNumber,
  102. mut handler: Option<&'static dyn IrqHandler>,
  103. thread_fn: Option<&'static dyn IrqHandler>,
  104. flags: IrqHandleFlags,
  105. dev_name: String,
  106. dev_id: Option<Arc<DeviceId>>,
  107. ) -> Result<(), SystemError> {
  108. if irq == IrqNumber::IRQ_NOTCONNECTED {
  109. return Err(SystemError::ENOTCONN);
  110. }
  111. // 逻辑检查:共享中断必须传入一个真正的设备ID,
  112. // 否则后来我们将难以确定哪个中断是哪个(会搞乱中断释放逻辑等)。
  113. // 此外,共享中断与禁用自动使能不相符。 共享中断可能在仍然禁用时请求它,然后永远等待中断。
  114. // 另外,IRQF_COND_SUSPEND 仅适用于共享中断,并且它不能与 IRQF_NO_SUSPEND 同时设置。
  115. if ((flags.contains(IrqHandleFlags::IRQF_SHARED)) && dev_id.is_none())
  116. || ((flags.contains(IrqHandleFlags::IRQF_SHARED))
  117. && (flags.contains(IrqHandleFlags::IRQF_NO_AUTOEN)))
  118. || (!(flags.contains(IrqHandleFlags::IRQF_SHARED))
  119. && (flags.contains(IrqHandleFlags::IRQF_COND_SUSPEND)))
  120. || ((flags.contains(IrqHandleFlags::IRQF_NO_SUSPEND))
  121. && (flags.contains(IrqHandleFlags::IRQF_COND_SUSPEND)))
  122. {
  123. return Err(SystemError::EINVAL);
  124. }
  125. let desc = irq_desc_manager().lookup(irq).ok_or(SystemError::EINVAL)?;
  126. if !desc.can_request() {
  127. warn!("desc {} can not request", desc.irq().data());
  128. return Err(SystemError::EINVAL);
  129. }
  130. if handler.is_none() {
  131. if thread_fn.is_none() {
  132. // 不允许中断处理函数和线程处理函数都为空
  133. return Err(SystemError::EINVAL);
  134. }
  135. // 如果中断处理函数为空,线程处理函数不为空,则使用默认的中断处理函数
  136. handler = Some(&DefaultPrimaryIrqHandler);
  137. }
  138. let irqaction = IrqAction::new(irq, dev_name, handler, thread_fn);
  139. let mut action_guard = irqaction.inner();
  140. *action_guard.flags_mut() = flags;
  141. *action_guard.dev_id_mut() = dev_id;
  142. drop(action_guard);
  143. debug!("to inner_setup_irq: {irq:?}");
  144. return self.inner_setup_irq(irq, irqaction, desc);
  145. }
  146. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/kernel/irq/manage.c?r=&mo=59252&fi=2138#1497
  147. #[inline(never)]
  148. fn inner_setup_irq(
  149. &self,
  150. irq: IrqNumber,
  151. action: Arc<IrqAction>,
  152. desc: Arc<IrqDesc>,
  153. ) -> Result<(), SystemError> {
  154. // ==== 定义错误处理函数 ====
  155. let err_out_thread =
  156. |e: SystemError, mut action_guard: SpinLockGuard<'_, InnerIrqAction>| -> SystemError {
  157. if let Some(thread_pcb) = action_guard.thread() {
  158. action_guard.set_thread(None);
  159. KernelThreadMechanism::stop(&thread_pcb).ok();
  160. }
  161. if let Some(secondary) = action_guard.secondary() {
  162. let mut secondary_guard = secondary.inner();
  163. if let Some(thread_pcb) = secondary_guard.thread() {
  164. secondary_guard.set_thread(None);
  165. KernelThreadMechanism::stop(&thread_pcb).ok();
  166. }
  167. }
  168. return e;
  169. };
  170. let err_out_bus_unlock = |e: SystemError,
  171. desc: Arc<IrqDesc>,
  172. req_mutex_guard: crate::libs::mutex::MutexGuard<'_, ()>,
  173. action_guard: SpinLockGuard<'_, InnerIrqAction>|
  174. -> SystemError {
  175. desc.chip_bus_sync_unlock();
  176. drop(req_mutex_guard);
  177. return err_out_thread(e, action_guard);
  178. };
  179. let err_out_unlock = |e: SystemError,
  180. desc_guard: SpinLockGuard<'_, InnerIrqDesc>,
  181. desc: Arc<IrqDesc>,
  182. req_mutex_guard: crate::libs::mutex::MutexGuard<'_, ()>,
  183. action_guard: SpinLockGuard<'_, InnerIrqAction>|
  184. -> SystemError {
  185. drop(desc_guard);
  186. return err_out_bus_unlock(e, desc, req_mutex_guard, action_guard);
  187. };
  188. let err_out_mismatch = |old_action_guard: SpinLockGuard<'_, InnerIrqAction>,
  189. desc_guard: SpinLockGuard<'_, InnerIrqDesc>,
  190. action_guard: SpinLockGuard<'_, InnerIrqAction>,
  191. desc: Arc<IrqDesc>,
  192. req_mutex_guard: crate::libs::mutex::MutexGuard<'_, ()>|
  193. -> SystemError {
  194. if !action_guard
  195. .flags()
  196. .contains(IrqHandleFlags::IRQF_PROBE_SHARED)
  197. {
  198. error!("Flags mismatch for irq {} (name: {}, flags: {:?}). old action name: {}, old flags: {:?}", irq.data(), action_guard.name(), action_guard.flags(), old_action_guard.name(), old_action_guard.flags());
  199. }
  200. return err_out_unlock(
  201. SystemError::EBUSY,
  202. desc_guard,
  203. desc,
  204. req_mutex_guard,
  205. action_guard,
  206. );
  207. };
  208. // ===== 代码开始 =====
  209. if Arc::ptr_eq(
  210. &desc.irq_data().chip_info_read_irqsave().chip(),
  211. &no_irq_chip(),
  212. ) {
  213. return Err(SystemError::ENOSYS);
  214. }
  215. let mut action_guard = action.inner();
  216. if !action_guard.flags().trigger_type_specified() {
  217. // 如果没有指定触发类型,则使用默认的触发类型
  218. action_guard
  219. .flags_mut()
  220. .insert_trigger_type(desc.irq_data().common_data().trigger_type())
  221. }
  222. let nested = desc.nested_thread();
  223. if nested {
  224. if action_guard.thread_fn().is_none() {
  225. return Err(SystemError::EINVAL);
  226. }
  227. action_guard.set_handler(Some(&IrqNestedPrimaryHandler));
  228. } else if desc.can_thread() {
  229. self.setup_forced_threading(action_guard.deref_mut())?;
  230. }
  231. // 如果具有中断线程处理程序,并且中断不是嵌套的,则设置中断线程
  232. if action_guard.thread_fn().is_some() && !nested {
  233. self.setup_irq_thread(irq, action_guard.deref(), false)?;
  234. if let Some(secondary) = action_guard.secondary() {
  235. let secondary_guard = secondary.inner();
  236. if let Err(e) = self.setup_irq_thread(irq, secondary_guard.deref(), true) {
  237. return Err(err_out_thread(e, action_guard));
  238. }
  239. }
  240. }
  241. // Drivers are often written to work w/o knowledge about the
  242. // underlying irq chip implementation, so a request for a
  243. // threaded irq without a primary hard irq context handler
  244. // requires the ONESHOT flag to be set. Some irq chips like
  245. // MSI based interrupts are per se one shot safe. Check the
  246. // chip flags, so we can avoid the unmask dance at the end of
  247. // the threaded handler for those.
  248. if desc
  249. .irq_data()
  250. .chip_info_read_irqsave()
  251. .chip()
  252. .flags()
  253. .contains(IrqChipFlags::IRQCHIP_ONESHOT_SAFE)
  254. {
  255. *action_guard.flags_mut() &= !IrqHandleFlags::IRQF_ONESHOT;
  256. }
  257. // Protects against a concurrent __free_irq() call which might wait
  258. // for synchronize_hardirq() to complete without holding the optional
  259. // chip bus lock and desc->lock. Also protects against handing out
  260. // a recycled oneshot thread_mask bit while it's still in use by
  261. // its previous owner.
  262. let req_mutex_guard = desc.request_mutex_lock();
  263. // Acquire bus lock as the irq_request_resources() callback below
  264. // might rely on the serialization or the magic power management
  265. // functions which are abusing the irq_bus_lock() callback,
  266. desc.chip_bus_lock();
  267. // 如果当前中断线上还没有irqaction, 则先为中断线申请资源
  268. if desc.actions().is_empty() {
  269. if let Err(e) = self.irq_request_resources(desc.clone()) {
  270. error!(
  271. "Failed to request resources for {} (irq {}) on irqchip {}, error {:?}",
  272. action_guard.name(),
  273. irq.data(),
  274. desc.irq_data().chip_info_read_irqsave().chip().name(),
  275. e
  276. );
  277. return Err(err_out_bus_unlock(
  278. e,
  279. desc.clone(),
  280. req_mutex_guard,
  281. action_guard,
  282. ));
  283. }
  284. }
  285. let mut desc_inner_guard: SpinLockGuard<'_, InnerIrqDesc> = desc.inner();
  286. // 标记当前irq是否是共享的
  287. let mut irq_shared = false;
  288. if !desc_inner_guard.actions().is_empty() {
  289. // 除非双方都同意并且是相同类型(级别、边沿、极性),否则不能共享中断。
  290. // 因此,两个标志字段都必须设置IRQF_SHARED,并且设置触发类型的位必须匹配。
  291. // 另外,所有各方都必须就ONESHOT达成一致。
  292. // NMI用途的中断线不能共享。
  293. if desc_inner_guard
  294. .internal_state()
  295. .contains(IrqDescState::IRQS_NMI)
  296. {
  297. error!(
  298. "Invalid attempt to share NMI for {} (irq {}) on irqchip {}",
  299. action_guard.name(),
  300. irq.data(),
  301. desc_inner_guard
  302. .irq_data()
  303. .chip_info_read_irqsave()
  304. .chip()
  305. .name()
  306. );
  307. return Err(err_out_unlock(
  308. SystemError::EINVAL,
  309. desc_inner_guard,
  310. desc.clone(),
  311. req_mutex_guard,
  312. action_guard,
  313. ));
  314. }
  315. let irq_data = desc_inner_guard.irq_data();
  316. let old_trigger_type: super::irqdata::IrqLineStatus;
  317. let status = irq_data.common_data().status();
  318. if status.trigger_type_was_set() {
  319. old_trigger_type = status.trigger_type();
  320. } else {
  321. old_trigger_type = action_guard.flags().trigger_type();
  322. irq_data.common_data().set_trigger_type(old_trigger_type);
  323. }
  324. let old = &desc_inner_guard.actions()[0].clone();
  325. let old_guard = old.inner();
  326. if (!(old_guard
  327. .flags()
  328. .intersection(*action_guard.flags())
  329. .contains(IrqHandleFlags::IRQF_SHARED)))
  330. || (old_trigger_type != (action_guard.flags().trigger_type()))
  331. || ((old_guard.flags().bitxor(*action_guard.flags()))
  332. .contains(IrqHandleFlags::IRQF_ONESHOT))
  333. {
  334. debug!(
  335. "Flags mismatch for irq {} (name: {}, flags: {:?}). old action name: {}, old flags: {:?}",
  336. irq.data(),
  337. action_guard.name(),
  338. action_guard.flags(),
  339. old_guard.name(),
  340. old_guard.flags()
  341. );
  342. return Err(err_out_mismatch(
  343. old_guard,
  344. desc_inner_guard,
  345. action_guard,
  346. desc.clone(),
  347. req_mutex_guard,
  348. ));
  349. }
  350. // all handlers must agree on per-cpuness
  351. if *old_guard.flags() & IrqHandleFlags::IRQF_PERCPU
  352. != *action_guard.flags() & IrqHandleFlags::IRQF_PERCPU
  353. {
  354. debug!(
  355. "Per-cpu mismatch for irq {} (name: {}, flags: {:?})",
  356. irq.data(),
  357. action_guard.name(),
  358. action_guard.flags()
  359. );
  360. return Err(err_out_mismatch(
  361. old_guard,
  362. desc_inner_guard,
  363. action_guard,
  364. desc.clone(),
  365. req_mutex_guard,
  366. ));
  367. }
  368. irq_shared = true;
  369. }
  370. if action_guard.flags().contains(IrqHandleFlags::IRQF_ONESHOT) {
  371. // todo: oneshot
  372. } else if action_guard.handler().is_some_and(|h| {
  373. h.type_id() == (&DefaultPrimaryIrqHandler as &dyn IrqHandler).type_id()
  374. }) && !desc_inner_guard
  375. .irq_data()
  376. .chip_info_read_irqsave()
  377. .chip()
  378. .flags()
  379. .contains(IrqChipFlags::IRQCHIP_ONESHOT_SAFE)
  380. {
  381. // 请求中断时 hander = NULL,因此我们为其使用默认的主处理程序。
  382. // 但它没有设置ONESHOT标志。与电平触发中断结合时,
  383. // 这是致命的,因为默认的主处理程序只是唤醒线程,然后重新启用 irq 线路,
  384. // 但设备仍然保持电平中断生效。周而复始....
  385. // 虽然这对于边缘类型中断来说可行,但我们为了安全起见,不加条件地拒绝,
  386. // 因为我们不能确定这个中断实际上具有什么类型。
  387. // 由于底层芯片实现可能会覆盖它们,所以类型标志并不可靠.
  388. error!(
  389. "Requesting irq {} without a handler, and ONESHOT flags not set for irqaction: {}",
  390. irq.data(),
  391. action_guard.name()
  392. );
  393. return Err(err_out_unlock(
  394. SystemError::EINVAL,
  395. desc_inner_guard,
  396. desc.clone(),
  397. req_mutex_guard,
  398. action_guard,
  399. ));
  400. }
  401. // 第一次在当前irqdesc上注册中断处理函数
  402. if !irq_shared {
  403. // 设置中断触发方式
  404. if action_guard.flags().trigger_type_specified() {
  405. let trigger_type = action_guard.flags().trigger_type();
  406. if let Err(e) =
  407. self.do_set_irq_trigger(desc.clone(), &mut desc_inner_guard, trigger_type)
  408. {
  409. debug!(
  410. "Failed to set trigger type for irq {} (name: {}, flags: {:?}), error {:?}",
  411. irq.data(),
  412. action_guard.name(),
  413. action_guard.flags(),
  414. e
  415. );
  416. return Err(err_out_unlock(
  417. e,
  418. desc_inner_guard,
  419. desc.clone(),
  420. req_mutex_guard,
  421. action_guard,
  422. ));
  423. }
  424. }
  425. debug!("to irq_activate");
  426. // 激活中断。这种激活必须独立于IRQ_NOAUTOEN进行*desc_inner_guard.internal_state_mut() |= IrqDescState::IRQS_NOREQUEST;uest.
  427. if let Err(e) = self.irq_activate(&desc, &mut desc_inner_guard) {
  428. debug!(
  429. "Failed to activate irq {} (name: {}, flags: {:?}), error {:?}",
  430. irq.data(),
  431. action_guard.name(),
  432. action_guard.flags(),
  433. e
  434. );
  435. return Err(err_out_unlock(
  436. e,
  437. desc_inner_guard,
  438. desc.clone(),
  439. req_mutex_guard,
  440. action_guard,
  441. ));
  442. }
  443. *desc_inner_guard.internal_state_mut() &= !(IrqDescState::IRQS_AUTODETECT
  444. | IrqDescState::IRQS_SPURIOUS_DISABLED
  445. | IrqDescState::IRQS_ONESHOT
  446. | IrqDescState::IRQS_WAITING);
  447. desc_inner_guard
  448. .common_data()
  449. .clear_status(IrqStatus::IRQD_IRQ_INPROGRESS);
  450. if action_guard.flags().contains(IrqHandleFlags::IRQF_PERCPU) {
  451. desc_inner_guard
  452. .common_data()
  453. .insert_status(IrqStatus::IRQD_PER_CPU);
  454. desc_inner_guard.line_status_set_per_cpu();
  455. if action_guard.flags().contains(IrqHandleFlags::IRQF_NO_DEBUG) {
  456. desc_inner_guard.line_status_set_no_debug();
  457. }
  458. }
  459. if action_guard.flags().contains(IrqHandleFlags::IRQF_ONESHOT) {
  460. *desc_inner_guard.internal_state_mut() |= IrqDescState::IRQS_ONESHOT;
  461. }
  462. // 如果有要求的话,则忽略IRQ的均衡。
  463. if action_guard
  464. .flags()
  465. .contains(IrqHandleFlags::IRQF_NOBALANCING)
  466. {
  467. todo!("IRQF_NO_BALANCING");
  468. }
  469. if !action_guard
  470. .flags()
  471. .contains(IrqHandleFlags::IRQF_NO_AUTOEN)
  472. && desc_inner_guard.can_autoenable()
  473. {
  474. // 如果没有设置IRQF_NOAUTOEN,则自动使能中断
  475. self.irq_startup(
  476. &desc,
  477. &mut desc_inner_guard,
  478. Self::IRQ_RESEND,
  479. Self::IRQ_START_COND,
  480. )
  481. .ok();
  482. } else {
  483. // 共享中断与禁用自动使能不太兼容。
  484. // 共享中断可能在它仍然被禁用时请求它,然后永远等待中断。
  485. static mut WARNED: bool = false;
  486. if action_guard.flags().contains(IrqHandleFlags::IRQF_SHARED) && unsafe { !WARNED }
  487. {
  488. warn!(
  489. "Shared interrupt {} for {} requested but not auto enabled",
  490. irq.data(),
  491. action_guard.name()
  492. );
  493. unsafe { WARNED = true };
  494. }
  495. desc_inner_guard.set_depth(1);
  496. }
  497. } else if action_guard.flags().trigger_type_specified() {
  498. let new_trigger_type = action_guard.flags().trigger_type();
  499. let old_trigger_type = desc_inner_guard.common_data().trigger_type();
  500. if new_trigger_type != old_trigger_type {
  501. warn!("Irq {} uses trigger type: {old_trigger_type:?}, but requested trigger type: {new_trigger_type:?}.", irq.data());
  502. }
  503. }
  504. // 在队列末尾添加新的irqaction
  505. desc_inner_guard.add_action(action.clone());
  506. // 检查我们是否曾经通过虚构的中断处理程序禁用过irq。重新启用它并再给它一次机会。
  507. if irq_shared
  508. && desc_inner_guard
  509. .internal_state()
  510. .contains(IrqDescState::IRQS_SPURIOUS_DISABLED)
  511. {
  512. desc_inner_guard
  513. .internal_state_mut()
  514. .remove(IrqDescState::IRQS_SPURIOUS_DISABLED);
  515. self.do_enable_irq(desc.clone(), &mut desc_inner_guard).ok();
  516. }
  517. drop(desc_inner_guard);
  518. desc.chip_bus_sync_unlock();
  519. drop(req_mutex_guard);
  520. drop(action_guard);
  521. self.wake_up_and_wait_for_irq_thread_ready(&desc, Some(action.clone()));
  522. self.wake_up_and_wait_for_irq_thread_ready(&desc, action.inner().secondary());
  523. return Ok(());
  524. }
  525. /// 唤醒中断线程并等待中断线程准备好
  526. ///
  527. /// ## 参数
  528. ///
  529. /// - desc: 中断描述符
  530. /// - action: 要唤醒的中断处理函数
  531. ///
  532. /// ## 锁
  533. ///
  534. /// 进入当前函数时,`action`的锁需要被释放
  535. fn wake_up_and_wait_for_irq_thread_ready(
  536. &self,
  537. desc: &Arc<IrqDesc>,
  538. action: Option<Arc<IrqAction>>,
  539. ) {
  540. if action.is_none() {
  541. return;
  542. }
  543. let action = action.unwrap();
  544. let action_guard = action.inner();
  545. if action_guard.thread().is_none() {
  546. return;
  547. }
  548. ProcessManager::wakeup(&action_guard.thread().unwrap()).ok();
  549. drop(action_guard);
  550. action
  551. .thread_completion()
  552. .wait_for_completion()
  553. .map_err(|e| {
  554. warn!(
  555. "Failed to wait for irq thread ready for {} (irq {:?}), error {:?}",
  556. action.inner().name(),
  557. desc.irq_data().irq(),
  558. e
  559. );
  560. })
  561. .ok();
  562. }
  563. pub(super) fn irq_activate_and_startup(
  564. &self,
  565. desc: &Arc<IrqDesc>,
  566. desc_inner_guard: &mut SpinLockGuard<'_, InnerIrqDesc>,
  567. resend: bool,
  568. ) -> Result<(), SystemError> {
  569. debug!(
  570. "irq_activate_and_startup: irq: {}, name: {:?}",
  571. desc.irq().data(),
  572. desc_inner_guard.name()
  573. );
  574. self.irq_activate(desc, desc_inner_guard)?;
  575. self.irq_startup(desc, desc_inner_guard, resend, Self::IRQ_START_FORCE)
  576. }
  577. pub(super) fn irq_activate(
  578. &self,
  579. _desc: &Arc<IrqDesc>,
  580. desc_inner_guard: &mut SpinLockGuard<'_, InnerIrqDesc>,
  581. ) -> Result<(), SystemError> {
  582. let irq_data = desc_inner_guard.irq_data();
  583. if !desc_inner_guard.common_data().status().affinity_managed() {
  584. return irq_domain_manager().activate_irq(irq_data, false);
  585. }
  586. return Ok(());
  587. }
  588. /// 设置CPU亲和性并开启中断
  589. pub(super) fn irq_startup(
  590. &self,
  591. desc: &Arc<IrqDesc>,
  592. desc_inner_guard: &mut SpinLockGuard<'_, InnerIrqDesc>,
  593. resend: bool,
  594. force: bool,
  595. ) -> Result<(), SystemError> {
  596. debug!(
  597. "irq_startup: irq: {}, name: {:?}",
  598. desc_inner_guard.irq_data().irq().data(),
  599. desc_inner_guard.name()
  600. );
  601. let mut ret = Ok(());
  602. let irq_data = desc_inner_guard.irq_data().clone();
  603. let affinity = desc_inner_guard.common_data().affinity();
  604. desc_inner_guard.set_depth(0);
  605. if desc_inner_guard.common_data().status().started() {
  606. self.irq_enable(desc_inner_guard);
  607. } else {
  608. match self.__irq_startup_managed(desc_inner_guard, &affinity, force) {
  609. IrqStartupResult::Normal => {
  610. if irq_data
  611. .chip_info_read_irqsave()
  612. .chip()
  613. .flags()
  614. .contains(IrqChipFlags::IRQCHIP_AFFINITY_PRE_STARTUP)
  615. {
  616. self.irq_setup_affinity(desc, desc_inner_guard).ok();
  617. }
  618. ret = self.__irq_startup(desc_inner_guard);
  619. if !irq_data
  620. .chip_info_read_irqsave()
  621. .chip()
  622. .flags()
  623. .contains(IrqChipFlags::IRQCHIP_AFFINITY_PRE_STARTUP)
  624. {
  625. self.irq_setup_affinity(desc, desc_inner_guard).ok();
  626. }
  627. }
  628. IrqStartupResult::Managed => {
  629. self.irq_do_set_affinity(&irq_data, desc_inner_guard, &affinity, false)
  630. .ok();
  631. ret = self.__irq_startup(desc_inner_guard);
  632. }
  633. IrqStartupResult::Abort => {
  634. desc_inner_guard
  635. .common_data()
  636. .insert_status(IrqStatus::IRQD_MANAGED_SHUTDOWN);
  637. return Ok(());
  638. }
  639. }
  640. }
  641. if resend {
  642. if let Err(e) = self.irq_check_and_resend(desc_inner_guard, false) {
  643. error!(
  644. "Failed to check and resend irq {}, error {:?}",
  645. irq_data.irq().data(),
  646. e
  647. );
  648. }
  649. }
  650. return ret;
  651. }
  652. pub fn irq_enable(&self, desc_inner_guard: &SpinLockGuard<'_, InnerIrqDesc>) {
  653. let common_data = desc_inner_guard.common_data();
  654. if !common_data.status().disabled() {
  655. self.unmask_irq(desc_inner_guard);
  656. } else {
  657. common_data.clear_disabled();
  658. let chip = desc_inner_guard.irq_data().chip_info_read_irqsave().chip();
  659. if let Err(e) = chip.irq_enable(desc_inner_guard.irq_data()) {
  660. if e == SystemError::ENOSYS {
  661. self.unmask_irq(desc_inner_guard);
  662. }
  663. error!(
  664. "Failed to enable irq {} (name: {:?}), error {:?}",
  665. desc_inner_guard.irq_data().irq().data(),
  666. desc_inner_guard.name(),
  667. e
  668. );
  669. } else {
  670. common_data.clear_masked();
  671. }
  672. }
  673. }
  674. /// 自动设置中断的CPU亲和性
  675. ///
  676. ///
  677. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/kernel/irq/manage.c#589
  678. pub fn irq_setup_affinity(
  679. &self,
  680. _desc: &Arc<IrqDesc>,
  681. desc_inner_guard: &mut SpinLockGuard<'_, InnerIrqDesc>,
  682. ) -> Result<(), SystemError> {
  683. let common_data = desc_inner_guard.common_data();
  684. if !desc_inner_guard.can_set_affinity() {
  685. return Ok(());
  686. }
  687. let mut to_set = IRQ_DEFAULT_AFFINITY.clone();
  688. if common_data.status().affinity_managed()
  689. || common_data.status().contains(IrqStatus::IRQD_AFFINITY_SET)
  690. {
  691. // FIXME: 要判断affinity跟已上线的CPU是否有交集
  692. let irq_aff = common_data.affinity();
  693. if irq_aff.is_empty() {
  694. common_data.clear_status(IrqStatus::IRQD_AFFINITY_SET);
  695. } else {
  696. to_set = irq_aff;
  697. }
  698. }
  699. // FIXME: 求to_set和在线CPU的交集
  700. return self.irq_do_set_affinity(
  701. desc_inner_guard.irq_data(),
  702. desc_inner_guard,
  703. &to_set,
  704. false,
  705. );
  706. }
  707. #[allow(dead_code)]
  708. pub fn irq_set_affinity(
  709. &self,
  710. irq_data: &Arc<IrqData>,
  711. desc_inner_guard: &SpinLockGuard<'_, InnerIrqDesc>,
  712. cpumask: &CpuMask,
  713. ) -> Result<(), SystemError> {
  714. return self.irq_do_set_affinity(irq_data, desc_inner_guard, cpumask, false);
  715. }
  716. fn irq_do_set_affinity(
  717. &self,
  718. irq_data: &Arc<IrqData>,
  719. desc_inner_guard: &SpinLockGuard<'_, InnerIrqDesc>,
  720. cpumask: &CpuMask,
  721. force: bool,
  722. ) -> Result<(), SystemError> {
  723. let chip = irq_data.chip_info_read_irqsave().chip();
  724. if !chip.can_set_affinity() {
  725. return Err(SystemError::EINVAL);
  726. }
  727. // todo: 处理CPU中断隔离相关的逻辑
  728. let common_data = desc_inner_guard.common_data();
  729. let r = if force || !cpumask.is_empty() {
  730. chip.irq_set_affinity(irq_data, cpumask, force)
  731. } else {
  732. return Err(SystemError::EINVAL);
  733. };
  734. let mut ret = Ok(());
  735. if let Ok(rs) = r {
  736. match rs {
  737. IrqChipSetMaskResult::Success | IrqChipSetMaskResult::Done => {
  738. common_data.set_affinity(cpumask.clone());
  739. }
  740. IrqChipSetMaskResult::NoChange => {
  741. // irq_validate_effective_affinity(data);
  742. // irq_set_thread_affinity(desc);
  743. }
  744. }
  745. } else {
  746. ret = Err(r.unwrap_err());
  747. }
  748. return ret;
  749. }
  750. fn __irq_startup(
  751. &self,
  752. desc_inner_guard: &SpinLockGuard<'_, InnerIrqDesc>,
  753. ) -> Result<(), SystemError> {
  754. let common_data = desc_inner_guard.common_data();
  755. if let Err(e) = desc_inner_guard
  756. .irq_data()
  757. .chip_info_read_irqsave()
  758. .chip()
  759. .irq_startup(desc_inner_guard.irq_data())
  760. {
  761. if e == SystemError::ENOSYS {
  762. self.irq_enable(desc_inner_guard);
  763. } else {
  764. return Err(e);
  765. }
  766. } else {
  767. common_data.clear_disabled();
  768. common_data.clear_masked();
  769. }
  770. common_data.set_started();
  771. return Ok(());
  772. }
  773. fn __irq_startup_managed(
  774. &self,
  775. desc_inner_guard: &SpinLockGuard<'_, InnerIrqDesc>,
  776. _affinity: &CpuMask,
  777. _force: bool,
  778. ) -> IrqStartupResult {
  779. let irq_data = desc_inner_guard.irq_data();
  780. let common_data = desc_inner_guard.common_data();
  781. if !common_data.status().affinity_managed() {
  782. return IrqStartupResult::Normal;
  783. }
  784. common_data.clear_managed_shutdown();
  785. /*
  786. - 检查Affinity掩码是否包括所有的在线CPU。如果是,这意味着有代码试图在管理的中断上使用enable_irq(),
  787. 这可能是非法的。在这种情况下,如果force不是真值,函数会返回IRQ_STARTUP_ABORT,表示中断处理应该被放弃。
  788. - 如果Affinity掩码中没有任何在线的CPU,那么中断请求是不可用的,因为没有任何CPU可以处理它。
  789. 在这种情况下,如果force不是真值,函数同样会返回IRQ_STARTUP_ABORT。
  790. - 如果以上条件都不满足,尝试激活中断,并将其设置为管理模式。这是通过调用 `irq_domain_manager().activate_irq()` 函数来实现的。
  791. 如果这个调用失败,表示有保留的资源无法访问,函数会返回IRQ_STARTUP_ABORT。
  792. - 如果一切顺利,函数会返回IRQ_STARTUP_MANAGED,表示中断已经被成功管理并激活。
  793. */
  794. // if (cpumask_any_and(aff, cpu_online_mask) >= nr_cpu_ids) {
  795. // /*
  796. // * Catch code which fiddles with enable_irq() on a managed
  797. // * and potentially shutdown IRQ. Chained interrupt
  798. // * installment or irq auto probing should not happen on
  799. // * managed irqs either.
  800. // */
  801. // if (WARN_ON_ONCE(force))
  802. // return IRQ_STARTUP_ABORT;
  803. // /*
  804. // * The interrupt was requested, but there is no online CPU
  805. // * in it's affinity mask. Put it into managed shutdown
  806. // * state and let the cpu hotplug mechanism start it up once
  807. // * a CPU in the mask becomes available.
  808. // */
  809. // return IRQ_STARTUP_ABORT;
  810. // }
  811. let r = irq_domain_manager().activate_irq(irq_data, false);
  812. if r.is_err() {
  813. return IrqStartupResult::Abort;
  814. }
  815. return IrqStartupResult::Managed;
  816. }
  817. pub fn do_enable_irq(
  818. &self,
  819. _desc: Arc<IrqDesc>,
  820. _desc_inner_guard: &mut SpinLockGuard<'_, InnerIrqDesc>,
  821. ) -> Result<(), SystemError> {
  822. // https://code.dragonos.org.cn/xref/linux-6.1.9/kernel/irq/manage.c?r=&mo=59252&fi=2138#776
  823. todo!("do_enable_irq")
  824. }
  825. #[inline(never)]
  826. pub fn do_set_irq_trigger(
  827. &self,
  828. _desc: Arc<IrqDesc>,
  829. desc_inner_guard: &mut SpinLockGuard<'_, InnerIrqDesc>,
  830. mut trigger_type: IrqLineStatus,
  831. ) -> Result<(), SystemError> {
  832. let chip = desc_inner_guard.irq_data().chip_info_read_irqsave().chip();
  833. let mut to_unmask = false;
  834. if !chip.can_set_flow_type() {
  835. // debug!(
  836. // "No set_irq_type function for irq {}, chip {}",
  837. // desc_inner_guard.irq_data().irq().data(),
  838. // chip.name()
  839. // );
  840. return Ok(());
  841. }
  842. if chip.flags().contains(IrqChipFlags::IRQCHIP_SET_TYPE_MASKED) {
  843. if !desc_inner_guard.common_data().status().masked() {
  844. self.mask_irq(desc_inner_guard.irq_data());
  845. }
  846. if !desc_inner_guard.common_data().status().disabled() {
  847. to_unmask = true;
  848. }
  849. }
  850. trigger_type &= IrqLineStatus::IRQ_TYPE_SENSE_MASK;
  851. let r = chip.irq_set_type(desc_inner_guard.irq_data(), trigger_type);
  852. let ret;
  853. if let Ok(rs) = r {
  854. match rs {
  855. IrqChipSetMaskResult::Success | IrqChipSetMaskResult::Done => {
  856. let common_data = desc_inner_guard.common_data();
  857. common_data.clear_status(IrqStatus::IRQD_TRIGGER_MASK);
  858. let mut irqstatus = IrqStatus::empty();
  859. irqstatus.set_trigger_type(trigger_type);
  860. common_data.insert_status(irqstatus);
  861. }
  862. IrqChipSetMaskResult::NoChange => {
  863. let flags = desc_inner_guard.common_data().trigger_type();
  864. desc_inner_guard.set_trigger_type(flags);
  865. desc_inner_guard
  866. .common_data()
  867. .clear_status(IrqStatus::IRQD_LEVEL);
  868. desc_inner_guard.clear_level();
  869. if !(flags & IrqLineStatus::IRQ_TYPE_LEVEL_MASK).is_empty() {
  870. desc_inner_guard.set_level();
  871. desc_inner_guard
  872. .common_data()
  873. .insert_status(IrqStatus::IRQD_LEVEL);
  874. }
  875. }
  876. }
  877. ret = Ok(());
  878. } else {
  879. error!(
  880. "Failed to set irq {} trigger type to {:?} on irqchip {}, error {:?}",
  881. desc_inner_guard.irq_data().irq().data(),
  882. trigger_type,
  883. chip.name(),
  884. r
  885. );
  886. ret = Err(r.unwrap_err());
  887. }
  888. if to_unmask {
  889. self.unmask_irq(desc_inner_guard);
  890. }
  891. return ret;
  892. }
  893. fn irq_request_resources(&self, desc: Arc<IrqDesc>) -> Result<(), SystemError> {
  894. let irq_data = desc.irq_data();
  895. let irq_chip = irq_data.chip_info_read_irqsave().chip();
  896. irq_chip.irq_request_resources(&irq_data)
  897. }
  898. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/kernel/irq/manage.c?r=&mo=59252&fi=2138#1448
  899. fn setup_irq_thread(
  900. &self,
  901. _irq: IrqNumber,
  902. _action: &InnerIrqAction,
  903. _secondary: bool,
  904. ) -> Result<(), SystemError> {
  905. // if secondary {
  906. // KernelThreadMechanism::create(func, name)
  907. // }
  908. todo!("setup_irq_thread")
  909. }
  910. fn setup_forced_threading(&self, _action: &mut InnerIrqAction) -> Result<(), SystemError> {
  911. // todo: 处理强制线程化的逻辑,参考linux的`irq_setup_forced_threading()`
  912. return Ok(());
  913. }
  914. pub fn irq_clear_status_flags(
  915. &self,
  916. irq: IrqNumber,
  917. status: IrqLineStatus,
  918. ) -> Result<(), SystemError> {
  919. let desc = irq_desc_manager().lookup(irq).ok_or(SystemError::EINVAL)?;
  920. desc.modify_status(status, IrqLineStatus::empty());
  921. return Ok(());
  922. }
  923. /// 屏蔽中断
  924. pub(super) fn mask_irq(&self, irq_data: &Arc<IrqData>) {
  925. if irq_data.common_data().status().masked() {
  926. return;
  927. }
  928. let chip = irq_data.chip_info_read_irqsave().chip();
  929. let r = chip.irq_mask(irq_data);
  930. if r.is_ok() {
  931. irq_data.common_data().set_masked();
  932. }
  933. }
  934. /// 解除屏蔽中断
  935. pub(super) fn unmask_irq(&self, desc_inner_guard: &SpinLockGuard<'_, InnerIrqDesc>) {
  936. if !desc_inner_guard.common_data().status().masked() {
  937. return;
  938. }
  939. let r = desc_inner_guard
  940. .irq_data()
  941. .chip_info_read_irqsave()
  942. .chip()
  943. .irq_unmask(desc_inner_guard.irq_data());
  944. if let Err(e) = r {
  945. if e != SystemError::ENOSYS {
  946. error!(
  947. "Failed to unmask irq {} on irqchip {}, error {:?}",
  948. desc_inner_guard.irq_data().irq().data(),
  949. desc_inner_guard
  950. .irq_data()
  951. .chip_info_read_irqsave()
  952. .chip()
  953. .name(),
  954. e
  955. );
  956. }
  957. } else {
  958. desc_inner_guard
  959. .common_data()
  960. .clear_status(IrqStatus::IRQD_IRQ_MASKED);
  961. }
  962. }
  963. /// 释放使用request_irq分配的中断
  964. ///
  965. /// ## 参数
  966. ///
  967. /// - irq: 要释放的中断线
  968. /// - dev_id: 要释放的设备身份
  969. ///
  970. /// ## 返回
  971. ///
  972. /// 返回传递给request_irq的devname参数
  973. ///
  974. /// ## 说明
  975. ///
  976. /// 移除一个中断处理程序。处理程序被移除,如果该中断线不再被任何驱动程序使用,则会被禁用。
  977. ///
  978. /// 在共享IRQ的情况下,调用者必须确保在调用此功能之前,它在所驱动的卡上禁用了中断。
  979. ///
  980. /// ## 注意
  981. ///
  982. /// 此函数不可以在中断上下文中调用。
  983. ///
  984. /// 参考 https://code.dragonos.org.cn/xref/linux-6.6.21/kernel/irq/manage.c#2026
  985. pub fn free_irq(&self, _irq: IrqNumber, _dev_id: Option<Arc<DeviceId>>) {
  986. warn!("Unimplemented free_irq");
  987. }
  988. }
  989. enum IrqStartupResult {
  990. Normal,
  991. Managed,
  992. Abort,
  993. }
  994. /// 默认的初级中断处理函数
  995. ///
  996. /// 该处理函数仅仅返回`WakeThread`,即唤醒中断线程
  997. #[derive(Debug)]
  998. struct DefaultPrimaryIrqHandler;
  999. impl IrqHandler for DefaultPrimaryIrqHandler {
  1000. fn handle(
  1001. &self,
  1002. _irq: IrqNumber,
  1003. _static_data: Option<&dyn IrqHandlerData>,
  1004. _dynamic_data: Option<Arc<dyn IrqHandlerData>>,
  1005. ) -> Result<IrqReturn, SystemError> {
  1006. return Ok(IrqReturn::WakeThread);
  1007. }
  1008. }
  1009. /// Primary handler for nested threaded interrupts.
  1010. /// Should never be called.
  1011. #[derive(Debug)]
  1012. struct IrqNestedPrimaryHandler;
  1013. impl IrqHandler for IrqNestedPrimaryHandler {
  1014. fn handle(
  1015. &self,
  1016. irq: IrqNumber,
  1017. _static_data: Option<&dyn IrqHandlerData>,
  1018. _dynamic_data: Option<Arc<dyn IrqHandlerData>>,
  1019. ) -> Result<IrqReturn, SystemError> {
  1020. warn!("Primary handler called for nested irq {}", irq.data());
  1021. return Ok(IrqReturn::NotHandled);
  1022. }
  1023. }