# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/remoteproc/qcom,msm8916-mss-pil.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Qualcomm MSM8916 MSS Peripheral Image Loader (and similar)

maintainers:
  - Stephan Gerhold <stephan@gerhold.net>

description:
  This document describes the hardware for a component that loads and boots
  firmware on the Qualcomm MSM8916 Modem Hexagon Core (and similar).

properties:
  compatible:
    oneOf:
      - enum:
          - qcom,msm8909-mss-pil
          - qcom,msm8916-mss-pil
          - qcom,msm8953-mss-pil
          - qcom,msm8974-mss-pil

      - const: qcom,q6v5-pil
        description: Deprecated, prefer using qcom,msm8916-mss-pil
        deprecated: true

  reg:
    items:
      - description: MSS QDSP6 registers
      - description: RMB registers

  reg-names:
    items:
      - const: qdsp6
      - const: rmb

  interrupts:
    items:
      - description: Watchdog interrupt
      - description: Fatal interrupt
      - description: Ready interrupt
      - description: Handover interrupt
      - description: Stop acknowledge interrupt

  interrupt-names:
    items:
      - const: wdog
      - const: fatal
      - const: ready
      - const: handover
      - const: stop-ack

  clocks:
    items:
      - description: Configuration interface (AXI) clock
      - description: Configuration bus (AHB) clock
      - description: Boot ROM (AHB) clock
      - description: XO proxy clock (control handed over after startup)

  clock-names:
    items:
      - const: iface
      - const: bus
      - const: mem
      - const: xo

  power-domains:
    items:
      - description: CX proxy power domain (control handed over after startup)
      - description: MX proxy power domain (control handed over after startup)
      - description: MSS proxy power domain (control handed over after startup)
                     (only valid for qcom,msm8953-mss-pil)
    minItems: 2

  power-domain-names:
    items:
      - const: cx
      - const: mx
      - const: mss # only valid for qcom,msm8953-mss-pil
    minItems: 2

  pll-supply:
    description: PLL proxy supply (control handed over after startup)

  mss-supply:
    description: MSS power domain supply (only valid for qcom,msm8974-mss-pil)

  resets:
    items:
      - description: MSS restart control

  reset-names:
    items:
      - const: mss_restart

  qcom,smem-states:
    $ref: /schemas/types.yaml#/definitions/phandle-array
    description: States used by the AP to signal the Hexagon core
    items:
      - description: Stop modem

  qcom,smem-state-names:
    description: Names of the states used by the AP to signal the Hexagon core
    items:
      - const: stop

  qcom,halt-regs:
    $ref: /schemas/types.yaml#/definitions/phandle-array
    description:
      Halt registers are used to halt transactions of various sub-components
      within MSS.
    items:
      - items:
          - description: phandle to TCSR syscon region
          - description: offset to the Q6 halt register
          - description: offset to the modem halt register
          - description: offset to the nc halt register

  memory-region:
    items:
      - description: MBA reserved region
      - description: MPSS reserved region

  firmware-name:
    $ref: /schemas/types.yaml#/definitions/string-array
    items:
      - description: Name of MBA firmware
      - description: Name of modem firmware

  bam-dmux:
    $ref: /schemas/net/qcom,bam-dmux.yaml#
    description:
      Qualcomm BAM Data Multiplexer (provides network interface to the modem)

  smd-edge:
    $ref: qcom,smd-edge.yaml#
    description:
      Qualcomm SMD subnode which represents communication edge, channels
      and devices related to the DSP.
    properties:
      label:
        enum:
          - modem
          - hexagon
    unevaluatedProperties: false

  # Deprecated properties
  cx-supply:
    description: CX power domain regulator supply (prefer using power-domains)
    deprecated: true

  mx-supply:
    description: MX power domain regulator supply (prefer using power-domains)
    deprecated: true

  mba:
    type: object
    additionalProperties: false
    description:
      MBA reserved region (prefer using memory-region with two items)
    properties:
      memory-region: true
    required:
      - memory-region
    deprecated: true

  mpss:
    type: object
    additionalProperties: false
    description:
      MPSS reserved region (prefer using memory-region with two items)
    properties:
      memory-region: true
    required:
      - memory-region
    deprecated: true

required:
  - compatible
  - reg
  - reg-names
  - interrupts
  - interrupt-names
  - clocks
  - clock-names
  - pll-supply
  - resets
  - reset-names
  - qcom,halt-regs
  - qcom,smem-states
  - qcom,smem-state-names
  - smd-edge

allOf:
  - if:
      properties:
        compatible:
          const: qcom,msm8953-mss-pil
    then:
      properties:
        power-domains:
          minItems: 3
        power-domain-names:
          minItems: 3
      required:
        - power-domains
        - power-domain-names
    else:
      properties:
        power-domains:
          maxItems: 2
        power-domain-names:
          maxItems: 2

  - if:
      properties:
        compatible:
          const: qcom,msm8974-mss-pil
    then:
      required:
        - mss-supply
    else:
      properties:
        mss-supply: false

  # Fallbacks for deprecated properties
  - oneOf:
      - required:
          - memory-region
      - required:
          - mba
          - mpss
  - oneOf:
      - required:
          - power-domains
          - power-domain-names
      - required:
          - cx-supply
          - mx-supply

additionalProperties: false

examples:
  - |
    #include <dt-bindings/clock/qcom,gcc-msm8916.h>
    #include <dt-bindings/interrupt-controller/arm-gic.h>
    #include <dt-bindings/power/qcom-rpmpd.h>

    remoteproc_mpss: remoteproc@4080000 {
        compatible = "qcom,msm8916-mss-pil";
        reg = <0x04080000 0x100>, <0x04020000 0x40>;
        reg-names = "qdsp6", "rmb";

        interrupts-extended = <&intc GIC_SPI 24 IRQ_TYPE_EDGE_RISING>,
                              <&hexagon_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
                              <&hexagon_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
                              <&hexagon_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
                              <&hexagon_smp2p_in 3 IRQ_TYPE_EDGE_RISING>;
        interrupt-names = "wdog", "fatal", "ready", "handover", "stop-ack";

        qcom,smem-states = <&hexagon_smp2p_out 0>;
        qcom,smem-state-names = "stop";
        qcom,halt-regs = <&tcsr 0x18000 0x19000 0x1a000>;

        clocks = <&gcc GCC_MSS_CFG_AHB_CLK>,
                 <&gcc GCC_MSS_Q6_BIMC_AXI_CLK>,
                 <&gcc GCC_BOOT_ROM_AHB_CLK>,
                 <&xo_board>;
        clock-names = "iface", "bus", "mem", "xo";

        power-domains = <&rpmpd MSM8916_VDDCX>, <&rpmpd MSM8916_VDDMX>;
        power-domain-names = "cx", "mx";
        pll-supply = <&pm8916_l7>;

        resets = <&scm 0>;
        reset-names = "mss_restart";

        memory-region = <&mba_mem>, <&mpss_mem>;

        smd-edge {
            interrupts = <GIC_SPI 25 IRQ_TYPE_EDGE_RISING>;

            qcom,smd-edge = <0>;
            qcom,ipc = <&apcs 8 12>;
            qcom,remote-pid = <1>;

            label = "hexagon";
        };
    };
