| RISC-V Hart-Level Interrupt Controller (HLIC) |
| --------------------------------------------- |
| |
| RISC-V cores include Control Status Registers (CSRs) which are local to each |
| CPU core (HART in RISC-V terminology) and can be read or written by software. |
| Some of these CSRs are used to control local interrupts connected to the core. |
| Every interrupt is ultimately routed through a hart's HLIC before it |
| interrupts that hart. |
| |
| The RISC-V supervisor ISA manual specifies three interrupt sources that are |
| attached to every HLIC: software interrupts, the timer interrupt, and external |
| interrupts. Software interrupts are used to send IPIs between cores. The |
| timer interrupt comes from an architecturally mandated real-time timer that is |
| controlled via Supervisor Binary Interface (SBI) calls and CSR reads. External |
| interrupts connect all other device interrupts to the HLIC, which are routed |
| via the platform-level interrupt controller (PLIC). |
| |
| All RISC-V systems that conform to the supervisor ISA specification are |
| required to have a HLIC with these three interrupt sources present. Since the |
| interrupt map is defined by the ISA it's not listed in the HLIC's device tree |
| entry, though external interrupt controllers (like the PLIC, for example) will |
| need to define how their interrupts map to the relevant HLICs. This means |
| a PLIC interrupt property will typically list the HLICs for all present HARTs |
| in the system. |
| |
| Required properties: |
| - compatible : "riscv,cpu-intc" |
| - #interrupt-cells : should be <1>. The interrupt sources are defined by the |
| RISC-V supervisor ISA manual, with only the following three interrupts being |
| defined for supervisor mode: |
| - Source 1 is the supervisor software interrupt, which can be sent by an SBI |
| call and is reserved for use by software. |
| - Source 5 is the supervisor timer interrupt, which can be configured by |
| SBI calls and implements a one-shot timer. |
| - Source 9 is the supervisor external interrupt, which chains to all other |
| device interrupts. |
| - interrupt-controller : Identifies the node as an interrupt controller |
| |
| Furthermore, this interrupt-controller MUST be embedded inside the cpu |
| definition of the hart whose CSRs control these local interrupts. |
| |
| An example device tree entry for a HLIC is show below. |
| |
| cpu1: cpu@1 { |
| compatible = "riscv"; |
| ... |
| cpu1-intc: interrupt-controller { |
| #interrupt-cells = <1>; |
| compatible = "sifive,fu540-c000-cpu-intc", "riscv,cpu-intc"; |
| interrupt-controller; |
| }; |
| }; |