| # 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>; |
| }; |
| ... |