173 lines
5.2 KiB
YAML
173 lines
5.2 KiB
YAML
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
|
%YAML 1.2
|
|
---
|
|
$id: http://devicetree.org/schemas/interrupt-controller/riscv,aplic.yaml#
|
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
|
|
|
title: RISC-V Advanced Platform Level Interrupt Controller (APLIC)
|
|
|
|
maintainers:
|
|
- Anup Patel <anup@brainfault.org>
|
|
|
|
description:
|
|
The RISC-V advanced interrupt architecture (AIA) defines an advanced
|
|
platform level interrupt controller (APLIC) for handling wired interrupts
|
|
in a RISC-V platform. The RISC-V AIA specification can be found at
|
|
https://github.com/riscv/riscv-aia.
|
|
|
|
The RISC-V APLIC is implemented as hierarchical APLIC domains where all
|
|
interrupt sources connect to the root APLIC domain and a parent APLIC
|
|
domain can delegate interrupt sources to it's child APLIC domains. There
|
|
is one device tree node for each APLIC domain.
|
|
|
|
allOf:
|
|
- $ref: /schemas/interrupt-controller.yaml#
|
|
|
|
properties:
|
|
compatible:
|
|
items:
|
|
- enum:
|
|
- qemu,aplic
|
|
- const: riscv,aplic
|
|
|
|
reg:
|
|
maxItems: 1
|
|
|
|
interrupt-controller: true
|
|
|
|
"#interrupt-cells":
|
|
const: 2
|
|
|
|
interrupts-extended:
|
|
minItems: 1
|
|
maxItems: 16384
|
|
description:
|
|
Given APLIC domain directly injects external interrupts to a set of
|
|
RISC-V HARTS (or CPUs). Each node pointed to should be a riscv,cpu-intc
|
|
node, which has a CPU node (i.e. RISC-V HART) as parent.
|
|
|
|
msi-parent:
|
|
description:
|
|
Given APLIC domain forwards wired interrupts as MSIs to a AIA incoming
|
|
message signaled interrupt controller (IMSIC). If both "msi-parent" and
|
|
"interrupts-extended" properties are present then it means the APLIC
|
|
domain supports both MSI mode and Direct mode in HW. In this case, the
|
|
APLIC driver has to choose between MSI mode or Direct mode.
|
|
|
|
riscv,num-sources:
|
|
$ref: /schemas/types.yaml#/definitions/uint32
|
|
minimum: 1
|
|
maximum: 1023
|
|
description:
|
|
Specifies the number of wired interrupt sources supported by this
|
|
APLIC domain.
|
|
|
|
riscv,children:
|
|
$ref: /schemas/types.yaml#/definitions/phandle-array
|
|
minItems: 1
|
|
maxItems: 1024
|
|
items:
|
|
maxItems: 1
|
|
description:
|
|
A list of child APLIC domains for the given APLIC domain. Each child
|
|
APLIC domain is assigned a child index in increasing order, with the
|
|
first child APLIC domain assigned child index 0. The APLIC domain child
|
|
index is used by firmware to delegate interrupts from the given APLIC
|
|
domain to a particular child APLIC domain.
|
|
|
|
riscv,delegation:
|
|
$ref: /schemas/types.yaml#/definitions/phandle-array
|
|
minItems: 1
|
|
maxItems: 1024
|
|
items:
|
|
items:
|
|
- description: child APLIC domain phandle
|
|
- description: first interrupt number of the parent APLIC domain (inclusive)
|
|
- description: last interrupt number of the parent APLIC domain (inclusive)
|
|
description:
|
|
A interrupt delegation list where each entry is a triple consisting
|
|
of child APLIC domain phandle, first interrupt number of the parent
|
|
APLIC domain, and last interrupt number of the parent APLIC domain.
|
|
Firmware must configure interrupt delegation registers based on
|
|
interrupt delegation list.
|
|
|
|
dependencies:
|
|
riscv,delegation: [ "riscv,children" ]
|
|
|
|
required:
|
|
- compatible
|
|
- reg
|
|
- interrupt-controller
|
|
- "#interrupt-cells"
|
|
- riscv,num-sources
|
|
|
|
anyOf:
|
|
- required:
|
|
- interrupts-extended
|
|
- required:
|
|
- msi-parent
|
|
|
|
unevaluatedProperties: false
|
|
|
|
examples:
|
|
- |
|
|
// Example 1 (APLIC domains directly injecting interrupt to HARTs):
|
|
|
|
interrupt-controller@c000000 {
|
|
compatible = "qemu,aplic", "riscv,aplic";
|
|
interrupts-extended = <&cpu1_intc 11>,
|
|
<&cpu2_intc 11>,
|
|
<&cpu3_intc 11>,
|
|
<&cpu4_intc 11>;
|
|
reg = <0xc000000 0x4080>;
|
|
interrupt-controller;
|
|
#interrupt-cells = <2>;
|
|
riscv,num-sources = <63>;
|
|
riscv,children = <&aplic1>, <&aplic2>;
|
|
riscv,delegation = <&aplic1 1 63>;
|
|
};
|
|
|
|
aplic1: interrupt-controller@d000000 {
|
|
compatible = "qemu,aplic", "riscv,aplic";
|
|
interrupts-extended = <&cpu1_intc 9>,
|
|
<&cpu2_intc 9>;
|
|
reg = <0xd000000 0x4080>;
|
|
interrupt-controller;
|
|
#interrupt-cells = <2>;
|
|
riscv,num-sources = <63>;
|
|
};
|
|
|
|
aplic2: interrupt-controller@e000000 {
|
|
compatible = "qemu,aplic", "riscv,aplic";
|
|
interrupts-extended = <&cpu3_intc 9>,
|
|
<&cpu4_intc 9>;
|
|
reg = <0xe000000 0x4080>;
|
|
interrupt-controller;
|
|
#interrupt-cells = <2>;
|
|
riscv,num-sources = <63>;
|
|
};
|
|
|
|
- |
|
|
// Example 2 (APLIC domains forwarding interrupts as MSIs):
|
|
|
|
interrupt-controller@c000000 {
|
|
compatible = "qemu,aplic", "riscv,aplic";
|
|
msi-parent = <&imsic_mlevel>;
|
|
reg = <0xc000000 0x4000>;
|
|
interrupt-controller;
|
|
#interrupt-cells = <2>;
|
|
riscv,num-sources = <63>;
|
|
riscv,children = <&aplic3>;
|
|
riscv,delegation = <&aplic3 1 63>;
|
|
};
|
|
|
|
aplic3: interrupt-controller@d000000 {
|
|
compatible = "qemu,aplic", "riscv,aplic";
|
|
msi-parent = <&imsic_slevel>;
|
|
reg = <0xd000000 0x4000>;
|
|
interrupt-controller;
|
|
#interrupt-cells = <2>;
|
|
riscv,num-sources = <63>;
|
|
};
|
|
...
|