irqdesc.rs 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024
  1. use core::{
  2. any::Any,
  3. fmt::Debug,
  4. sync::atomic::{AtomicI64, Ordering},
  5. };
  6. use alloc::{
  7. collections::{btree_map, BTreeMap},
  8. string::{String, ToString},
  9. sync::{Arc, Weak},
  10. vec::Vec,
  11. };
  12. use system_error::SystemError;
  13. use crate::{
  14. arch::{interrupt::TrapFrame, CurrentIrqArch},
  15. driver::base::{
  16. device::DeviceId,
  17. kobject::{KObjType, KObject, KObjectState, LockedKObjectState},
  18. kset::KSet,
  19. },
  20. filesystem::kernfs::KernFSInode,
  21. libs::{
  22. cpumask::CpuMask,
  23. mutex::{Mutex, MutexGuard},
  24. rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
  25. spinlock::{SpinLock, SpinLockGuard},
  26. },
  27. mm::percpu::PerCpuVar,
  28. process::ProcessControlBlock,
  29. sched::completion::Completion,
  30. smp::cpu::smp_cpu_manager,
  31. };
  32. use super::{
  33. dummychip::no_irq_chip,
  34. handle::bad_irq_handler,
  35. irqchip::IrqChip,
  36. irqdata::{IrqCommonData, IrqData, IrqHandlerData, IrqLineStatus, IrqStatus},
  37. irqdomain::{irq_domain_manager, IrqDomain},
  38. sysfs::{irq_sysfs_del, IrqKObjType},
  39. HardwareIrqNumber, InterruptArch, IrqNumber,
  40. };
  41. /// 中断流处理程序
  42. pub trait IrqFlowHandler: Debug + Send + Sync + Any {
  43. fn handle(&self, irq_desc: &Arc<IrqDesc>, trap_frame: &mut TrapFrame);
  44. }
  45. /// 中断处理程序
  46. pub trait IrqHandler: Debug + Send + Sync + Any {
  47. fn handle(
  48. &self,
  49. irq: IrqNumber,
  50. static_data: Option<&dyn IrqHandlerData>,
  51. dynamic_data: Option<Arc<dyn IrqHandlerData>>,
  52. ) -> Result<IrqReturn, SystemError>;
  53. }
  54. /// 中断处理函数返回值
  55. ///
  56. /// 用于指示中断处理函数是否处理了中断
  57. #[derive(Debug, Clone, Copy, PartialEq, Eq)]
  58. pub enum IrqReturn {
  59. /// 中断未被处理
  60. NotHandled,
  61. /// 中断已被处理
  62. Handled,
  63. /// 中断已被处理,并且需要唤醒中断线程
  64. WakeThread,
  65. }
  66. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/irqdesc.h#55
  67. #[derive(Debug)]
  68. pub struct IrqDesc {
  69. inner: SpinLock<InnerIrqDesc>,
  70. handler: RwLock<Option<&'static dyn IrqFlowHandler>>,
  71. /// 一个用于串行化 request_irq()和free_irq() 的互斥锁
  72. request_mutex: Mutex<()>,
  73. kobj_state: LockedKObjectState,
  74. /// 当前描述符内正在运行的中断线程数
  75. threads_active: AtomicI64,
  76. }
  77. impl IrqDesc {
  78. #[inline(never)]
  79. pub fn new(irq: IrqNumber, name: Option<String>, irqd_flags: IrqStatus) -> Arc<Self> {
  80. // 初始化的过程参考 https://code.dragonos.org.cn/xref/linux-6.1.9/kernel/irq/irqdesc.c#392
  81. let common_data = Arc::new(IrqCommonData::new());
  82. let irq_data = Arc::new(IrqData::new(
  83. irq,
  84. HardwareIrqNumber::new(irq.data()),
  85. common_data.clone(),
  86. no_irq_chip(),
  87. ));
  88. irq_data.irqd_set(IrqStatus::IRQD_IRQ_DISABLED);
  89. common_data.insert_status(IrqStatus::IRQD_IRQ_MASKED);
  90. let irq_desc = IrqDesc {
  91. inner: SpinLock::new(InnerIrqDesc {
  92. percpu_affinity: None,
  93. percpu_enabled: None,
  94. common_data,
  95. irq_data,
  96. desc_internal_state: IrqDescState::empty(),
  97. line_status: IrqLineStatus::empty(),
  98. actions: Vec::new(),
  99. name,
  100. parent_irq: None,
  101. depth: 1,
  102. wake_depth: 0,
  103. kern_inode: None,
  104. kset: None,
  105. parent_kobj: None,
  106. }),
  107. request_mutex: Mutex::new(()),
  108. handler: RwLock::new(None),
  109. kobj_state: LockedKObjectState::new(Some(KObjectState::INITIALIZED)),
  110. threads_active: AtomicI64::new(0),
  111. };
  112. let irq_desc = Arc::new(irq_desc);
  113. irq_desc.irq_data().set_irq_desc(Arc::downgrade(&irq_desc));
  114. irq_desc.set_handler(bad_irq_handler());
  115. irq_desc.inner().irq_data.irqd_set(irqd_flags);
  116. return irq_desc;
  117. }
  118. /// 返回当前活跃的中断线程数量
  119. #[allow(dead_code)]
  120. pub fn threads_active(&self) -> i64 {
  121. self.threads_active.load(Ordering::SeqCst)
  122. }
  123. /// 增加当前活跃的中断线程数量, 返回增加前的值
  124. pub fn inc_threads_active(&self) -> i64 {
  125. self.threads_active.fetch_add(1, Ordering::SeqCst)
  126. }
  127. /// 减少当前活跃的中断线程数量, 返回减少前的值
  128. #[allow(dead_code)]
  129. pub fn dec_threads_active(&self) -> i64 {
  130. self.threads_active.fetch_sub(1, Ordering::SeqCst)
  131. }
  132. pub fn set_handler(&self, handler: &'static dyn IrqFlowHandler) {
  133. self.chip_bus_lock();
  134. let mut guard = self.handler.write_irqsave();
  135. *guard = Some(handler);
  136. self.chip_bus_sync_unlock();
  137. }
  138. /// 设置中断处理程序(不对desc->inner)
  139. ///
  140. ///
  141. /// ## Safety
  142. ///
  143. /// 需要保证irq_data和chip是当前irqdesc的
  144. pub fn set_handler_no_lock_inner(
  145. &self,
  146. handler: &'static dyn IrqFlowHandler,
  147. irq_data: &Arc<IrqData>,
  148. chip: &Arc<dyn IrqChip>,
  149. ) {
  150. chip.irq_bus_lock(irq_data).ok();
  151. let mut guard = self.handler.write_irqsave();
  152. *guard = Some(handler);
  153. chip.irq_bus_sync_unlock(irq_data).ok();
  154. }
  155. pub fn handler(&self) -> Option<&'static dyn IrqFlowHandler> {
  156. let guard = self.handler.read_irqsave();
  157. *guard
  158. }
  159. pub fn inner(&self) -> SpinLockGuard<InnerIrqDesc> {
  160. self.inner.lock_irqsave()
  161. }
  162. pub fn actions(&self) -> Vec<Arc<IrqAction>> {
  163. self.inner().actions.clone()
  164. }
  165. /// 对中断请求过程加锁
  166. pub fn request_mutex_lock(&self) -> MutexGuard<()> {
  167. self.request_mutex.lock()
  168. }
  169. pub fn irq(&self) -> IrqNumber {
  170. self.inner().irq_data.irq()
  171. }
  172. pub fn hardware_irq(&self) -> HardwareIrqNumber {
  173. self.inner().irq_data.hardware_irq()
  174. }
  175. pub fn irq_data(&self) -> Arc<IrqData> {
  176. self.inner().irq_data.clone()
  177. }
  178. /// 标记当前irq描述符已经被添加到sysfs
  179. pub fn mark_in_sysfs(&self) {
  180. self.inner()
  181. .desc_internal_state
  182. .insert(IrqDescState::IRQS_SYSFS);
  183. }
  184. pub fn mark_not_in_sysfs(&self) {
  185. self.inner()
  186. .desc_internal_state
  187. .remove(IrqDescState::IRQS_SYSFS);
  188. }
  189. /// 判断当前描述符是否已经添加到了sysfs
  190. pub fn in_sysfs(&self) -> bool {
  191. self.inner()
  192. .desc_internal_state
  193. .contains(IrqDescState::IRQS_SYSFS)
  194. }
  195. pub fn name(&self) -> Option<String> {
  196. self.inner().name.clone()
  197. }
  198. pub fn can_request(&self) -> bool {
  199. self.inner().can_request()
  200. }
  201. #[allow(dead_code)]
  202. pub fn set_norequest(&self) {
  203. self.inner().set_norequest();
  204. }
  205. #[allow(dead_code)]
  206. pub fn clear_norequest(&self) {
  207. self.inner().clear_norequest();
  208. }
  209. pub fn nested_thread(&self) -> bool {
  210. self.inner().nested_thread()
  211. }
  212. /// 中断是否可以线程化
  213. pub fn can_thread(&self) -> bool {
  214. !self
  215. .inner()
  216. .line_status
  217. .contains(IrqLineStatus::IRQ_NOTHREAD)
  218. }
  219. pub fn chip_bus_lock(&self) {
  220. let irq_data = self.inner().irq_data.clone();
  221. irq_data
  222. .chip_info_read_irqsave()
  223. .chip()
  224. .irq_bus_lock(&irq_data)
  225. .ok();
  226. }
  227. /// 同步释放低速总线锁
  228. ///
  229. /// ## 锁
  230. ///
  231. /// 进入此函数时,必须持有低速总线锁,并且desc的inner锁和irqdata的inner锁
  232. /// 必须已经释放。否则将死锁。
  233. pub fn chip_bus_sync_unlock(&self) {
  234. let irq_data = self.inner().irq_data.clone();
  235. irq_data
  236. .chip_info_write_irqsave()
  237. .chip()
  238. .irq_bus_sync_unlock(&irq_data)
  239. .ok();
  240. }
  241. pub fn set_percpu_devid_flags(&self) {
  242. self.modify_status(
  243. IrqLineStatus::empty(),
  244. IrqLineStatus::IRQ_NOAUTOEN
  245. | IrqLineStatus::IRQ_PER_CPU
  246. | IrqLineStatus::IRQ_NOTHREAD
  247. | IrqLineStatus::IRQ_NOPROBE
  248. | IrqLineStatus::IRQ_PER_CPU_DEVID,
  249. );
  250. }
  251. pub fn modify_status(&self, clear: IrqLineStatus, set: IrqLineStatus) {
  252. let mut desc_guard = self.inner();
  253. desc_guard.line_status.remove(clear);
  254. desc_guard.line_status.insert(set);
  255. let mut trigger = desc_guard.common_data().trigger_type();
  256. desc_guard.common_data().clear_status(
  257. IrqStatus::IRQD_NO_BALANCING
  258. | IrqStatus::IRQD_PER_CPU
  259. | IrqStatus::IRQD_TRIGGER_MASK
  260. | IrqStatus::IRQD_LEVEL
  261. | IrqStatus::IRQD_MOVE_PCNTXT,
  262. );
  263. if desc_guard
  264. .line_status
  265. .contains(IrqLineStatus::IRQ_NO_BALANCING)
  266. {
  267. desc_guard
  268. .common_data()
  269. .insert_status(IrqStatus::IRQD_NO_BALANCING);
  270. }
  271. if desc_guard.line_status.contains(IrqLineStatus::IRQ_PER_CPU) {
  272. desc_guard
  273. .common_data()
  274. .insert_status(IrqStatus::IRQD_PER_CPU);
  275. }
  276. if desc_guard
  277. .line_status
  278. .contains(IrqLineStatus::IRQ_MOVE_PCNTXT)
  279. {
  280. desc_guard
  281. .common_data()
  282. .insert_status(IrqStatus::IRQD_MOVE_PCNTXT);
  283. }
  284. if desc_guard.line_status.is_level_type() {
  285. desc_guard
  286. .common_data()
  287. .insert_status(IrqStatus::IRQD_LEVEL);
  288. }
  289. let tmp = desc_guard.line_status.trigger_type();
  290. if tmp != IrqLineStatus::IRQ_TYPE_NONE {
  291. trigger = tmp;
  292. }
  293. desc_guard.common_data().set_trigger_type(trigger);
  294. }
  295. }
  296. #[allow(dead_code)]
  297. #[derive(Debug)]
  298. pub struct InnerIrqDesc {
  299. /// per irq and chip data passed down to chip functions
  300. common_data: Arc<IrqCommonData>,
  301. irq_data: Arc<IrqData>,
  302. actions: Vec<Arc<IrqAction>>,
  303. name: Option<String>,
  304. parent_irq: Option<IrqNumber>,
  305. /// nested irq disables
  306. depth: u32,
  307. /// nested wake enables
  308. wake_depth: u32,
  309. desc_internal_state: IrqDescState,
  310. /// 中断线的状态
  311. line_status: IrqLineStatus,
  312. kern_inode: Option<Arc<KernFSInode>>,
  313. kset: Option<Arc<KSet>>,
  314. parent_kobj: Option<Weak<dyn KObject>>,
  315. /// per-cpu enabled mask
  316. percpu_enabled: Option<CpuMask>,
  317. /// per-cpu affinity
  318. percpu_affinity: Option<CpuMask>,
  319. // wait_for_threads: EventWaitQueue
  320. }
  321. impl InnerIrqDesc {
  322. pub fn name(&self) -> Option<&String> {
  323. self.name.as_ref()
  324. }
  325. #[allow(dead_code)]
  326. pub fn set_name(&mut self, name: Option<String>) {
  327. self.name = name;
  328. }
  329. pub fn can_request(&self) -> bool {
  330. !self.line_status.contains(IrqLineStatus::IRQ_NOREQUEST)
  331. }
  332. #[allow(dead_code)]
  333. pub fn set_norequest(&mut self) {
  334. self.line_status.insert(IrqLineStatus::IRQ_NOREQUEST);
  335. }
  336. #[allow(dead_code)]
  337. pub fn clear_norequest(&mut self) {
  338. self.line_status.remove(IrqLineStatus::IRQ_NOREQUEST);
  339. }
  340. #[allow(dead_code)]
  341. pub fn set_noprobe(&mut self) {
  342. self.line_status.insert(IrqLineStatus::IRQ_NOPROBE);
  343. }
  344. #[allow(dead_code)]
  345. pub fn clear_noprobe(&mut self) {
  346. self.line_status.remove(IrqLineStatus::IRQ_NOPROBE);
  347. }
  348. pub fn set_nothread(&mut self) {
  349. self.line_status.insert(IrqLineStatus::IRQ_NOTHREAD);
  350. }
  351. pub fn clear_nothread(&mut self) {
  352. self.line_status.remove(IrqLineStatus::IRQ_NOTHREAD);
  353. }
  354. pub fn nested_thread(&self) -> bool {
  355. self.line_status.contains(IrqLineStatus::IRQ_NESTED_THREAD)
  356. }
  357. pub fn line_status_set_per_cpu(&mut self) {
  358. self.line_status.insert(IrqLineStatus::IRQ_PER_CPU);
  359. }
  360. #[allow(dead_code)]
  361. pub fn line_status_clear_per_cpu(&mut self) {
  362. self.line_status.remove(IrqLineStatus::IRQ_PER_CPU);
  363. }
  364. #[allow(dead_code)]
  365. pub fn line_status(&self) -> &IrqLineStatus {
  366. &self.line_status
  367. }
  368. pub fn line_status_set_no_debug(&mut self) {
  369. self.line_status.insert(IrqLineStatus::IRQ_NO_BALANCING);
  370. }
  371. #[allow(dead_code)]
  372. pub fn line_status_clear_no_debug(&mut self) {
  373. self.line_status.remove(IrqLineStatus::IRQ_NO_BALANCING);
  374. }
  375. pub fn can_autoenable(&self) -> bool {
  376. !self.line_status.contains(IrqLineStatus::IRQ_NOAUTOEN)
  377. }
  378. pub fn can_thread(&self) -> bool {
  379. !self.line_status.contains(IrqLineStatus::IRQ_NOTHREAD)
  380. }
  381. /// 中断是否可以设置CPU亲和性
  382. pub fn can_set_affinity(&self) -> bool {
  383. if !self.common_data.status().can_balance()
  384. || !self
  385. .irq_data()
  386. .chip_info_read_irqsave()
  387. .chip()
  388. .can_set_affinity()
  389. {
  390. return false;
  391. }
  392. return true;
  393. }
  394. pub fn actions(&self) -> &Vec<Arc<IrqAction>> {
  395. &self.actions
  396. }
  397. pub fn add_action(&mut self, action: Arc<IrqAction>) {
  398. self.actions.push(action);
  399. }
  400. pub fn clear_actions(&mut self) {
  401. self.actions.clear();
  402. }
  403. pub fn remove_action(&mut self, action: &Arc<IrqAction>) {
  404. self.actions.retain(|a| !Arc::ptr_eq(a, action));
  405. }
  406. pub fn internal_state(&self) -> &IrqDescState {
  407. &self.desc_internal_state
  408. }
  409. pub(super) fn internal_state_mut(&mut self) -> &mut IrqDescState {
  410. &mut self.desc_internal_state
  411. }
  412. pub fn irq_data(&self) -> &Arc<IrqData> {
  413. &self.irq_data
  414. }
  415. pub fn common_data(&self) -> &Arc<IrqCommonData> {
  416. &self.common_data
  417. }
  418. pub fn depth(&self) -> u32 {
  419. self.depth
  420. }
  421. pub fn wake_depth(&self) -> u32 {
  422. self.wake_depth
  423. }
  424. pub fn set_depth(&mut self, depth: u32) {
  425. self.depth = depth;
  426. }
  427. pub fn set_trigger_type(&mut self, trigger: IrqLineStatus) {
  428. self.line_status.remove(IrqLineStatus::IRQ_TYPE_SENSE_MASK);
  429. self.line_status
  430. .insert(trigger & IrqLineStatus::IRQ_TYPE_SENSE_MASK);
  431. }
  432. pub fn clear_level(&mut self) {
  433. self.line_status.remove(IrqLineStatus::IRQ_LEVEL);
  434. }
  435. pub fn set_level(&mut self) {
  436. self.line_status.insert(IrqLineStatus::IRQ_LEVEL);
  437. }
  438. pub fn percpu_enabled(&self) -> &Option<CpuMask> {
  439. &self.percpu_enabled
  440. }
  441. pub fn percpu_enabled_mut(&mut self) -> &mut Option<CpuMask> {
  442. &mut self.percpu_enabled
  443. }
  444. pub fn percpu_affinity(&self) -> &Option<CpuMask> {
  445. &self.percpu_affinity
  446. }
  447. pub fn percpu_affinity_mut(&mut self) -> &mut Option<CpuMask> {
  448. &mut self.percpu_affinity
  449. }
  450. }
  451. impl KObject for IrqDesc {
  452. fn as_any_ref(&self) -> &dyn Any {
  453. self
  454. }
  455. fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
  456. self.inner().kern_inode = inode;
  457. }
  458. fn inode(&self) -> Option<Arc<KernFSInode>> {
  459. self.inner().kern_inode.clone()
  460. }
  461. fn parent(&self) -> Option<Weak<dyn KObject>> {
  462. self.inner().parent_kobj.clone()
  463. }
  464. fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
  465. self.inner().parent_kobj = parent;
  466. }
  467. fn kset(&self) -> Option<Arc<KSet>> {
  468. self.inner().kset.clone()
  469. }
  470. fn set_kset(&self, kset: Option<Arc<KSet>>) {
  471. self.inner().kset = kset;
  472. }
  473. fn kobj_type(&self) -> Option<&'static dyn KObjType> {
  474. Some(&IrqKObjType)
  475. }
  476. fn set_kobj_type(&self, _ktype: Option<&'static dyn KObjType>) {}
  477. fn name(&self) -> String {
  478. self.inner().irq_data.irq().data().to_string()
  479. }
  480. fn set_name(&self, _name: String) {}
  481. fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
  482. self.kobj_state.read()
  483. }
  484. fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
  485. self.kobj_state.write()
  486. }
  487. fn set_kobj_state(&self, state: KObjectState) {
  488. *self.kobj_state_mut() = state;
  489. }
  490. }
  491. bitflags! {
  492. /// Bit masks for desc->desc_internal_state
  493. pub struct IrqDescState: u32 {
  494. /// autodetection in progress
  495. const IRQS_AUTODETECT = 0x00000001;
  496. /// was disabled due to spurious interrupt detection
  497. const IRQS_SPURIOUS_DISABLED = 0x00000002;
  498. /// polling in progress
  499. const IRQS_POLL_INPROGRESS = 0x00000008;
  500. /// irq is not unmasked in primary handler
  501. const IRQS_ONESHOT = 0x00000020;
  502. /// irq is replayed
  503. const IRQS_REPLAY = 0x00000040;
  504. /// irq is waiting
  505. const IRQS_WAITING = 0x00000080;
  506. /// irq is pending and replayed later
  507. const IRQS_PENDING = 0x00000200;
  508. /// irq is suspended
  509. const IRQS_SUSPENDED = 0x00000800;
  510. /// irq line is used to deliver NMIs
  511. const IRQS_NMI = 0x00002000;
  512. /// descriptor has been added to sysfs
  513. const IRQS_SYSFS = 0x00004000;
  514. }
  515. }
  516. /// 每个中断的响应动作的描述符
  517. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/interrupt.h#118
  518. #[allow(dead_code)]
  519. #[derive(Debug)]
  520. pub struct IrqAction {
  521. inner: SpinLock<InnerIrqAction>,
  522. /// 用于等待线程被创建的完成量
  523. thread_completion: Completion,
  524. }
  525. impl IrqAction {
  526. #[allow(dead_code)]
  527. pub fn new(
  528. irq: IrqNumber,
  529. name: String,
  530. handler: Option<&'static dyn IrqHandler>,
  531. thread_fn: Option<&'static dyn IrqHandler>,
  532. ) -> Arc<Self> {
  533. let action: IrqAction = IrqAction {
  534. inner: SpinLock::new(InnerIrqAction {
  535. dev_id: None,
  536. per_cpu_dev_id: None,
  537. handler,
  538. thread_fn,
  539. thread: None,
  540. secondary: None,
  541. irq,
  542. flags: IrqHandleFlags::empty(),
  543. name,
  544. thread_flags: ThreadedHandlerFlags::empty(),
  545. }),
  546. thread_completion: Completion::new(),
  547. };
  548. return Arc::new(action);
  549. }
  550. pub fn inner(&self) -> SpinLockGuard<InnerIrqAction> {
  551. self.inner.lock_irqsave()
  552. }
  553. pub fn thread_completion(&self) -> &Completion {
  554. &self.thread_completion
  555. }
  556. }
  557. #[allow(dead_code)]
  558. #[derive(Debug)]
  559. pub struct InnerIrqAction {
  560. /// cookie to identify the device
  561. dev_id: Option<Arc<DeviceId>>,
  562. /// cookie to identify the device (per cpu)
  563. per_cpu_dev_id: Option<PerCpuVar<Arc<DeviceId>>>,
  564. /// 中断处理程序
  565. handler: Option<&'static dyn IrqHandler>,
  566. /// interrupt handler function for threaded interrupts
  567. thread_fn: Option<&'static dyn IrqHandler>,
  568. /// thread pointer for threaded interrupts
  569. thread: Option<Arc<ProcessControlBlock>>,
  570. /// pointer to secondary irqaction (force threading)
  571. secondary: Option<Arc<IrqAction>>,
  572. /// 中断号
  573. irq: IrqNumber,
  574. flags: IrqHandleFlags,
  575. /// 中断线程的标志
  576. thread_flags: ThreadedHandlerFlags,
  577. /// name of the device
  578. name: String,
  579. }
  580. impl InnerIrqAction {
  581. pub fn dev_id(&self) -> &Option<Arc<DeviceId>> {
  582. &self.dev_id
  583. }
  584. pub fn dev_id_mut(&mut self) -> &mut Option<Arc<DeviceId>> {
  585. &mut self.dev_id
  586. }
  587. pub fn per_cpu_dev_id(&self) -> Option<&Arc<DeviceId>> {
  588. self.per_cpu_dev_id.as_ref().map(|v| v.get())
  589. }
  590. #[allow(dead_code)]
  591. pub fn per_cpu_dev_id_mut(&mut self) -> Option<&mut Arc<DeviceId>> {
  592. self.per_cpu_dev_id.as_mut().map(|v| v.get_mut())
  593. }
  594. pub fn handler(&self) -> Option<&'static dyn IrqHandler> {
  595. self.handler
  596. }
  597. pub fn set_handler(&mut self, handler: Option<&'static dyn IrqHandler>) {
  598. self.handler = handler;
  599. }
  600. pub fn thread_fn(&self) -> Option<&'static dyn IrqHandler> {
  601. self.thread_fn
  602. }
  603. pub fn thread(&self) -> Option<Arc<ProcessControlBlock>> {
  604. self.thread.clone()
  605. }
  606. pub fn set_thread(&mut self, thread: Option<Arc<ProcessControlBlock>>) {
  607. self.thread = thread;
  608. }
  609. #[allow(dead_code)]
  610. pub fn thread_flags(&self) -> &ThreadedHandlerFlags {
  611. &self.thread_flags
  612. }
  613. pub fn thread_flags_mut(&mut self) -> &mut ThreadedHandlerFlags {
  614. &mut self.thread_flags
  615. }
  616. pub fn secondary(&self) -> Option<Arc<IrqAction>> {
  617. self.secondary.clone()
  618. }
  619. #[allow(dead_code)]
  620. pub fn irq(&self) -> IrqNumber {
  621. self.irq
  622. }
  623. #[allow(dead_code)]
  624. pub fn set_irq(&mut self, irq: IrqNumber) {
  625. self.irq = irq;
  626. }
  627. pub fn flags(&self) -> &IrqHandleFlags {
  628. &self.flags
  629. }
  630. pub fn flags_mut(&mut self) -> &mut IrqHandleFlags {
  631. &mut self.flags
  632. }
  633. pub fn name(&self) -> &String {
  634. &self.name
  635. }
  636. }
  637. bitflags! {
  638. /// 这些标志由线程处理程序使用
  639. pub struct ThreadedHandlerFlags: u32 {
  640. /// IRQTF_RUNTHREAD - 表示应运行中断处理程序线程
  641. const IRQTF_RUNTHREAD = 1 << 0;
  642. /// IRQTF_WARNED - 已打印警告 "IRQ_WAKE_THREAD w/o thread_fn"
  643. const IRQTF_WARNED = 1 << 1;
  644. /// IRQTF_AFFINITY - 请求irq线程调整亲和性
  645. const IRQTF_AFFINITY = 1 << 2;
  646. /// IRQTF_FORCED_THREAD - irq操作被强制线程化
  647. const IRQTF_FORCED_THREAD = 1 << 3;
  648. /// IRQTF_READY - 表示irq线程已准备就绪
  649. const IRQTF_READY = 1 << 4;
  650. }
  651. }
  652. /// Implements the `ThreadedHandlerFlags` structure.
  653. impl ThreadedHandlerFlags {
  654. /// 在 `ThreadedHandlerFlags` 结构中测试并设置特定的位。
  655. ///
  656. /// # 参数
  657. ///
  658. /// * `bit` - 要测试并设置的位。
  659. ///
  660. /// # 返回
  661. ///
  662. /// 如果操作前该位已被设置,则返回 `true`,否则返回 `false`。
  663. pub fn test_and_set_bit(&mut self, bit: ThreadedHandlerFlags) -> bool {
  664. let res = (self.bits & bit.bits) != 0;
  665. self.bits |= bit.bits;
  666. return res;
  667. }
  668. }
  669. // 定义IrqFlags位标志
  670. bitflags! {
  671. /// 这些标志仅由内核在中断处理例程中使用。
  672. #[allow(clippy::bad_bit_mask)]
  673. pub struct IrqHandleFlags: u32 {
  674. const IRQF_TRIGGER_NONE = IrqLineStatus::IRQ_TYPE_NONE.bits();
  675. const IRQF_TRIGGER_RISING = IrqLineStatus::IRQ_TYPE_EDGE_RISING.bits();
  676. const IRQF_TRIGGER_FALLING = IrqLineStatus::IRQ_TYPE_EDGE_FALLING.bits();
  677. const IRQF_TRIGGER_HIGH = IrqLineStatus::IRQ_TYPE_LEVEL_HIGH.bits();
  678. const IRQF_TRIGGER_LOW = IrqLineStatus::IRQ_TYPE_LEVEL_LOW.bits();
  679. const IRQF_TRIGGER_MASK = Self::IRQF_TRIGGER_HIGH.bits | Self::IRQF_TRIGGER_LOW.bits | Self::IRQF_TRIGGER_RISING.bits | Self::IRQF_TRIGGER_FALLING.bits;
  680. /// IRQF_SHARED - 允许多个设备共享中断
  681. const IRQF_SHARED = 0x00000080;
  682. /// IRQF_PROBE_SHARED - 当预期出现共享不匹配时,由调用者设置
  683. const IRQF_PROBE_SHARED = 0x00000100;
  684. /// IRQF_TIMER - 标记此中断为定时器中断
  685. const __IRQF_TIMER = 0x00000200;
  686. /// IRQF_PERCPU - 中断是每个CPU的
  687. const IRQF_PERCPU = 0x00000400;
  688. /// IRQF_NOBALANCING - 将此中断从中断平衡中排除
  689. const IRQF_NOBALANCING = 0x00000800;
  690. /// IRQF_IRQPOLL - 中断用于轮询(出于性能原因,只有在共享中断中首次注册的中断会被考虑)
  691. const IRQF_IRQPOLL = 0x00001000;
  692. /// IRQF_ONESHOT - 在硬中断处理程序完成后,不会重新启用中断。由需要在运行线程处理程序之前保持中断线路禁用的线程中断使用。
  693. const IRQF_ONESHOT = 0x00002000;
  694. /// IRQF_NO_SUSPEND - 在挂起期间不禁用此IRQ。不能保证此中断会从挂起状态唤醒系统。
  695. const IRQF_NO_SUSPEND = 0x00004000;
  696. /// IRQF_FORCE_RESUME - 即使设置了IRQF_NO_SUSPEND,也强制在恢复时启用它
  697. const IRQF_FORCE_RESUME = 0x00008000;
  698. /// IRQF_NO_THREAD - 中断不能被线程化
  699. const IRQF_NO_THREAD = 0x00010000;
  700. /// IRQF_EARLY_RESUME - 在syscore而不是在设备恢复时间早期恢复IRQ。
  701. const IRQF_EARLY_RESUME = 0x00020000;
  702. /// IRQF_COND_SUSPEND - 如果IRQ与NO_SUSPEND用户共享,则在挂起中断后执行此中断处理程序。对于系统唤醒设备用户,需要在他们的中断处理程序中实现唤醒检测。
  703. const IRQF_COND_SUSPEND = 0x00040000;
  704. /// IRQF_NO_AUTOEN - 当用户请求时,不会自动启用IRQ或NMI。用户稍后会通过enable_irq()或enable_nmi()显式启用它。
  705. const IRQF_NO_AUTOEN = 0x00080000;
  706. /// IRQF_NO_DEBUG - 从IPI和类似处理程序的逃逸检测中排除,取决于IRQF_PERCPU。
  707. const IRQF_NO_DEBUG = 0x00100000;
  708. const IRQF_TIMER = Self::__IRQF_TIMER.bits | Self::IRQF_NO_SUSPEND.bits | Self::IRQF_NO_THREAD.bits;
  709. }
  710. }
  711. impl IrqHandleFlags {
  712. /// 检查是否指定了触发类型
  713. #[inline(always)]
  714. pub fn trigger_type_specified(&self) -> bool {
  715. (self.bits & Self::IRQF_TRIGGER_MASK.bits) != 0
  716. }
  717. /// 插入触发类型
  718. pub fn insert_trigger_type(&mut self, trigger: IrqLineStatus) {
  719. self.bits |= trigger.trigger_bits() & IrqHandleFlags::IRQF_TRIGGER_MASK.bits;
  720. }
  721. #[allow(dead_code)]
  722. pub fn remove_trigger_type(&mut self, trigger: IrqLineStatus) {
  723. self.bits &= !(trigger.trigger_bits() & IrqHandleFlags::IRQF_TRIGGER_MASK.bits);
  724. }
  725. pub fn trigger_type(&self) -> IrqLineStatus {
  726. IrqLineStatus::from_bits_truncate(self.bits & IrqHandleFlags::IRQF_TRIGGER_MASK.bits)
  727. }
  728. }
  729. #[inline(never)]
  730. pub(super) fn early_irq_init() -> Result<(), SystemError> {
  731. let irqcnt = CurrentIrqArch::probe_total_irq_num();
  732. let mut manager = IrqDescManager::new();
  733. for i in 0..irqcnt {
  734. let irq_desc = IrqDesc::new(IrqNumber::new(i), None, IrqStatus::empty());
  735. manager.insert(IrqNumber::new(i), irq_desc);
  736. }
  737. unsafe {
  738. IRQ_DESC_MANAGER = Some(manager);
  739. }
  740. return CurrentIrqArch::arch_early_irq_init();
  741. }
  742. static mut IRQ_DESC_MANAGER: Option<IrqDescManager> = None;
  743. /// 获取中断描述符管理器的引用
  744. #[inline(always)]
  745. pub fn irq_desc_manager() -> &'static IrqDescManager {
  746. return unsafe { IRQ_DESC_MANAGER.as_ref().unwrap() };
  747. }
  748. pub struct IrqDescManager {
  749. irq_descs: BTreeMap<IrqNumber, Arc<IrqDesc>>,
  750. }
  751. impl IrqDescManager {
  752. fn new() -> Self {
  753. IrqDescManager {
  754. irq_descs: BTreeMap::new(),
  755. }
  756. }
  757. /// 查找中断描述符
  758. pub fn lookup(&self, irq: IrqNumber) -> Option<Arc<IrqDesc>> {
  759. self.irq_descs.get(&irq).cloned()
  760. }
  761. /// 查找中断描述符并锁定总线(没有对irqdesc进行加锁)
  762. #[allow(dead_code)]
  763. pub fn lookup_and_lock_bus(
  764. &self,
  765. irq: IrqNumber,
  766. check_global: bool,
  767. check_percpu: bool,
  768. ) -> Option<Arc<IrqDesc>> {
  769. self.do_lookup_and_lock(irq, true, check_global, check_percpu)
  770. }
  771. fn do_lookup_and_lock(
  772. &self,
  773. irq: IrqNumber,
  774. lock_bus: bool,
  775. check_global: bool,
  776. check_percpu: bool,
  777. ) -> Option<Arc<IrqDesc>> {
  778. let desc = self.lookup(irq)?;
  779. if check_global || check_percpu {
  780. if check_percpu && !desc.inner().line_status().is_per_cpu_devid() {
  781. return None;
  782. }
  783. if check_global && desc.inner().line_status().is_per_cpu_devid() {
  784. return None;
  785. }
  786. }
  787. if lock_bus {
  788. desc.chip_bus_lock();
  789. }
  790. return Some(desc);
  791. }
  792. fn insert(&mut self, irq: IrqNumber, desc: Arc<IrqDesc>) {
  793. self.irq_descs.insert(irq, desc);
  794. }
  795. /// 释放中断描述符
  796. #[allow(dead_code)]
  797. fn free_desc(&mut self, irq: IrqNumber) {
  798. if let Some(desc) = self.irq_descs.get(&irq) {
  799. irq_sysfs_del(desc);
  800. self.irq_descs.remove(&irq);
  801. }
  802. }
  803. /// 迭代中断描述符
  804. pub fn iter_descs(&self) -> btree_map::Iter<'_, IrqNumber, Arc<IrqDesc>> {
  805. self.irq_descs.iter()
  806. }
  807. /// 设置指定irq的可用cpu为所有cpu
  808. pub fn set_percpu_devid_all(&self, irq: IrqNumber) -> Result<(), SystemError> {
  809. self.set_percpu_devid(irq, None)
  810. }
  811. /// 设置指定irq的可用cpu
  812. ///
  813. /// 如果affinity为None,则表示设置为所有cpu
  814. pub fn set_percpu_devid(
  815. &self,
  816. irq: IrqNumber,
  817. affinity: Option<&CpuMask>,
  818. ) -> Result<(), SystemError> {
  819. let desc = self.lookup(irq).ok_or(SystemError::EINVAL)?;
  820. let mut desc_inner = desc.inner();
  821. if desc_inner.percpu_enabled().is_some() {
  822. return Err(SystemError::EINVAL);
  823. }
  824. *desc_inner.percpu_enabled_mut() = Some(CpuMask::new());
  825. if let Some(affinity) = affinity {
  826. desc_inner.percpu_affinity_mut().replace(affinity.clone());
  827. } else {
  828. desc_inner
  829. .percpu_affinity_mut()
  830. .replace(smp_cpu_manager().possible_cpus().clone());
  831. }
  832. drop(desc_inner);
  833. desc.set_percpu_devid_flags();
  834. return Ok(());
  835. }
  836. }
  837. pub struct GenericIrqHandler;
  838. #[allow(dead_code)]
  839. impl GenericIrqHandler {
  840. /// `handle_domain_irq` - 调用属于某个中断域的硬件中断的处理程序
  841. ///
  842. /// # 参数
  843. ///
  844. /// * `domain`: 执行查找的域
  845. /// * `hwirq`: 要转换为逻辑中断的硬件中断号
  846. ///
  847. /// # 返回
  848. ///
  849. /// 成功时返回 `Ok(())`,如果转换失败则返回 `Err(SystemError)`
  850. ///
  851. /// 此函数必须在初始化了中断寄存器的中断上下文中调用
  852. ///
  853. /// 参考 https://code.dragonos.org.cn/xref/linux-6.6.21/kernel/irq/irqdesc.c?fi=generic_handle_domain_irq#726
  854. pub fn handle_domain_irq(
  855. domain: Arc<IrqDomain>,
  856. hwirq: HardwareIrqNumber,
  857. trap_frame: &mut TrapFrame,
  858. ) -> Result<(), SystemError> {
  859. let (irq_desc, _) =
  860. irq_domain_manager().resolve_irq_mapping(Some(domain.clone()), hwirq)?;
  861. irq_desc.handler().unwrap().handle(&irq_desc, trap_frame);
  862. return Ok(());
  863. }
  864. }