# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/display/tegra/nvidia,tegra20-gr3d.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: NVIDIA 3D graphics engine

maintainers:
  - Thierry Reding <thierry.reding@gmail.com>
  - Jon Hunter <jonathanh@nvidia.com>

properties:
  $nodename:
    pattern: "^gr3d@[0-9a-f]+$"

  compatible:
    enum:
      - nvidia,tegra20-gr3d
      - nvidia,tegra30-gr3d
      - nvidia,tegra114-gr3d

  reg:
    maxItems: 1

  clocks:
    minItems: 1
    maxItems: 2

  clock-names:
    minItems: 1
    maxItems: 2

  resets:
    minItems: 2
    maxItems: 4

  reset-names:
    minItems: 2
    maxItems: 4

  iommus:
    minItems: 1
    maxItems: 2

  interconnects:
    minItems: 4
    maxItems: 10

  interconnect-names:
    minItems: 4
    maxItems: 10

  operating-points-v2:
    $ref: "/schemas/types.yaml#/definitions/phandle"

  power-domains:
    minItems: 1
    maxItems: 2

  power-domain-names:
    maxItems: 2

allOf:
  - if:
      properties:
        compatible:
          contains:
            const: nvidia,tegra20-gr2d
    then:
      properties:
        clocks:
          items:
            - description: module clock

        clock-names:
          items:
            - const: 3d

        resets:
          items:
            - description: module reset
            - description: memory client hotflush reset

        reset-names:
          items:
            - const: 3d
            - const: mc

        iommus:
          maxItems: 1

        interconnects:
          minItems: 4
          maxItems: 4

        interconnect-names:
          minItems: 4
          maxItems: 4

        power-domains:
          items:
            - description: phandle to the TD power domain

  - if:
      properties:
        compatible:
          contains:
            const: nvidia,tegra30-gr3d
    then:
      properties:
        clocks:
          items:
            - description: primary module clock
            - description: secondary module clock

        clock-names:
          items:
            - const: 3d
            - const: 3d2

        resets:
          items:
            - description: primary module reset
            - description: secondary module reset
            - description: primary memory client hotflush reset
            - description: secondary memory client hotflush reset

        reset-names:
          items:
            - const: 3d
            - const: 3d2
            - const: mc
            - const: mc2

        iommus:
          minItems: 2
          maxItems: 2

        interconnects:
          minItems: 8
          maxItems: 8

        interconnect-names:
          minItems: 8
          maxItems: 8

        power-domains:
          items:
            - description: phandle to the TD power domain
            - description: phandle to the TD2 power domain

        power-domain-names:
          items:
            - const: 3d0
            - const: 3d1

      dependencies:
        power-domains: [ power-domain-names ]

  - if:
      properties:
        compatible:
          contains:
            const: nvidia,tegra114-gr2d
    then:
      properties:
        clocks:
          items:
            - description: module clock

        clock-names:
          items:
            - const: 3d

        resets:
          items:
            - description: module reset
            - description: memory client hotflush reset

        reset-names:
          items:
            - const: 3d
            - const: mc

        iommus:
          maxItems: 1

        interconnects:
          minItems: 10
          maxItems: 10

        interconnect-names:
          minItems: 10
          maxItems: 10

        power-domains:
          items:
            - description: phandle to the TD power domain

additionalProperties: false

examples:
  - |
    #include <dt-bindings/clock/tegra20-car.h>
    #include <dt-bindings/memory/tegra20-mc.h>

    gr3d@54180000 {
        compatible = "nvidia,tegra20-gr3d";
        reg = <0x54180000 0x00040000>;
        clocks = <&tegra_car TEGRA20_CLK_GR3D>;
        resets = <&tegra_car 24>, <&mc TEGRA20_MC_RESET_3D>;
        reset-names = "3d", "mc";
    };
