1# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2%YAML 1.2 3--- 4$id: http://devicetree.org/schemas/interrupt-controller/riscv,aplic.yaml# 5$schema: http://devicetree.org/meta-schemas/core.yaml# 6 7title: RISC-V Advanced Platform Level Interrupt Controller (APLIC) 8 9maintainers: 10 - Anup Patel <anup@brainfault.org> 11 12description: 13 The RISC-V advanced interrupt architecture (AIA) defines an advanced 14 platform level interrupt controller (APLIC) for handling wired interrupts 15 in a RISC-V platform. The RISC-V AIA specification can be found at 16 https://github.com/riscv/riscv-aia. 17 18 The RISC-V APLIC is implemented as hierarchical APLIC domains where all 19 interrupt sources connect to the root APLIC domain and a parent APLIC 20 domain can delegate interrupt sources to it's child APLIC domains. There 21 is one device tree node for each APLIC domain. 22 23allOf: 24 - $ref: /schemas/interrupt-controller.yaml# 25 26properties: 27 compatible: 28 items: 29 - enum: 30 - qemu,aplic 31 - const: riscv,aplic 32 33 reg: 34 maxItems: 1 35 36 interrupt-controller: true 37 38 "#interrupt-cells": 39 const: 2 40 41 interrupts-extended: 42 minItems: 1 43 maxItems: 16384 44 description: 45 Given APLIC domain directly injects external interrupts to a set of 46 RISC-V HARTS (or CPUs). Each node pointed to should be a riscv,cpu-intc 47 node, which has a CPU node (i.e. RISC-V HART) as parent. 48 49 msi-parent: 50 description: 51 Given APLIC domain forwards wired interrupts as MSIs to a AIA incoming 52 message signaled interrupt controller (IMSIC). If both "msi-parent" and 53 "interrupts-extended" properties are present then it means the APLIC 54 domain supports both MSI mode and Direct mode in HW. In this case, the 55 APLIC driver has to choose between MSI mode or Direct mode. 56 57 riscv,num-sources: 58 $ref: /schemas/types.yaml#/definitions/uint32 59 minimum: 1 60 maximum: 1023 61 description: 62 Specifies the number of wired interrupt sources supported by this 63 APLIC domain. 64 65 riscv,children: 66 $ref: /schemas/types.yaml#/definitions/phandle-array 67 minItems: 1 68 maxItems: 1024 69 items: 70 maxItems: 1 71 description: 72 A list of child APLIC domains for the given APLIC domain. Each child 73 APLIC domain is assigned a child index in increasing order, with the 74 first child APLIC domain assigned child index 0. The APLIC domain child 75 index is used by firmware to delegate interrupts from the given APLIC 76 domain to a particular child APLIC domain. 77 78 riscv,delegation: 79 $ref: /schemas/types.yaml#/definitions/phandle-array 80 minItems: 1 81 maxItems: 1024 82 items: 83 items: 84 - description: child APLIC domain phandle 85 - description: first interrupt number of the parent APLIC domain (inclusive) 86 - description: last interrupt number of the parent APLIC domain (inclusive) 87 description: 88 A interrupt delegation list where each entry is a triple consisting 89 of child APLIC domain phandle, first interrupt number of the parent 90 APLIC domain, and last interrupt number of the parent APLIC domain. 91 Firmware must configure interrupt delegation registers based on 92 interrupt delegation list. 93 94dependencies: 95 riscv,delegation: [ "riscv,children" ] 96 97required: 98 - compatible 99 - reg 100 - interrupt-controller 101 - "#interrupt-cells" 102 - riscv,num-sources 103 104anyOf: 105 - required: 106 - interrupts-extended 107 - required: 108 - msi-parent 109 110unevaluatedProperties: false 111 112examples: 113 - | 114 // Example 1 (APLIC domains directly injecting interrupt to HARTs): 115 116 interrupt-controller@c000000 { 117 compatible = "qemu,aplic", "riscv,aplic"; 118 interrupts-extended = <&cpu1_intc 11>, 119 <&cpu2_intc 11>, 120 <&cpu3_intc 11>, 121 <&cpu4_intc 11>; 122 reg = <0xc000000 0x4080>; 123 interrupt-controller; 124 #interrupt-cells = <2>; 125 riscv,num-sources = <63>; 126 riscv,children = <&aplic1>, <&aplic2>; 127 riscv,delegation = <&aplic1 1 63>; 128 }; 129 130 aplic1: interrupt-controller@d000000 { 131 compatible = "qemu,aplic", "riscv,aplic"; 132 interrupts-extended = <&cpu1_intc 9>, 133 <&cpu2_intc 9>; 134 reg = <0xd000000 0x4080>; 135 interrupt-controller; 136 #interrupt-cells = <2>; 137 riscv,num-sources = <63>; 138 }; 139 140 aplic2: interrupt-controller@e000000 { 141 compatible = "qemu,aplic", "riscv,aplic"; 142 interrupts-extended = <&cpu3_intc 9>, 143 <&cpu4_intc 9>; 144 reg = <0xe000000 0x4080>; 145 interrupt-controller; 146 #interrupt-cells = <2>; 147 riscv,num-sources = <63>; 148 }; 149 150 - | 151 // Example 2 (APLIC domains forwarding interrupts as MSIs): 152 153 interrupt-controller@c000000 { 154 compatible = "qemu,aplic", "riscv,aplic"; 155 msi-parent = <&imsic_mlevel>; 156 reg = <0xc000000 0x4000>; 157 interrupt-controller; 158 #interrupt-cells = <2>; 159 riscv,num-sources = <63>; 160 riscv,children = <&aplic3>; 161 riscv,delegation = <&aplic3 1 63>; 162 }; 163 164 aplic3: interrupt-controller@d000000 { 165 compatible = "qemu,aplic", "riscv,aplic"; 166 msi-parent = <&imsic_slevel>; 167 reg = <0xd000000 0x4000>; 168 interrupt-controller; 169 #interrupt-cells = <2>; 170 riscv,num-sources = <63>; 171 }; 172... 173