| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
- %YAML 1.2
- ---
- $id: http://devicetree.org/schemas/interrupt-controller/riscv,imsics.yaml#
- $schema: http://devicetree.org/meta-schemas/core.yaml#
- title: RISC-V Incoming MSI Controller (IMSIC)
- maintainers:
- - Anup Patel <anup@brainfault.org>
- description: |
- The RISC-V advanced interrupt architecture (AIA) defines a per-CPU incoming
- MSI controller (IMSIC) for handling MSIs in a RISC-V platform. The RISC-V
- AIA specification can be found at https://github.com/riscv/riscv-aia.
- The IMSIC is a per-CPU (or per-HART) device with separate interrupt file
- for each privilege level (machine or supervisor). The configuration of
- a IMSIC interrupt file is done using AIA CSRs and it also has a 4KB MMIO
- space to receive MSIs from devices. Each IMSIC interrupt file supports a
- fixed number of interrupt identities (to distinguish MSIs from devices)
- which is same for given privilege level across CPUs (or HARTs).
- The device tree of a RISC-V platform will have one IMSIC device tree node
- for each privilege level (machine or supervisor) which collectively describe
- IMSIC interrupt files at that privilege level across CPUs (or HARTs).
- The arrangement of IMSIC interrupt files in MMIO space of a RISC-V platform
- follows a particular scheme defined by the RISC-V AIA specification. A IMSIC
- group is a set of IMSIC interrupt files co-located in MMIO space and we can
- have multiple IMSIC groups (i.e. clusters, sockets, chiplets, etc) in a
- RISC-V platform. The MSI target address of a IMSIC interrupt file at given
- privilege level (machine or supervisor) encodes group index, HART index,
- and guest index (shown below).
- XLEN-1 > (HART Index MSB) 12 0
- | | | |
- -------------------------------------------------------------
- |xxxxxx|Group Index|xxxxxxxxxxx|HART Index|Guest Index| 0 |
- -------------------------------------------------------------
- allOf:
- - $ref: /schemas/interrupt-controller.yaml#
- - $ref: /schemas/interrupt-controller/msi-controller.yaml#
- properties:
- compatible:
- items:
- - enum:
- - qemu,imsics
- - const: riscv,imsics
- reg:
- minItems: 1
- maxItems: 16384
- description:
- Base address of each IMSIC group.
- interrupt-controller: true
- "#interrupt-cells":
- const: 0
- msi-controller: true
- "#msi-cells":
- const: 0
- interrupts-extended:
- minItems: 1
- maxItems: 16384
- description:
- This property represents the set of CPUs (or HARTs) for which given
- device tree node describes the IMSIC interrupt files. Each node pointed
- to should be a riscv,cpu-intc node, which has a CPU node (i.e. RISC-V
- HART) as parent.
- riscv,num-ids:
- $ref: /schemas/types.yaml#/definitions/uint32
- minimum: 63
- maximum: 2047
- description:
- Number of interrupt identities supported by IMSIC interrupt file.
- riscv,num-guest-ids:
- $ref: /schemas/types.yaml#/definitions/uint32
- minimum: 63
- maximum: 2047
- description:
- Number of interrupt identities are supported by IMSIC guest interrupt
- file. When not specified it is assumed to be same as specified by the
- riscv,num-ids property.
- riscv,guest-index-bits:
- minimum: 0
- maximum: 7
- default: 0
- description:
- Number of guest index bits in the MSI target address.
- riscv,hart-index-bits:
- minimum: 0
- maximum: 15
- description:
- Number of HART index bits in the MSI target address. When not
- specified it is calculated based on the interrupts-extended property.
- riscv,group-index-bits:
- minimum: 0
- maximum: 7
- default: 0
- description:
- Number of group index bits in the MSI target address.
- riscv,group-index-shift:
- $ref: /schemas/types.yaml#/definitions/uint32
- minimum: 0
- maximum: 55
- default: 24
- description:
- The least significant bit position of the group index bits in the
- MSI target address.
- required:
- - compatible
- - reg
- - interrupt-controller
- - msi-controller
- - "#msi-cells"
- - interrupts-extended
- - riscv,num-ids
- unevaluatedProperties: false
- examples:
- - |
- // Example 1 (Machine-level IMSIC files with just one group):
- interrupt-controller@24000000 {
- compatible = "qemu,imsics", "riscv,imsics";
- interrupts-extended = <&cpu1_intc 11>,
- <&cpu2_intc 11>,
- <&cpu3_intc 11>,
- <&cpu4_intc 11>;
- reg = <0x28000000 0x4000>;
- interrupt-controller;
- #interrupt-cells = <0>;
- msi-controller;
- #msi-cells = <0>;
- riscv,num-ids = <127>;
- };
- - |
- // Example 2 (Supervisor-level IMSIC files with two groups):
- interrupt-controller@28000000 {
- compatible = "qemu,imsics", "riscv,imsics";
- interrupts-extended = <&cpu1_intc 9>,
- <&cpu2_intc 9>,
- <&cpu3_intc 9>,
- <&cpu4_intc 9>;
- reg = <0x28000000 0x2000>, /* Group0 IMSICs */
- <0x29000000 0x2000>; /* Group1 IMSICs */
- interrupt-controller;
- #interrupt-cells = <0>;
- msi-controller;
- #msi-cells = <0>;
- riscv,num-ids = <127>;
- riscv,group-index-bits = <1>;
- riscv,group-index-shift = <24>;
- };
- ...
|