3. LoongArch 的 IRQ 芯片模型(层级)

目前,基于 LoongArch 的处理器(例如 Loongson-3A5000)只能与 LS7A 芯片组配合工作。LoongArch 计算机中的 irq 芯片包括 CPUINTC(CPU 内核中断控制器)、LIOINTC(传统 I/O 中断控制器)、EIOINTC(扩展 I/O 中断控制器)、HTVECINTC(Hyper-Transport 向量中断控制器)、PCH-PIC(LS7A 芯片组中的主中断控制器)、PCH-LPC(LS7A 芯片组中的 LPC 中断控制器)和 PCH-MSI(MSI 中断控制器)。

CPUINTC 是每个核心一个的控制器(在 CPU 内部),LIOINTC/EIOINTC/HTVECINTC 是每个封装一个的控制器(在 CPU 内部),而 PCH-PIC/PCH-LPC/PCH-MSI 是 CPU 外部的控制器(即在芯片组中)。这些控制器(换句话说,irqchip)以层级结构链接,并且存在两种层级模型(传统模型和扩展模型)。

3.1. 传统 IRQ 模型

在此模型中,IPI(处理器间中断)和 CPU 本地定时器中断直接发送到 CPUINTC,CPU UART 中断发送到 LIOINTC,而所有其他设备的中断发送到 PCH-PIC/PCH-LPC/PCH-MSI 并由 HTVECINTC 收集,然后发送到 LIOINTC,最后到达 CPUINTC

+-----+     +---------+     +-------+
| IPI | --> | CPUINTC | <-- | Timer |
+-----+     +---------+     +-------+
                 ^
                 |
            +---------+     +-------+
            | LIOINTC | <-- | UARTs |
            +---------+     +-------+
                 ^
                 |
           +-----------+
           | HTVECINTC |
           +-----------+
            ^         ^
            |         |
      +---------+ +---------+
      | PCH-PIC | | PCH-MSI |
      +---------+ +---------+
        ^     ^           ^
        |     |           |
+---------+ +---------+ +---------+
| PCH-LPC | | Devices | | Devices |
+---------+ +---------+ +---------+
     ^
     |
+---------+
| Devices |
+---------+

3.2. 扩展 IRQ 模型

在此模型中,IPI(处理器间中断)和 CPU 本地定时器中断直接发送到 CPUINTC,CPU UART 中断发送到 LIOINTC,而所有其他设备的中断发送到 PCH-PIC/PCH-LPC/PCH-MSI 并由 EIOINTC 收集,然后直接发送到 CPUINTC

      +-----+     +---------+     +-------+
      | IPI | --> | CPUINTC | <-- | Timer |
      +-----+     +---------+     +-------+
                   ^       ^
                   |       |
            +---------+ +---------+     +-------+
            | EIOINTC | | LIOINTC | <-- | UARTs |
            +---------+ +---------+     +-------+
             ^       ^
             |       |
      +---------+ +---------+
      | PCH-PIC | | PCH-MSI |
      +---------+ +---------+
        ^     ^           ^
        |     |           |
+---------+ +---------+ +---------+
| PCH-LPC | | Devices | | Devices |
+---------+ +---------+ +---------+
     ^
     |
+---------+
| Devices |
+---------+

3.3. 虚拟扩展 IRQ 模型

在此模型中,IPI(处理器间中断)和 CPU 本地定时器中断直接发送到 CPUINTC,CPU UART 中断发送到 PCH-PIC,而所有其他设备的中断发送到 PCH-PIC/PCH-MSI 并由 V-EIOINTC(虚拟扩展 I/O 中断控制器)收集,然后直接发送到 CPUINTC

+-----+    +-------------------+     +-------+
| IPI |--> | CPUINTC(0-255vcpu)| <-- | Timer |
+-----+    +-------------------+     +-------+
                     ^
                     |
               +-----------+
               | V-EIOINTC |
               +-----------+
                ^         ^
                |         |
         +---------+ +---------+
         | PCH-PIC | | PCH-MSI |
         +---------+ +---------+
           ^      ^          ^
           |      |          |
    +--------+ +---------+ +---------+
    | UARTs  | | Devices | | Devices |
    +--------+ +---------+ +---------+

3.3.1. 描述

V-EIOINTC(虚拟扩展 I/O 中断控制器)是 EIOINTC 的扩展,它仅在运行于 KVM hypervisor 的虚拟机(VM)模式下工作。通过标准 EIOINTC,中断最多只能路由到四个 vCPU,而使用 V-EIOINTC,中断可以路由到多达 256 个虚拟 CPU。

使用标准 EIOINTC 时,中断路由设置包括两部分:用于 CPU 选择的 8 位和用于 CPU IP(中断引脚)选择的 4 位。对于 CPU 选择,有 4 位用于 EIOINTC 节点选择,4 位用于 EIOINTC CPU 选择。CPU 选择和 CPU IP 选择都使用位图(bitmap)方法,因此在单个 EIOINTC 节点中,中断只能路由到 CPU0 - CPU3 和 IP0 - IP3。

