1 # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
4 $id: http://devicetree.org/schemas/interrupt-controller/riscv,imsics.yaml#
5 $schema: http://devicetree.org/meta-schemas/core.yaml#
7 title: RISC-V Incoming MSI Controller (IMSIC)
10 - Anup Patel <anup@brainfault.org>
13 The RISC-V advanced interrupt architecture (AIA) defines a per-CPU incoming
14 MSI controller (IMSIC) for handling MSIs in a RISC-V platform. The RISC-V
15 AIA specification can be found at https://github.com/riscv/riscv-aia.
17 The IMSIC is a per-CPU (or per-HART) device with separate interrupt file
18 for each privilege level (machine or supervisor). The configuration of
19 a IMSIC interrupt file is done using AIA CSRs and it also has a 4KB MMIO
20 space to receive MSIs from devices. Each IMSIC interrupt file supports a
21 fixed number of interrupt identities (to distinguish MSIs from devices)
22 which is same for given privilege level across CPUs (or HARTs).
24 The device tree of a RISC-V platform will have one IMSIC device tree node
25 for each privilege level (machine or supervisor) which collectively describe
26 IMSIC interrupt files at that privilege level across CPUs (or HARTs).
28 The arrangement of IMSIC interrupt files in MMIO space of a RISC-V platform
29 follows a particular scheme defined by the RISC-V AIA specification. A IMSIC
30 group is a set of IMSIC interrupt files co-located in MMIO space and we can
31 have multiple IMSIC groups (i.e. clusters, sockets, chiplets, etc) in a
32 RISC-V platform. The MSI target address of a IMSIC interrupt file at given
33 privilege level (machine or supervisor) encodes group index, HART index,
34 and guest index (shown below).
36 XLEN-1 > (HART Index MSB) 12 0
38 -------------------------------------------------------------
39 |xxxxxx|Group Index|xxxxxxxxxxx|HART Index|Guest Index| 0 |
40 -------------------------------------------------------------
43 - $ref: /schemas/interrupt-controller.yaml#
44 - $ref: /schemas/interrupt-controller/msi-controller.yaml#
57 Base address of each IMSIC group.
59 interrupt-controller: true
73 This property represents the set of CPUs (or HARTs) for which given
74 device tree node describes the IMSIC interrupt files. Each node pointed
75 to should be a riscv,cpu-intc node, which has a CPU node (i.e. RISC-V
79 $ref: /schemas/types.yaml#/definitions/uint32
83 Number of interrupt identities supported by IMSIC interrupt file.
86 $ref: /schemas/types.yaml#/definitions/uint32
90 Number of interrupt identities are supported by IMSIC guest interrupt
91 file. When not specified it is assumed to be same as specified by the
92 riscv,num-ids property.
94 riscv,guest-index-bits:
99 Number of guest index bits in the MSI target address.
101 riscv,hart-index-bits:
105 Number of HART index bits in the MSI target address. When not
106 specified it is calculated based on the interrupts-extended property.
108 riscv,group-index-bits:
113 Number of group index bits in the MSI target address.
115 riscv,group-index-shift:
116 $ref: /schemas/types.yaml#/definitions/uint32
121 The least significant bit position of the group index bits in the
127 - interrupt-controller
130 - interrupts-extended
133 unevaluatedProperties: false
137 // Example 1 (Machine-level IMSIC files with just one group):
139 interrupt-controller@24000000 {
140 compatible = "qemu,imsics", "riscv,imsics";
141 interrupts-extended = <&cpu1_intc 11>,
145 reg = <0x28000000 0x4000>;
146 interrupt-controller;
147 #interrupt-cells = <0>;
150 riscv,num-ids = <127>;
154 // Example 2 (Supervisor-level IMSIC files with two groups):
156 interrupt-controller@28000000 {
157 compatible = "qemu,imsics", "riscv,imsics";
158 interrupts-extended = <&cpu1_intc 9>,
162 reg = <0x28000000 0x2000>, /* Group0 IMSICs */
163 <0x29000000 0x2000>; /* Group1 IMSICs */
164 interrupt-controller;
165 #interrupt-cells = <0>;
168 riscv,num-ids = <127>;
169 riscv,group-index-bits = <1>;
170 riscv,group-index-shift = <24>;