xref: /freebsd/sys/contrib/device-tree/Bindings/firmware/arm,scmi.yaml (revision a0ca4af9455b844c5e094fc1b09b1390ffa979fc)
1# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
2# Copyright 2021 ARM Ltd.
3%YAML 1.2
4---
5$id: http://devicetree.org/schemas/firmware/arm,scmi.yaml#
6$schema: http://devicetree.org/meta-schemas/core.yaml#
7
8title: System Control and Management Interface (SCMI) Message Protocol
9
10maintainers:
11  - Sudeep Holla <sudeep.holla@arm.com>
12
13description: |
14  The SCMI is intended to allow agents such as OSPM to manage various functions
15  that are provided by the hardware platform it is running on, including power
16  and performance functions.
17
18  This binding is intended to define the interface the firmware implementing
19  the SCMI as described in ARM document number ARM DEN 0056 ("ARM System Control
20  and Management Interface Platform Design Document")[0] provide for OSPM in
21  the device tree.
22
23  [0] https://developer.arm.com/documentation/den0056/latest
24
25properties:
26  $nodename:
27    const: scmi
28
29  compatible:
30    oneOf:
31      - description: SCMI compliant firmware with mailbox transport
32        items:
33          - const: arm,scmi
34      - description: SCMI compliant firmware with ARM SMC/HVC transport
35        items:
36          - const: arm,scmi-smc
37      - description: SCMI compliant firmware with ARM SMC/HVC transport
38                     with shmem address(4KB-page, offset) as parameters
39        items:
40          - const: arm,scmi-smc-param
41      - description: SCMI compliant firmware with Qualcomm SMC/HVC transport
42        items:
43          - const: qcom,scmi-smc
44      - description: SCMI compliant firmware with SCMI Virtio transport.
45                     The virtio transport only supports a single device.
46        items:
47          - const: arm,scmi-virtio
48      - description: SCMI compliant firmware with OP-TEE transport
49        items:
50          - const: linaro,scmi-optee
51
52  interrupts:
53    description:
54      The interrupt that indicates message completion by the platform
55      rather than by the return of the smc call. This should not be used
56      except when the platform requires such behavior.
57    maxItems: 1
58
59  interrupt-names:
60    const: a2p
61
62  mbox-names:
63    description:
64      Specifies the mailboxes used to communicate with SCMI compliant
65      firmware.
66    oneOf:
67      - items:
68          - const: tx
69          - const: rx
70        minItems: 1
71      - items:
72          - const: tx
73          - const: tx_reply
74          - const: rx
75        minItems: 2
76
77  mboxes:
78    description:
79      List of phandle and mailbox channel specifiers. It should contain
80      exactly one, two or three mailboxes; the first one or two for transmitting
81      messages ("tx") and another optional ("rx") for receiving notifications
82      and delayed responses, if supported by the platform.
83      The number of mailboxes needed for transmitting messages depends on the
84      type of channels exposed by the specific underlying mailbox controller;
85      one single channel descriptor is enough if such channel is bidirectional,
86      while two channel descriptors are needed to represent the SCMI ("tx")
87      channel if the underlying mailbox channels are of unidirectional type.
88      The effective combination in numbers of mboxes and shmem descriptors let
89      the SCMI subsystem determine unambiguosly which type of SCMI channels are
90      made available by the underlying mailbox controller and how to use them.
91       1 mbox / 1 shmem => SCMI TX over 1 mailbox bidirectional channel
92       2 mbox / 2 shmem => SCMI TX and RX over 2 mailbox bidirectional channels
93       2 mbox / 1 shmem => SCMI TX over 2 mailbox unidirectional channels
94       3 mbox / 2 shmem => SCMI TX and RX over 3 mailbox unidirectional channels
95      Any other combination of mboxes and shmem is invalid.
96    minItems: 1
97    maxItems: 3
98
99  shmem:
100    description:
101      List of phandle pointing to the shared memory(SHM) area, for each
102      transport channel specified.
103    minItems: 1
104    maxItems: 2
105
106  '#address-cells':
107    const: 1
108
109  '#size-cells':
110    const: 0
111
112  atomic-threshold-us:
113    description:
114      An optional time value, expressed in microseconds, representing, on this
115      platform, the threshold above which any SCMI command, advertised to have
116      an higher-than-threshold execution latency, should not be considered for
117      atomic mode of operation, even if requested.
118    default: 0
119
120  arm,smc-id:
121    $ref: /schemas/types.yaml#/definitions/uint32
122    description:
123      SMC id required when using smc or hvc transports
124
125  linaro,optee-channel-id:
126    $ref: /schemas/types.yaml#/definitions/uint32
127    description:
128      Channel specifier required when using OP-TEE transport.
129
130  protocol@11:
131    $ref: '#/$defs/protocol-node'
132    unevaluatedProperties: false
133
134    properties:
135      reg:
136        const: 0x11
137
138      '#power-domain-cells':
139        const: 1
140
141    required:
142      - '#power-domain-cells'
143
144  protocol@13:
145    $ref: '#/$defs/protocol-node'
146    unevaluatedProperties: false
147
148    properties:
149      reg:
150        const: 0x13
151
152      '#clock-cells':
153        const: 1
154
155      '#power-domain-cells':
156        const: 1
157
158    oneOf:
159      - required:
160          - '#clock-cells'
161
162      - required:
163          - '#power-domain-cells'
164
165  protocol@14:
166    $ref: '#/$defs/protocol-node'
167    unevaluatedProperties: false
168
169    properties:
170      reg:
171        const: 0x14
172
173      '#clock-cells':
174        const: 1
175
176    required:
177      - '#clock-cells'
178
179  protocol@15:
180    $ref: '#/$defs/protocol-node'
181    unevaluatedProperties: false
182
183    properties:
184      reg:
185        const: 0x15
186
187      '#thermal-sensor-cells':
188        const: 1
189
190    required:
191      - '#thermal-sensor-cells'
192
193  protocol@16:
194    $ref: '#/$defs/protocol-node'
195    unevaluatedProperties: false
196
197    properties:
198      reg:
199        const: 0x16
200
201      '#reset-cells':
202        const: 1
203
204    required:
205      - '#reset-cells'
206
207  protocol@17:
208    $ref: '#/$defs/protocol-node'
209    unevaluatedProperties: false
210
211    properties:
212      reg:
213        const: 0x17
214
215      regulators:
216        type: object
217        additionalProperties: false
218        description:
219          The list of all regulators provided by this SCMI controller.
220
221        properties:
222          '#address-cells':
223            const: 1
224
225          '#size-cells':
226            const: 0
227
228        patternProperties:
229          '^regulator@[0-9a-f]+$':
230            type: object
231            $ref: /schemas/regulator/regulator.yaml#
232            unevaluatedProperties: false
233
234            properties:
235              reg:
236                maxItems: 1
237                description: Identifier for the voltage regulator.
238
239            required:
240              - reg
241
242  protocol@18:
243    $ref: '#/$defs/protocol-node'
244    unevaluatedProperties: false
245
246    properties:
247      reg:
248        const: 0x18
249
250additionalProperties: false
251
252$defs:
253  protocol-node:
254    type: object
255    description:
256      Each sub-node represents a protocol supported. If the platform
257      supports a dedicated communication channel for a particular protocol,
258      then the corresponding transport properties must be present.
259      The virtio transport does not support a dedicated communication channel.
260
261    properties:
262      reg:
263        maxItems: 1
264
265      mbox-names:
266        oneOf:
267          - items:
268              - const: tx
269              - const: rx
270            minItems: 1
271          - items:
272              - const: tx
273              - const: tx_reply
274              - const: rx
275            minItems: 2
276
277      mboxes:
278        minItems: 1
279        maxItems: 3
280
281      shmem:
282        minItems: 1
283        maxItems: 2
284
285      linaro,optee-channel-id:
286        $ref: /schemas/types.yaml#/definitions/uint32
287        description:
288          Channel specifier required when using OP-TEE transport and
289          protocol has a dedicated communication channel.
290
291    required:
292      - reg
293
294required:
295  - compatible
296
297if:
298  properties:
299    compatible:
300      contains:
301        const: arm,scmi
302then:
303  properties:
304    interrupts: false
305    interrupt-names: false
306
307  required:
308    - mboxes
309    - shmem
310
311else:
312  if:
313    properties:
314      compatible:
315        contains:
316          enum:
317            - arm,scmi-smc
318            - arm,scmi-smc-param
319            - qcom,scmi-smc
320  then:
321    required:
322      - arm,smc-id
323      - shmem
324
325  else:
326    if:
327      properties:
328        compatible:
329          contains:
330            const: linaro,scmi-optee
331    then:
332      required:
333        - linaro,optee-channel-id
334
335examples:
336  - |
337    firmware {
338        scmi {
339            compatible = "arm,scmi";
340            mboxes = <&mhuB 0 0>,
341                     <&mhuB 0 1>;
342            mbox-names = "tx", "rx";
343            shmem = <&cpu_scp_lpri0>,
344                    <&cpu_scp_lpri1>;
345
346            #address-cells = <1>;
347            #size-cells = <0>;
348
349            atomic-threshold-us = <10000>;
350
351            scmi_devpd: protocol@11 {
352                reg = <0x11>;
353                #power-domain-cells = <1>;
354            };
355
356            scmi_dvfs: protocol@13 {
357                reg = <0x13>;
358                #clock-cells = <1>;
359
360                mboxes = <&mhuB 1 0>,
361                         <&mhuB 1 1>;
362                mbox-names = "tx", "rx";
363                shmem = <&cpu_scp_hpri0>,
364                        <&cpu_scp_hpri1>;
365            };
366
367            scmi_clk: protocol@14 {
368                reg = <0x14>;
369                #clock-cells = <1>;
370            };
371
372            scmi_sensors: protocol@15 {
373                reg = <0x15>;
374                #thermal-sensor-cells = <1>;
375            };
376
377            scmi_reset: protocol@16 {
378                reg = <0x16>;
379                #reset-cells = <1>;
380            };
381
382            scmi_voltage: protocol@17 {
383                reg = <0x17>;
384                regulators {
385                    #address-cells = <1>;
386                    #size-cells = <0>;
387
388                    regulator_devX: regulator@0 {
389                        reg = <0x0>;
390                        regulator-max-microvolt = <3300000>;
391                    };
392
393                    regulator_devY: regulator@9 {
394                        reg = <0x9>;
395                        regulator-min-microvolt = <500000>;
396                        regulator-max-microvolt = <4200000>;
397                    };
398                };
399            };
400
401            scmi_powercap: protocol@18 {
402                reg = <0x18>;
403            };
404        };
405    };
406
407    soc {
408        #address-cells = <2>;
409        #size-cells = <2>;
410
411        sram@50000000 {
412            compatible = "mmio-sram";
413            reg = <0x0 0x50000000 0x0 0x10000>;
414
415            #address-cells = <1>;
416            #size-cells = <1>;
417            ranges = <0 0x0 0x50000000 0x10000>;
418
419            cpu_scp_lpri0: scp-sram-section@0 {
420                compatible = "arm,scmi-shmem";
421                reg = <0x0 0x80>;
422            };
423
424            cpu_scp_lpri1: scp-sram-section@80 {
425                compatible = "arm,scmi-shmem";
426                reg = <0x80 0x80>;
427            };
428
429            cpu_scp_hpri0: scp-sram-section@100 {
430                compatible = "arm,scmi-shmem";
431                reg = <0x100 0x80>;
432            };
433
434            cpu_scp_hpri2: scp-sram-section@180 {
435                compatible = "arm,scmi-shmem";
436                reg = <0x180 0x80>;
437            };
438        };
439    };
440
441  - |
442    firmware {
443        scmi {
444            compatible = "arm,scmi-smc";
445            shmem = <&cpu_scp_lpri0>, <&cpu_scp_lpri1>;
446            arm,smc-id = <0xc3000001>;
447
448            #address-cells = <1>;
449            #size-cells = <0>;
450
451            scmi_devpd1: protocol@11 {
452                reg = <0x11>;
453                #power-domain-cells = <1>;
454            };
455        };
456    };
457
458  - |
459    firmware {
460        scmi {
461            compatible = "linaro,scmi-optee";
462            linaro,optee-channel-id = <0>;
463
464            #address-cells = <1>;
465            #size-cells = <0>;
466
467            scmi_dvfs1: protocol@13 {
468                reg = <0x13>;
469                linaro,optee-channel-id = <1>;
470                shmem = <&cpu_optee_lpri0>;
471                #clock-cells = <1>;
472            };
473
474            scmi_clk0: protocol@14 {
475                reg = <0x14>;
476                #clock-cells = <1>;
477            };
478        };
479    };
480
481    soc {
482        #address-cells = <2>;
483        #size-cells = <2>;
484
485        sram@51000000 {
486            compatible = "mmio-sram";
487            reg = <0x0 0x51000000 0x0 0x10000>;
488
489            #address-cells = <1>;
490            #size-cells = <1>;
491            ranges = <0 0x0 0x51000000 0x10000>;
492
493            cpu_optee_lpri0: optee-sram-section@0 {
494                compatible = "arm,scmi-shmem";
495                reg = <0x0 0x80>;
496            };
497        };
498    };
499
500...
501