V-EIOINTC 支持路由更多的 CPU 和 CPU IP(中断引脚),并且 V-EIOINTC 新增了两个寄存器。

3.3.2. EXTIOI_VIRT_FEATURES

该寄存器是只读寄存器,用于指示 V-EIOINTC 支持的功能。新增了 EXTIOI_HAS_INT_ENCODE 和 EXTIOI_HAS_CPU_ENCODE 功能。

EXTIOI_HAS_INT_ENCODE 功能是标准 EIOINTC 的一部分。如果其值为 1,则表示 CPU 中断引脚选择可以采用普通方法而不是位图方法,因此中断可以路由到 IP0 - IP15。

EXTIOI_HAS_CPU_ENCODE 功能是 V-EIOINTC 的扩展。如果其值为 1,则表示 CPU 选择可以采用普通方法而不是位图方法,因此中断可以路由到 CPU0 - CPU255。

3.3.3. EXTIOI_VIRT_CONFIG

该寄存器是读写寄存器,为了兼容性,中断路由使用与标准 EIOINTC 相同的默认方法。如果该位被设置为 1,则指示硬件使用普通方法而不是位图方法。

3.4. 高级扩展 IRQ 模型

在此模型中,IPI(处理器间中断)和 CPU 本地定时器中断直接发送到 CPUINTC,CPU UART 中断发送到 LIOINTC,PCH-MSI 中断发送到 AVECINTC,然后直接发送到 CPUINTC,而所有其他设备的中断发送到 PCH-PIC/PCH-LPC 并由 EIOINTC 收集,然后直接发送到 CPUINTC

+-----+     +-----------------------+     +-------+
| IPI | --> |        CPUINTC        | <-- | Timer |
+-----+     +-----------------------+     +-------+
             ^          ^          ^
             |          |          |
      +---------+ +----------+ +---------+     +-------+
      | EIOINTC | | AVECINTC | | LIOINTC | <-- | UARTs |
      +---------+ +----------+ +---------+     +-------+
           ^            ^
           |            |
      +---------+  +---------+
      | PCH-PIC |  | PCH-MSI |
      +---------+  +---------+
        ^     ^           ^
        |     |           |
+---------+ +---------+ +---------+
| Devices | | PCH-LPC | | Devices |
+---------+ +---------+ +---------+
                 ^
                 |
            +---------+
            | Devices |
            +---------+

3.5. 高级扩展 IRQ 模型(带重定向)

在此模型中,IPI(处理器间中断)和 CPU 本地定时器中断直接发送到 CPUINTC,CPU UART 中断发送到 LIOINTC,PCH-MSI 中断发送到 REDIRECT 以将其重新映射到 AVECINTC,然后直接发送到 CPUINTC,而所有其他设备的中断发送到 PCH-PIC/PCH-LPC 并由 EIOINTC 收集,然后直接发送到 CPUINTC

+-----+     +-----------------------+     +-------+
| IPI | --> |        CPUINTC        | <-- | Timer |
+-----+     +-----------------------+     +-------+
             ^          ^          ^
             |          |          |
             |    +----------+     |
      +---------+ | AVECINTC | +---------+     +-------+
      | EIOINTC | +----------+ | LIOINTC | <-- | UARTs |
      +---------+ | REDIRECT | +---------+     +-------+
           ^      +----------+
           |            ^
           |            |
      +---------+  +---------+
      | PCH-PIC |  | PCH-MSI |
      +---------+  +---------+
        ^     ^           ^
        |     |           |
+---------+ +---------+ +---------+
| Devices | | PCH-LPC | | Devices |
+---------+ +---------+ +---------+
                 ^
                 |
            +---------+
            | Devices |
            +---------+

3.7. 参考文献

龙芯 3A5000 文档

龙芯 LS7A 芯片组文档

注意

  • CPUINTC 是“LoongArch 参考手册第 1 卷”第 7.4 节中所述的 CSR.ECFG/CSR.ESTAT 及其中断控制器;

  • LIOINTC 是“龙芯 3A5000 处理器参考手册”第 11.1 节中所述的“传统 I/O 中断”;

  • EIOINTC 是“龙芯 3A5000 处理器参考手册”第 11.2 节中所述的“扩展 I/O 中断”;

  • HTVECINTC 是“龙芯 3A5000 处理器参考手册”第 14.3 节中所述的“HyperTransport 中断”;

  • PCH-PIC/PCH-MSI 是“龙芯 7A1000 桥片用户手册”第 5 节中所述的“中断控制器”;

  • PCH-LPC 是“龙芯 7A1000 桥片用户手册”第 24.3 节中所述的“LPC 中断”。