257 lines
9.1 KiB
ReStructuredText
257 lines
9.1 KiB
ReStructuredText
|
.. SPDX-License-Identifier: GPL-2.0
|
||
|
|
||
|
=======================================
|
||
|
IRQ chip model (hierarchy) of LoongArch
|
||
|
=======================================
|
||
|
|
||
|
Currently, LoongArch based processors (e.g. Loongson-3A5000) can only work together
|
||
|
with LS7A chipsets. The irq chips in LoongArch computers include CPUINTC (CPU Core
|
||
|
Interrupt Controller), LIOINTC (Legacy I/O Interrupt Controller), EIOINTC (Extended
|
||
|
I/O Interrupt Controller), HTVECINTC (Hyper-Transport Vector Interrupt Controller),
|
||
|
PCH-PIC (Main Interrupt Controller in LS7A chipset), PCH-LPC (LPC Interrupt Controller
|
||
|
in LS7A chipset) and PCH-MSI (MSI Interrupt Controller).
|
||
|
|
||
|
CPUINTC is a per-core controller (in CPU), LIOINTC/EIOINTC/HTVECINTC are per-package
|
||
|
controllers (in CPU), while PCH-PIC/PCH-LPC/PCH-MSI are controllers out of CPU (i.e.,
|
||
|
in chipsets). These controllers (in other words, irqchips) are linked in a hierarchy,
|
||
|
and there are two models of hierarchy (legacy model and extended model).
|
||
|
|
||
|
Legacy IRQ model
|
||
|
================
|
||
|
|
||
|
In this model, IPI (Inter-Processor Interrupt) and CPU Local Timer interrupt go
|
||
|
to CPUINTC directly, CPU UARTS interrupts go to LIOINTC, while all other devices
|
||
|
interrupts go to PCH-PIC/PCH-LPC/PCH-MSI and gathered by HTVECINTC, and then go
|
||
|
to LIOINTC, and then CPUINTC::
|
||
|
|
||
|
+-----+ +---------+ +-------+
|
||
|
| IPI | --> | CPUINTC | <-- | Timer |
|
||
|
+-----+ +---------+ +-------+
|
||
|
^
|
||
|
|
|
||
|
+---------+ +-------+
|
||
|
| LIOINTC | <-- | UARTs |
|
||
|
+---------+ +-------+
|
||
|
^
|
||
|
|
|
||
|
+-----------+
|
||
|
| HTVECINTC |
|
||
|
+-----------+
|
||
|
^ ^
|
||
|
| |
|
||
|
+---------+ +---------+
|
||
|
| PCH-PIC | | PCH-MSI |
|
||
|
+---------+ +---------+
|
||
|
^ ^ ^
|
||
|
| | |
|
||
|
+---------+ +---------+ +---------+
|
||
|
| PCH-LPC | | Devices | | Devices |
|
||
|
+---------+ +---------+ +---------+
|
||
|
^
|
||
|
|
|
||
|
+---------+
|
||
|
| Devices |
|
||
|
+---------+
|
||
|
|
||
|
Extended IRQ model
|
||
|
==================
|
||
|
|
||
|
In this model, IPI (Inter-Processor Interrupt) and CPU Local Timer interrupt go
|
||
|
to CPUINTC directly, CPU UARTS interrupts go to LIOINTC, while all other devices
|
||
|
interrupts go to PCH-PIC/PCH-LPC/PCH-MSI and gathered by EIOINTC, and then go to
|
||
|
to CPUINTC directly::
|
||
|
|
||
|
+-----+ +---------+ +-------+
|
||
|
| IPI | --> | CPUINTC | <-- | Timer |
|
||
|
+-----+ +---------+ +-------+
|
||
|
^ ^
|
||
|
| |
|
||
|
+---------+ +---------+ +-------+
|
||
|
| EIOINTC | | LIOINTC | <-- | UARTs |
|
||
|
+---------+ +---------+ +-------+
|
||
|
^ ^
|
||
|
| |
|
||
|
+---------+ +---------+
|
||
|
| PCH-PIC | | PCH-MSI |
|
||
|
+---------+ +---------+
|
||
|
^ ^ ^
|
||
|
| | |
|
||
|
+---------+ +---------+ +---------+
|
||
|
| PCH-LPC | | Devices | | Devices |
|
||
|
+---------+ +---------+ +---------+
|
||
|
^
|
||
|
|
|
||
|
+---------+
|
||
|
| Devices |
|
||
|
+---------+
|
||
|
|
||
|
Virtual Extended IRQ model
|
||
|
==========================
|
||
|
|
||
|
In this model, IPI (Inter-Processor Interrupt) and CPU Local Timer interrupt
|
||
|
go to CPUINTC directly, CPU UARTS interrupts go to PCH-PIC, while all other
|
||
|
devices interrupts go to PCH-PIC/PCH-MSI and gathered by V-EIOINTC (Virtual
|
||
|
Extended I/O Interrupt Controller), and then go to CPUINTC directly::
|
||
|
|
||
|
+-----+ +-------------------+ +-------+
|
||
|
| IPI |--> | CPUINTC(0-255vcpu)| <-- | Timer |
|
||
|
+-----+ +-------------------+ +-------+
|
||
|
^
|
||
|
|
|
||
|
+-----------+
|
||
|
| V-EIOINTC |
|
||
|
+-----------+
|
||
|
^ ^
|
||
|
| |
|
||
|
+---------+ +---------+
|
||
|
| PCH-PIC | | PCH-MSI |
|
||
|
+---------+ +---------+
|
||
|
^ ^ ^
|
||
|
| | |
|
||
|
+--------+ +---------+ +---------+
|
||
|
| UARTs | | Devices | | Devices |
|
||
|
+--------+ +---------+ +---------+
|
||
|
|
||
|
|
||
|
Description
|
||
|
-----------
|
||
|
V-EIOINTC (Virtual Extended I/O Interrupt Controller) is an extension of
|
||
|
EIOINTC, it only works in VM mode which runs in KVM hypervisor. Interrupts can
|
||
|
be routed to up to four vCPUs via standard EIOINTC, however with V-EIOINTC
|
||
|
interrupts can be routed to up to 256 virtual cpus.
|
||
|
|
||
|
With standard EIOINTC, interrupt routing setting includes two parts: eight
|
||
|
bits for CPU selection and four bits for CPU IP (Interrupt Pin) selection.
|
||
|
For CPU selection there is four bits for EIOINTC node selection, four bits
|
||
|
for EIOINTC CPU selection. Bitmap method is used for CPU selection and
|
||
|
CPU IP selection, so interrupt can only route to CPU0 - CPU3 and IP0-IP3 in
|
||
|
one EIOINTC node.
|
||
|
|
||
|
With V-EIOINTC it supports to route more CPUs and CPU IP (Interrupt Pin),
|
||
|
there are two newly added registers with V-EIOINTC.
|
||
|
|
||
|
EXTIOI_VIRT_FEATURES
|
||
|
--------------------
|
||
|
This register is read-only register, which indicates supported features with
|
||
|
V-EIOINTC. Feature EXTIOI_HAS_INT_ENCODE and EXTIOI_HAS_CPU_ENCODE is added.
|
||
|
|
||
|
Feature EXTIOI_HAS_INT_ENCODE is part of standard EIOINTC. If it is 1, it
|
||
|
indicates that CPU Interrupt Pin selection can be normal method rather than
|
||
|
bitmap method, so interrupt can be routed to IP0 - IP15.
|
||
|
|
||
|
Feature EXTIOI_HAS_CPU_ENCODE is entension of V-EIOINTC. If it is 1, it
|
||
|
indicates that CPU selection can be normal method rather than bitmap method,
|
||
|
so interrupt can be routed to CPU0 - CPU255.
|
||
|
|
||
|
EXTIOI_VIRT_CONFIG
|
||
|
------------------
|
||
|
This register is read-write register, for compatibility intterupt routed uses
|
||
|
the default method which is the same with standard EIOINTC. If the bit is set
|
||
|
with 1, it indicated HW to use normal method rather than bitmap method.
|
||
|
|
||
|
Advanced Extended IRQ model
|
||
|
===========================
|
||
|
|
||
|
In this model, IPI (Inter-Processor Interrupt) and CPU Local Timer interrupt go
|
||
|
to CPUINTC directly, CPU UARTS interrupts go to LIOINTC, PCH-MSI interrupts go
|
||
|
to AVECINTC, and then go to CPUINTC directly, while all other devices interrupts
|
||
|
go to PCH-PIC/PCH-LPC and gathered by EIOINTC, and then go to CPUINTC directly::
|
||
|
|
||
|
+-----+ +-----------------------+ +-------+
|
||
|
| IPI | --> | CPUINTC | <-- | Timer |
|
||
|
+-----+ +-----------------------+ +-------+
|
||
|
^ ^ ^
|
||
|
| | |
|
||
|
+---------+ +----------+ +---------+ +-------+
|
||
|
| EIOINTC | | AVECINTC | | LIOINTC | <-- | UARTs |
|
||
|
+---------+ +----------+ +---------+ +-------+
|
||
|
^ ^
|
||
|
| |
|
||
|
+---------+ +---------+
|
||
|
| PCH-PIC | | PCH-MSI |
|
||
|
+---------+ +---------+
|
||
|
^ ^ ^
|
||
|
| | |
|
||
|
+---------+ +---------+ +---------+
|
||
|
| Devices | | PCH-LPC | | Devices |
|
||
|
+---------+ +---------+ +---------+
|
||
|
^
|
||
|
|
|
||
|
+---------+
|
||
|
| Devices |
|
||
|
+---------+
|
||
|
|
||
|
ACPI-related definitions
|
||
|
========================
|
||
|
|
||
|
CPUINTC::
|
||
|
|
||
|
ACPI_MADT_TYPE_CORE_PIC;
|
||
|
struct acpi_madt_core_pic;
|
||
|
enum acpi_madt_core_pic_version;
|
||
|
|
||
|
LIOINTC::
|
||
|
|
||
|
ACPI_MADT_TYPE_LIO_PIC;
|
||
|
struct acpi_madt_lio_pic;
|
||
|
enum acpi_madt_lio_pic_version;
|
||
|
|
||
|
EIOINTC::
|
||
|
|
||
|
ACPI_MADT_TYPE_EIO_PIC;
|
||
|
struct acpi_madt_eio_pic;
|
||
|
enum acpi_madt_eio_pic_version;
|
||
|
|
||
|
HTVECINTC::
|
||
|
|
||
|
ACPI_MADT_TYPE_HT_PIC;
|
||
|
struct acpi_madt_ht_pic;
|
||
|
enum acpi_madt_ht_pic_version;
|
||
|
|
||
|
PCH-PIC::
|
||
|
|
||
|
ACPI_MADT_TYPE_BIO_PIC;
|
||
|
struct acpi_madt_bio_pic;
|
||
|
enum acpi_madt_bio_pic_version;
|
||
|
|
||
|
PCH-MSI::
|
||
|
|
||
|
ACPI_MADT_TYPE_MSI_PIC;
|
||
|
struct acpi_madt_msi_pic;
|
||
|
enum acpi_madt_msi_pic_version;
|
||
|
|
||
|
PCH-LPC::
|
||
|
|
||
|
ACPI_MADT_TYPE_LPC_PIC;
|
||
|
struct acpi_madt_lpc_pic;
|
||
|
enum acpi_madt_lpc_pic_version;
|
||
|
|
||
|
References
|
||
|
==========
|
||
|
|
||
|
Documentation of Loongson-3A5000:
|
||
|
|
||
|
https://github.com/loongson/LoongArch-Documentation/releases/latest/download/Loongson-3A5000-usermanual-1.02-CN.pdf (in Chinese)
|
||
|
|
||
|
https://github.com/loongson/LoongArch-Documentation/releases/latest/download/Loongson-3A5000-usermanual-1.02-EN.pdf (in English)
|
||
|
|
||
|
Documentation of Loongson's LS7A chipset:
|
||
|
|
||
|
https://github.com/loongson/LoongArch-Documentation/releases/latest/download/Loongson-7A1000-usermanual-2.00-CN.pdf (in Chinese)
|
||
|
|
||
|
https://github.com/loongson/LoongArch-Documentation/releases/latest/download/Loongson-7A1000-usermanual-2.00-EN.pdf (in English)
|
||
|
|
||
|
.. Note::
|
||
|
- CPUINTC is CSR.ECFG/CSR.ESTAT and its interrupt controller described
|
||
|
in Section 7.4 of "LoongArch Reference Manual, Vol 1";
|
||
|
- LIOINTC is "Legacy I/OInterrupts" described in Section 11.1 of
|
||
|
"Loongson 3A5000 Processor Reference Manual";
|
||
|
- EIOINTC is "Extended I/O Interrupts" described in Section 11.2 of
|
||
|
"Loongson 3A5000 Processor Reference Manual";
|
||
|
- HTVECINTC is "HyperTransport Interrupts" described in Section 14.3 of
|
||
|
"Loongson 3A5000 Processor Reference Manual";
|
||
|
- PCH-PIC/PCH-MSI is "Interrupt Controller" described in Section 5 of
|
||
|
"Loongson 7A1000 Bridge User Manual";
|
||
|
- PCH-LPC is "LPC Interrupts" described in Section 24.3 of
|
||
|
"Loongson 7A1000 Bridge User Manual".
|