173 lines
5.3 KiB
YAML
173 lines
5.3 KiB
YAML
# 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>;
|
|
};
|
|
...
|