dummychip.rs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. use alloc::sync::Arc;
  2. use system_error::SystemError;
  3. use crate::arch::CurrentIrqArch;
  4. use super::{
  5. irqchip::{IrqChip, IrqChipFlags},
  6. irqdata::IrqData,
  7. InterruptArch,
  8. };
  9. static mut NO_IRQ_CHIP: Option<Arc<NoIrqChip>> = None;
  10. static mut DUMMY_IRQ_CHIP: Option<Arc<DummyIrqChip>> = None;
  11. #[inline(never)]
  12. pub fn no_irq_chip() -> Arc<dyn IrqChip> {
  13. unsafe { NO_IRQ_CHIP.as_ref().unwrap().clone() }
  14. }
  15. #[allow(dead_code)]
  16. #[inline(never)]
  17. pub fn dummy_irq_chip() -> Arc<dyn IrqChip> {
  18. unsafe { DUMMY_IRQ_CHIP.as_ref().unwrap().clone() }
  19. }
  20. fn ack_bad(irq_data: &Arc<IrqData>) {
  21. // todo: print_irq_desc
  22. CurrentIrqArch::ack_bad_irq(irq_data.irq());
  23. }
  24. #[derive(Debug)]
  25. struct NoIrqChip;
  26. impl NoIrqChip {
  27. pub const fn new() -> Self {
  28. NoIrqChip
  29. }
  30. }
  31. impl IrqChip for NoIrqChip {
  32. fn name(&self) -> &'static str {
  33. "none"
  34. }
  35. fn can_mask_ack(&self) -> bool {
  36. false
  37. }
  38. fn irq_enable(&self, _irq: &Arc<IrqData>) -> Result<(), SystemError> {
  39. Ok(())
  40. }
  41. fn can_set_affinity(&self) -> bool {
  42. false
  43. }
  44. fn can_set_flow_type(&self) -> bool {
  45. false
  46. }
  47. fn irq_disable(&self, _irq: &Arc<IrqData>) {}
  48. fn irq_ack(&self, irq: &Arc<IrqData>) {
  49. ack_bad(irq);
  50. }
  51. fn irq_startup(&self, _irq: &Arc<IrqData>) -> Result<(), SystemError> {
  52. Ok(())
  53. }
  54. fn irq_shutdown(&self, _irq: &Arc<IrqData>) -> Result<(), SystemError> {
  55. Ok(())
  56. }
  57. fn flags(&self) -> IrqChipFlags {
  58. IrqChipFlags::IRQCHIP_SKIP_SET_WAKE
  59. }
  60. }
  61. #[derive(Debug)]
  62. struct DummyIrqChip;
  63. impl DummyIrqChip {
  64. pub const fn new() -> Self {
  65. DummyIrqChip
  66. }
  67. }
  68. impl IrqChip for DummyIrqChip {
  69. fn name(&self) -> &'static str {
  70. "dummy"
  71. }
  72. fn can_mask_ack(&self) -> bool {
  73. false
  74. }
  75. fn irq_enable(&self, _irq: &Arc<IrqData>) -> Result<(), SystemError> {
  76. Ok(())
  77. }
  78. fn can_set_flow_type(&self) -> bool {
  79. false
  80. }
  81. fn can_set_affinity(&self) -> bool {
  82. false
  83. }
  84. fn irq_disable(&self, _irq: &Arc<IrqData>) {}
  85. fn irq_ack(&self, _irq: &Arc<IrqData>) {}
  86. fn irq_startup(&self, _irq: &Arc<IrqData>) -> Result<(), SystemError> {
  87. Ok(())
  88. }
  89. fn irq_shutdown(&self, _irq: &Arc<IrqData>) -> Result<(), SystemError> {
  90. Ok(())
  91. }
  92. fn flags(&self) -> IrqChipFlags {
  93. IrqChipFlags::IRQCHIP_SKIP_SET_WAKE
  94. }
  95. }
  96. #[inline(never)]
  97. pub fn dummy_chip_init() {
  98. unsafe {
  99. NO_IRQ_CHIP = Some(Arc::new(NoIrqChip::new()));
  100. DUMMY_IRQ_CHIP = Some(Arc::new(DummyIrqChip::new()));
  101. }
  102. }