| # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause | |
| # Copyright (C) 2020 SiFive, Inc. | |
| %YAML 1.2 | |
| --- | |
| $id: http://devicetree.org/schemas/interrupt-controller/sifive,plic-1.0.0.yaml# | |
| $schema: http://devicetree.org/meta-schemas/core.yaml# | |
| title: SiFive Platform-Level Interrupt Controller (PLIC) | |
| description: | |
| SiFive SoCs and other RISC-V SoCs include an implementation of the | |
| Platform-Level Interrupt Controller (PLIC) high-level specification in | |
| the RISC-V Privileged Architecture specification. The PLIC connects all | |
| external interrupts in the system to all hart contexts in the system, via | |
| the external interrupt source in each hart. | |
| A hart context is a privilege mode in a hardware execution thread. For example, | |
| in an 4 core system with 2-way SMT, you have 8 harts and probably at least two | |
| privilege modes per hart; machine mode and supervisor mode. | |
| Each interrupt can be enabled on per-context basis. Any context can claim | |
| a pending enabled interrupt and then release it once it has been handled. | |
| Each interrupt has a configurable priority. Higher priority interrupts are | |
| serviced first. Each context can specify a priority threshold. Interrupts | |
| with priority below this threshold will not cause the PLIC to raise its | |
| interrupt line leading to the context. | |
| The PLIC supports both edge-triggered and level-triggered interrupts. For | |
| edge-triggered interrupts, the RISC-V PLIC spec allows two responses to edges | |
| seen while an interrupt handler is active; the PLIC may either queue them or | |
| ignore them. In the first case, handlers are oblivious to the trigger type, so | |
| it is not included in the interrupt specifier. In the second case, software | |
| needs to know the trigger type, so it can reorder the interrupt flow to avoid | |
| missing interrupts. This special handling is needed by at least the Renesas | |
| RZ/Five SoC (AX45MP AndesCore with a NCEPLIC100) and the T-HEAD C900 PLIC. | |
| While the RISC-V ISA doesn't specify a memory layout for the PLIC, the | |
| "sifive,plic-1.0.0" device is a concrete implementation of the PLIC that | |
| contains a specific memory layout, which is documented in chapter 8 of the | |
| SiFive U5 Coreplex Series Manual <https://static.dev.sifive.com/U54-MC-RVCoreIP.pdf>. | |
| The thead,c900-plic is different from sifive,plic-1.0.0 in opensbi, the | |
| T-HEAD PLIC implementation requires setting a delegation bit to allow access | |
| from S-mode. So add thead,c900-plic to distinguish them. | |
| maintainers: | |
| - Paul Walmsley <paul.walmsley@sifive.com> | |
| - Palmer Dabbelt <palmer@dabbelt.com> | |
| properties: | |
| compatible: | |
| oneOf: | |
| - items: | |
| - enum: | |
| - andestech,qilai-plic | |
| - renesas,r9a07g043-plic | |
| - const: andestech,nceplic100 | |
| - items: | |
| - enum: | |
| - anlogic,dr1v90-plic | |
| - canaan,k210-plic | |
| - eswin,eic7700-plic | |
| - microchip,pic64gx-plic | |
| - sifive,fu540-c000-plic | |
| - spacemit,k1-plic | |
| - starfive,jh7100-plic | |
| - starfive,jh7110-plic | |
| - starfive,jhb100-plic | |
| - tenstorrent,blackhole-plic | |
| - const: sifive,plic-1.0.0 | |
| - items: | |
| - enum: | |
| - allwinner,sun20i-d1-plic | |
| - canaan,k230-plic | |
| - sophgo,cv1800b-plic | |
| - sophgo,cv1812h-plic | |
| - sophgo,sg2000-plic | |
| - sophgo,sg2002-plic | |
| - sophgo,sg2042-plic | |
| - sophgo,sg2044-plic | |
| - thead,th1520-plic | |
| - const: thead,c900-plic | |
| - items: | |
| - const: ultrarisc,dp1000-plic | |
| - const: ultrarisc,cp100-plic | |
| - items: | |
| - const: sifive,plic-1.0.0 | |
| - const: riscv,plic0 | |
| deprecated: true | |
| description: For the QEMU virt machine only | |
| reg: | |
| maxItems: 1 | |
| '#address-cells': | |
| const: 0 | |
| '#interrupt-cells': true | |
| interrupt-controller: true | |
| interrupts-extended: | |
| minItems: 1 | |
| maxItems: 15872 | |
| description: | |
| Specifies which contexts are connected to the PLIC, with "-1" specifying | |
| that a context is not present. Each node pointed to should be a | |
| riscv,cpu-intc node, which has a riscv node as parent. | |
| riscv,ndev: | |
| $ref: /schemas/types.yaml#/definitions/uint32 | |
| description: | |
| Specifies how many external (device) interrupts are supported by this | |
| controller. Note that source 0 is reserved in PLIC, so the valid | |
| interrupt sources are 1 to riscv,ndev inclusive. | |
| clocks: true | |
| power-domains: true | |
| resets: true | |
| required: | |
| - compatible | |
| - '#address-cells' | |
| - '#interrupt-cells' | |
| - interrupt-controller | |
| - reg | |
| - interrupts-extended | |
| - riscv,ndev | |
| allOf: | |
| - if: | |
| properties: | |
| compatible: | |
| contains: | |
| enum: | |
| - andestech,nceplic100 | |
| - thead,c900-plic | |
| then: | |
| properties: | |
| '#interrupt-cells': | |
| const: 2 | |
| else: | |
| properties: | |
| '#interrupt-cells': | |
| const: 1 | |
| - if: | |
| properties: | |
| compatible: | |
| contains: | |
| const: renesas,r9a07g043-plic | |
| then: | |
| properties: | |
| clocks: | |
| maxItems: 1 | |
| power-domains: | |
| maxItems: 1 | |
| resets: | |
| maxItems: 1 | |
| required: | |
| - clocks | |
| - power-domains | |
| - resets | |
| additionalProperties: false | |
| examples: | |
| - | | |
| plic: interrupt-controller@c000000 { | |
| #address-cells = <0>; | |
| #interrupt-cells = <1>; | |
| compatible = "sifive,fu540-c000-plic", "sifive,plic-1.0.0"; | |
| interrupt-controller; | |
| interrupts-extended = <&cpu0_intc 11>, | |
| <&cpu1_intc 11>, <&cpu1_intc 9>, | |
| <&cpu2_intc 11>, <&cpu2_intc 9>, | |
| <&cpu3_intc 11>, <&cpu3_intc 9>, | |
| <&cpu4_intc 11>, <&cpu4_intc 9>; | |
| reg = <0xc000000 0x4000000>; | |
| riscv,ndev = <10>; | |
| }; |