【问题标题】:what is chained irq in linux, when are they need to used?什么是 linux 中的链式 irq,什么时候需要使用它们?
【发布时间】:2015-12-20 04:02:58
【问题描述】:

什么是链式 IRQ? chained_irq_enterchained_irq_exit 做了什么,因为在出​​现中断后,IRQ 线被禁用,但 chained_irq_enter 正在调用与屏蔽中断相关的函数。如果线路已经被禁用,为什么要屏蔽中断?

【问题讨论】:

  • 这是this问题的延续。
  • 下一部分是here

标签: linux linux-kernel embedded-linux interrupt-handling irq


【解决方案1】:

什么是链式中断?

在父(中断控制器)设备的 IRQ 处理程序中,有两种方法可以为子设备调用中断处理程序。

  1. 链式中断:

    • “链式”表示这些中断只是函数调用链(例如,SoC 的 GPIO 模块中断处理程序是从 GIC 中断处理程序中调用的,就像函数调用一样)
    • generic_handle_irq() 用于中断链接
    • 子 IRQ 处理程序在父硬件 IRQ 处理程序内被调用
    • 您不能调用可能在链式(子)中断处理程序中休眠的函数,因为它们仍处于原子上下文(硬件中断)
    • 这种方法通常用于 SoC 内部 GPIO 模块的驱动程序
  2. 嵌套中断

    • “嵌套”表示这些中断可以被另一个中断中断;但它们并不是真正的硬件 IRQ,而是线程 IRQ
    • handle_nested_irq() 用于创建嵌套中断
    • 子 IRQ 处理程序在 handle_nested_irq() 函数创建的新 线程 内被调用;我们需要它们在进程上下文中运行,以便我们可以调用休眠总线函数(例如可能休眠的 I2C 函数)
    • 您可以调用可能在嵌套(子)中断处理程序中休眠的函数
    • 这种方法通常用于外部芯片的驱动程序,例如 GPIO 扩展器,因为它们通常通过 I2C 总线连接到 SoC,并且 I2C 函数可能会休眠

谈到上面讨论的驱动程序:

  • irq-gic 驱动程序使用CHAINED GPIO irqchips 方法来处理具有多个 GIC 的系统; thiscommit 添加了该功能
  • gpio-omap 驱动程序(如上所述)使用GENERIC CHAINED GPIO irqchips 方法。请参阅this 提交。它是从使用常规的CHAINED GPIO irqchips 转换而来的,因此在实时内核上它将是线程 IRQ 处理程序,但在非 RT 内核上它将是硬 IRQ 处理程序
  • 'gpio-max732x'驱动使用NESTED THREADED GPIO irqchips方法

chained_irq_enterchained_irq_exit 做了什么

这些函数实现硬件中断流控制,即通知中断控制器芯片何时屏蔽和取消屏蔽当前中断。

  1. 对于FastEOI 中断控制器(最现代的方式):

    • chained_irq_enter()什么都不做
    • chained_irq_exit()调用irq_eoi()回调告诉中断控制器中断处理完成
  2. 对于具有屏蔽/取消屏蔽/确认功能的中断控制器

    • chained_irq_enter() 屏蔽当前中断,并在设置了 ack 回调时确认它
    • chained_irq_exit() 取消屏蔽中断

因为在产生中断后,irq 线被禁用,但chained_irq_enter 正在调用与屏蔽中断相关的函数,如果该线已被禁用,为什么要屏蔽中断?

IRQ 线路被禁用。但是我们仍然需要在中断处理结束时写入 EOI 寄存器。或者为边缘级中断发送 ACK。

This 解释了为什么在中断处理程序中禁用中断。

【讨论】:

    【解决方案2】:

    阅读 Linux 内核文档以了解这些 API:

    https://www.kernel.org/doc/Documentation/gpio/driver.txt

    • CHAINED GPIO irqchips:这些通常是嵌入在 一个 SoC。这意味着有一个用于 GPIO 的快速 IRQ 处理程序 从父 IRQ 处理程序链中调用,最典型的是 系统中断控制器。这意味着 GPIO irqchip 已注册 使用 irq_set_chained_handler() 或相应的 gpiochip_set_chained_irqchip() 辅助函数和 GPIO irqchip 处理程序将立即从父 irqchip 调用,而 禁用 IRQ。然后 GPIO irqchip 将最终调用 在其中断处理程序中类似于以下序列:

      static irqreturn_t tc3589x_gpio_irq(int irq, void *data)
          chained_irq_enter(...);
          generic_handle_irq(...);
          chained_irq_exit(...);
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 2012-01-04
      相关资源
      最近更新 更多