# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/interrupt-controller/aspeed,ast2700-interrupt.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: ASPEED AST2700 Interrupt Controllers (INTC0/INTC1)

description: |
  The ASPEED AST2700 SoC integrates two interrupt controller designs:

    - INTC0: Primary controller that routes interrupt sources to upstream,
      processor-specific interrupt controllers

    - INTC1: Secondary controller whose interrupt outputs feed into INTC0

  The SoC contains four processors to which interrupts can be routed:

    - PSP: Primary Service Processor (Cortex-A35)
    - SSP: Secondary Service Processor (Cortex-M4)
    - TSP: Tertiary Service Processor (Cortex-M4)
    - BMCU: Boot MCU (a RISC-V microcontroller)

  The following diagram illustrates the overall architecture of the
  ASPEED AST2700 interrupt controllers:

                  +-----------+                +-----------+
                  |   INTC0   |                | INTC1(0)  |
                  +-----------+                +-----------+
                  |   Router  | +-----------+  |   Router  |
                  | out   int | +Peripheral +  | out   int |
  +-----------+   |  0     0  <-+Controllers+  | INTM      | +-----------+
  |PSP GIC  <-|---+  .     .  | +-----------+  |  .     .  <-+Peripheral +
  +-----------+   |  .     .  |                |  .     .  | +Controllers+
  +-----------+   |  .     .  |                |  .     .  | +-----------+
  |SSP NVIC <-|---+  .     .  <----------------+  .     .  |
  +-----------+   |  .     .  |                |  .     .  |
  +-----------+   |  .     .  <--------        |  .     .  |
  |TSP NVIC <-|---+  .     .  |       |    ----+  .     .  |
  +-----------+   |  .     .  |       |    |   |  O     P  |
                  |  .     .  |       |    |   +-----------+
                  |  .     .  <----   |    --------------------
                  |  .     .  |   |   |        +-----------+  |
                  |  M     N  |   |   ---------+  INTC1(1) |  |
                  +-----------+   |            +-----------+  |
                                  |                  .        |
                                  |            +-----------+  |
                                  -------------+  INTC1(N) |  |
                                               +-----------+  |
  +--------------+                                            |
  + BMCU APLIC <-+---------------------------------------------
  +--------------+

  INTC0 supports:
    - 128 local peripheral interrupt inputs
    - Fan-in from up to three INTC1 instances via banked interrupt lines (INTM)
    - Local peripheral interrupt outputs
    - Merged interrupt outputs
    - Software interrupt outputs (SWINT)
    - Configurable interrupt routes targeting the PSP, SSP, and TSP

  INTC1 supports:
    - 192 local peripheral interrupt inputs
    - Banked interrupt outputs (INTM, 5 x 6 banks x 32 interrupts per bank)
    - Configurable interrupt routes targeting the PSP, SSP, TSP, and BMCU

  One INTC1 instance is always present, on the SoC's IO die. A further two
  instances may be attached to the SoC's one INTC0 instance via LTPI (LVDS
  Tunneling Protocol & Interface).

  Interrupt numbering model
  -------------------------
  The binding uses a controller-local numbering model. Peripheral device
  nodes use the INTCx local interrupt number (hwirq) in their 'interrupts' or
  'interrupts-extended' properties.

  For AST2700, INTC0 exposes the following (inclusive) input ranges:

    - 000..479: Independent interrupts
    - 480..489: INTM0-INTM9
    - 490..499: INTM10-INTM19
    - 500..509: INTM20-INTM29
    - 510..519: INTM30-INTM39
    - 520..529: INTM40-INTM49

  INTC0's (inclusive) output ranges are as follows:

    - 000..127: 1:1 local peripheral interrupt output to PSP
    - 144..151: Software interrupts from the SSP output to PSP
    - 152..159: Software interrupts from the TSP output to PSP
    - 192..201: INTM0-INTM9 banked outputs to PSP
    - 208..217: INTM30-INTM39 banked outputs to PSP
    - 224..233: INTM40-INTM49 banked outputs to PSP
    - 256..383: 1:1 local peripheral interrupt output to SSP
    - 384..393: INTM10-INTM19 banked outputs to SSP
    - 400..407: Software interrupts from the PSP output to SSP
    - 408..415: Software interrupts from the TSP output to SSP
    - 426..553: 1:1 local peripheral interrupt output to TSP
    - 554..563: INTM20-INTM29 banked outputs to TSP
    - 570..577: Software interrupts from the PSP output to TSP
    - 578..585: Software interrupts from the SSP output to TSP

  Inputs and outputs for INTC1 instances are context-dependent. However, for the
  first instance of INTC1, the (inclusive) output ranges are:

    - 00..05: INTM0-INTM5
    - 10..15: INTM10-INTM15
    - 20..25: INTM20-INTM25
    - 30..35: INTM30-INTM35
    - 40..45: INTM40-INTM45
    - 50..50: BootMCU

maintainers:
  - Ryan Chen <ryan_chen@aspeedtech.com>
  - Andrew Jeffery <andrew@codeconstruct.com.au>

properties:
  compatible:
    enum:
      - aspeed,ast2700-intc0
      - aspeed,ast2700-intc1

  reg:
    maxItems: 1

  interrupt-controller: true

  '#interrupt-cells':
    const: 1
    description: Single cell encoding the INTC local interrupt number (hwirq).

  aspeed,interrupt-ranges:
    description: |
      Describes how ranges of controller output pins are routed to a parent
      interrupt controller.

      Each range entry is encoded as:

        <out count phandle parent-specifier...>

      where:
        - out:     First controller interrupt output index in the range.
        - count:   Number of consecutive controller interrupt outputs and parent
                   interrupt inputs in this range.
        - phandle: Phandle to the parent interrupt controller node.
        - parent-specifier: Interrupt specifier, as defined by the parent
                            interrupt controller binding.
    $ref: /schemas/types.yaml#/definitions/uint32-array
    minItems: 3
    items:
      description: Range descriptors with a parent interrupt specifier.

required:
  - compatible
  - reg
  - interrupt-controller
  - '#interrupt-cells'
  - aspeed,interrupt-ranges

additionalProperties: false

examples:
  - |
    #include <dt-bindings/interrupt-controller/arm-gic.h>

    interrupt-controller@12100000 {
        compatible = "aspeed,ast2700-intc0";
        reg = <0x12100000 0x3b00>;
        interrupt-parent = <&gic>;
        interrupt-controller;
        #interrupt-cells = <1>;

        aspeed,interrupt-ranges =
          <0 128 &gic GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
          <144 8 &gic GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>,
          <152 8 &gic GIC_SPI 152 IRQ_TYPE_LEVEL_HIGH>,
          <192 10 &gic GIC_SPI 192 IRQ_TYPE_LEVEL_HIGH>,
          <208 10 &gic GIC_SPI 208 IRQ_TYPE_LEVEL_HIGH>,
          <224 10 &gic GIC_SPI 224 IRQ_TYPE_LEVEL_HIGH>,
          <256 128 &ssp_nvic 0 0>,
          <384 10 &ssp_nvic 160 0>,
          <400 8 &ssp_nvic 144 0>,
          <408 8 &ssp_nvic 152 0>,
          <426 128 &tsp_nvic 0 0>,
          <554 10 &tsp_nvic 160 0>,
          <570 8 &tsp_nvic 144 0>,
          <578 8 &tsp_nvic 152 0>;
    };