3. 龙芯架构的 IRQ 芯片模型(层次结构)¶
目前,基于龙芯的处理器(例如龙芯3A5000)只能与LS7A芯片组协同工作。龙芯计算机中的 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 外部的控制器(即在芯片组中)。这些控制器(换句话说,是 irqchips)以层次结构链接,并且有两种层次结构模型(传统模型和扩展模型)。
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 虚拟机管理程序中运行的 VM 模式下工作。中断可以通过标准的 EIOINTC 路由到最多四个 vCPU,但使用 V-EIOINTC,中断可以路由到最多 256 个虚拟 CPU。
使用标准的 EIOINTC,中断路由设置包括两部分:用于 CPU 选择的 8 位和用于 CPU IP(中断引脚)选择的 4 位。对于 CPU 选择,有 4 位用于 EIOINTC 节点选择,4 位用于 EIOINTC CPU 选择。位图方法用于 CPU 选择和 CPU IP 选择,因此中断只能路由到一个 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,则表示 HW 使用正常方法而不是位图方法。
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.6. 参考资料¶
龙芯3A5000 的文档
龙芯 LS7A 芯片组的文档
注意
CPUINTC 是 CSR.ECFG/CSR.ESTAT 及其中断控制器,在《龙芯架构参考手册,卷1》的第 7.4 节中描述;
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 中断”。