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