1# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2%YAML 1.2
3---
4
5$id: "http://devicetree.org/schemas/display/msm/gpu.yaml#"
6$schema: "http://devicetree.org/meta-schemas/core.yaml#"
7
8title: Adreno or Snapdragon GPUs
9
10maintainers:
11  - Rob Clark <robdclark@gmail.com>
12
13properties:
14  compatible:
15    oneOf:
16      - description: |
17          The driver is parsing the compat string for Adreno to
18          figure out the gpu-id and patch level.
19        items:
20          - pattern: '^qcom,adreno-[3-6][0-9][0-9]\.[0-9]$'
21          - const: qcom,adreno
22      - description: |
23          The driver is parsing the compat string for Imageon to
24          figure out the gpu-id and patch level.
25        items:
26          - pattern: '^amd,imageon-200\.[0-1]$'
27          - const: amd,imageon
28
29  clocks: true
30
31  clock-names: true
32
33  reg:
34    minItems: 1
35    maxItems: 3
36
37  reg-names:
38    minItems: 1
39    items:
40      - const: kgsl_3d0_reg_memory
41      - const: cx_mem
42      - const: cx_dbgc
43
44  interrupts:
45    maxItems: 1
46
47  interrupt-names:
48    maxItems: 1
49
50  interconnects:
51    minItems: 1
52    maxItems: 2
53
54  interconnect-names:
55    minItems: 1
56    items:
57      - const: gfx-mem
58      - const: ocmem
59
60  iommus:
61    minItems: 1
62    maxItems: 64
63
64  sram:
65    $ref: /schemas/types.yaml#/definitions/phandle-array
66    minItems: 1
67    maxItems: 4
68    items:
69      maxItems: 1
70    description: |
71      phandles to one or more reserved on-chip SRAM regions.
72      phandle to the On Chip Memory (OCMEM) that's present on some a3xx and
73      a4xx Snapdragon SoCs. See
74      Documentation/devicetree/bindings/sram/qcom,ocmem.yaml
75
76  operating-points-v2: true
77  opp-table:
78    type: object
79
80  power-domains:
81    maxItems: 1
82
83  zap-shader:
84    type: object
85    additionalProperties: false
86    description: |
87      For a5xx and a6xx devices this node contains a memory-region that
88      points to reserved memory to store the zap shader that can be used to
89      help bring the GPU out of secure mode.
90    properties:
91      memory-region:
92        maxItems: 1
93
94      firmware-name:
95        description: |
96          Default name of the firmware to load to the remote processor.
97
98  "#cooling-cells":
99    const: 2
100
101  nvmem-cell-names:
102    maxItems: 1
103
104  nvmem-cells:
105    description: efuse registers
106    maxItems: 1
107
108  qcom,gmu:
109    $ref: /schemas/types.yaml#/definitions/phandle
110    description: |
111      For GMU attached devices a phandle to the GMU device that will
112      control the power for the GPU.
113
114
115required:
116  - compatible
117  - reg
118  - interrupts
119
120additionalProperties: false
121
122allOf:
123  - if:
124      properties:
125        compatible:
126          contains:
127            pattern: '^qcom,adreno-[3-5][0-9][0-9]\.[0-9]$'
128
129    then:
130      properties:
131        clocks:
132          minItems: 2
133          maxItems: 7
134
135        clock-names:
136          items:
137            anyOf:
138              - const: core
139                description: GPU Core clock
140              - const: iface
141                description: GPU Interface clock
142              - const: mem
143                description: GPU Memory clock
144              - const: mem_iface
145                description: GPU Memory Interface clock
146              - const: alt_mem_iface
147                description: GPU Alternative Memory Interface clock
148              - const: gfx3d
149                description: GPU 3D engine clock
150              - const: rbbmtimer
151                description: GPU RBBM Timer for Adreno 5xx series
152              - const: rbcpr
153                description: GPU RB Core Power Reduction clock
154          minItems: 2
155          maxItems: 7
156
157      required:
158        - clocks
159        - clock-names
160  - if:
161      properties:
162        compatible:
163          contains:
164            pattern: '^qcom,adreno-6[0-9][0-9]\.[0-9]$'
165
166    then: # Since Adreno 6xx series clocks should be defined in GMU
167      properties:
168        clocks: false
169        clock-names: false
170
171examples:
172  - |
173
174    // Example a3xx/4xx:
175
176    #include <dt-bindings/clock/qcom,mmcc-msm8974.h>
177    #include <dt-bindings/clock/qcom,rpmcc.h>
178    #include <dt-bindings/interrupt-controller/irq.h>
179    #include <dt-bindings/interrupt-controller/arm-gic.h>
180
181    gpu: gpu@fdb00000 {
182        compatible = "qcom,adreno-330.2", "qcom,adreno";
183
184        reg = <0xfdb00000 0x10000>;
185        reg-names = "kgsl_3d0_reg_memory";
186
187        clock-names = "core", "iface", "mem_iface";
188        clocks = <&mmcc OXILI_GFX3D_CLK>,
189                 <&mmcc OXILICX_AHB_CLK>,
190                 <&mmcc OXILICX_AXI_CLK>;
191
192        interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
193        interrupt-names = "kgsl_3d0_irq";
194
195        sram = <&gpu_sram>;
196        power-domains = <&mmcc OXILICX_GDSC>;
197        operating-points-v2 = <&gpu_opp_table>;
198        iommus = <&gpu_iommu 0>;
199        #cooling-cells = <2>;
200    };
201
202    ocmem@fdd00000 {
203        compatible = "qcom,msm8974-ocmem";
204
205        reg = <0xfdd00000 0x2000>,
206              <0xfec00000 0x180000>;
207        reg-names = "ctrl", "mem";
208
209        clocks = <&rpmcc RPM_SMD_OCMEMGX_CLK>,
210                 <&mmcc OCMEMCX_OCMEMNOC_CLK>;
211        clock-names = "core", "iface";
212
213        #address-cells = <1>;
214        #size-cells = <1>;
215        ranges = <0 0xfec00000 0x100000>;
216
217        gpu_sram: gpu-sram@0 {
218            reg = <0x0 0x100000>;
219        };
220    };
221  - |
222
223    // Example a6xx (with GMU):
224
225    #include <dt-bindings/clock/qcom,gpucc-sdm845.h>
226    #include <dt-bindings/clock/qcom,gcc-sdm845.h>
227    #include <dt-bindings/power/qcom-rpmpd.h>
228    #include <dt-bindings/interrupt-controller/irq.h>
229    #include <dt-bindings/interrupt-controller/arm-gic.h>
230    #include <dt-bindings/interconnect/qcom,sdm845.h>
231
232    reserved-memory {
233        #address-cells = <2>;
234        #size-cells = <2>;
235
236        zap_shader_region: gpu@8f200000 {
237            compatible = "shared-dma-pool";
238            reg = <0x0 0x90b00000 0x0 0xa00000>;
239            no-map;
240        };
241    };
242
243    gpu@5000000 {
244        compatible = "qcom,adreno-630.2", "qcom,adreno";
245
246        reg = <0x5000000 0x40000>, <0x509e000 0x10>;
247        reg-names = "kgsl_3d0_reg_memory", "cx_mem";
248
249        #cooling-cells = <2>;
250
251        interrupts = <GIC_SPI 300 IRQ_TYPE_LEVEL_HIGH>;
252
253        iommus = <&adreno_smmu 0>;
254
255        operating-points-v2 = <&gpu_opp_table>;
256
257        interconnects = <&rsc_hlos MASTER_GFX3D &rsc_hlos SLAVE_EBI1>;
258        interconnect-names = "gfx-mem";
259
260        qcom,gmu = <&gmu>;
261
262        gpu_opp_table: opp-table {
263            compatible = "operating-points-v2";
264
265            opp-430000000 {
266                opp-hz = /bits/ 64 <430000000>;
267                opp-level = <RPMH_REGULATOR_LEVEL_SVS_L1>;
268                opp-peak-kBps = <5412000>;
269            };
270
271            opp-355000000 {
272                opp-hz = /bits/ 64 <355000000>;
273                opp-level = <RPMH_REGULATOR_LEVEL_SVS>;
274                opp-peak-kBps = <3072000>;
275            };
276
277            opp-267000000 {
278                opp-hz = /bits/ 64 <267000000>;
279                opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS>;
280                opp-peak-kBps = <3072000>;
281            };
282
283            opp-180000000 {
284                opp-hz = /bits/ 64 <180000000>;
285                opp-level = <RPMH_REGULATOR_LEVEL_MIN_SVS>;
286                opp-peak-kBps = <1804000>;
287            };
288        };
289
290        zap-shader {
291            memory-region = <&zap_shader_region>;
292            firmware-name = "qcom/LENOVO/81JL/qcdxkmsuc850.mbn";
293        };
294    };
295