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 之外的控制器(即在晶片組中)。這些控制器(換句話說,IRQ 晶片)以層次結構連結在一起,並且有兩種層次結構模型(傳統模型和擴充套件模型)。

3.1. 傳統 IRQ 模型

在此模型中,IPI(處理器間中斷)和 CPU 本地定時器中斷直接進入 CPUINTC,CPU UARTS 中斷進入 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 UARTS 中斷進入 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 UARTS 中斷進入 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 選擇的八位和用於 CPU IP(中斷引腳)選擇的四位。對於 CPU 選擇,有四位用於 EIOINTC 節點選擇,四位用於 EIOINTC CPU 選擇。CPU 選擇和 CPU IP 選擇都使用點陣圖方法,因此中斷只能路由到 CPU0 - CPU3 和一個 EIOINTC 節點中的 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 UARTS 中斷進入 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 是“傳統 I/O 中斷”,詳見《龍芯 3A5000 處理器參考手冊》第 11.1 節;

  • EIOINTC 是“擴充套件 I/O 中斷”,詳見《龍芯 3A5000 處理器參考手冊》第 11.2 節;

  • HTVECINTC 是“HyperTransport 中斷”,詳見《龍芯 3A5000 處理器參考手冊》第 14.3 節;

  • PCH-PIC/PCH-MSI 是“中斷控制器”,詳見《龍芯 7A1000 橋使用者手冊》第 5 節;

  • PCH-LPC 是“LPC 中斷”,詳見《龍芯 7A1000 橋使用者手冊》第 24.3 節。