xref: /freebsd/sys/contrib/device-tree/Bindings/arm/psci.yaml (revision f126890ac5386406dadf7c4cfa9566cbb56537c5)
1c66ec88fSEmmanuel Vadot# SPDX-License-Identifier: GPL-2.0
2c66ec88fSEmmanuel Vadot%YAML 1.2
3c66ec88fSEmmanuel Vadot---
4c66ec88fSEmmanuel Vadot$id: http://devicetree.org/schemas/arm/psci.yaml#
5c66ec88fSEmmanuel Vadot$schema: http://devicetree.org/meta-schemas/core.yaml#
6c66ec88fSEmmanuel Vadot
7c66ec88fSEmmanuel Vadottitle: Power State Coordination Interface (PSCI)
8c66ec88fSEmmanuel Vadot
9c66ec88fSEmmanuel Vadotmaintainers:
10c66ec88fSEmmanuel Vadot  - Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
11c66ec88fSEmmanuel Vadot
12c66ec88fSEmmanuel Vadotdescription: |+
13c66ec88fSEmmanuel Vadot  Firmware implementing the PSCI functions described in ARM document number
14c66ec88fSEmmanuel Vadot  ARM DEN 0022A ("Power State Coordination Interface System Software on ARM
15c66ec88fSEmmanuel Vadot  processors") can be used by Linux to initiate various CPU-centric power
16c66ec88fSEmmanuel Vadot  operations.
17c66ec88fSEmmanuel Vadot
18c66ec88fSEmmanuel Vadot  Issue A of the specification describes functions for CPU suspend, hotplug
19c66ec88fSEmmanuel Vadot  and migration of secure software.
20c66ec88fSEmmanuel Vadot
21c66ec88fSEmmanuel Vadot  Functions are invoked by trapping to the privilege level of the PSCI
22c66ec88fSEmmanuel Vadot  firmware (specified as part of the binding below) and passing arguments
23c66ec88fSEmmanuel Vadot  in a manner similar to that specified by AAPCS:
24c66ec88fSEmmanuel Vadot
25c66ec88fSEmmanuel Vadot     r0       => 32-bit Function ID / return value
26c66ec88fSEmmanuel Vadot    {r1 - r3}	=> Parameters
27c66ec88fSEmmanuel Vadot
28c66ec88fSEmmanuel Vadot  Note that the immediate field of the trapping instruction must be set
29c66ec88fSEmmanuel Vadot  to #0.
30c66ec88fSEmmanuel Vadot
31c66ec88fSEmmanuel Vadot  [2] Power State Coordination Interface (PSCI) specification
32c66ec88fSEmmanuel Vadot    http://infocenter.arm.com/help/topic/com.arm.doc.den0022c/DEN0022C_Power_State_Coordination_Interface.pdf
33c66ec88fSEmmanuel Vadot
34c66ec88fSEmmanuel Vadotproperties:
35c66ec88fSEmmanuel Vadot  $nodename:
36c66ec88fSEmmanuel Vadot    const: psci
37c66ec88fSEmmanuel Vadot
38c66ec88fSEmmanuel Vadot  compatible:
39c66ec88fSEmmanuel Vadot    oneOf:
40c66ec88fSEmmanuel Vadot      - description:
41c66ec88fSEmmanuel Vadot          For implementations complying to PSCI versions prior to 0.2.
42c66ec88fSEmmanuel Vadot        const: arm,psci
43c66ec88fSEmmanuel Vadot
44c66ec88fSEmmanuel Vadot      - description:
45c66ec88fSEmmanuel Vadot          For implementations complying to PSCI 0.2.
46c66ec88fSEmmanuel Vadot          Function IDs are not required and should be ignored by an OS with
47c66ec88fSEmmanuel Vadot          PSCI 0.2 support, but are permitted to be present for compatibility
48c66ec88fSEmmanuel Vadot          with existing software when "arm,psci" is later in the compatible
49c66ec88fSEmmanuel Vadot          list.
507ef62cebSEmmanuel Vadot        minItems: 1
51c66ec88fSEmmanuel Vadot        items:
52c66ec88fSEmmanuel Vadot          - const: arm,psci-0.2
53c66ec88fSEmmanuel Vadot          - const: arm,psci
54c66ec88fSEmmanuel Vadot
55c66ec88fSEmmanuel Vadot      - description:
56c66ec88fSEmmanuel Vadot          For implementations complying to PSCI 1.0.
57c66ec88fSEmmanuel Vadot          PSCI 1.0 is backward compatible with PSCI 0.2 with minor
58c66ec88fSEmmanuel Vadot          specification updates, as defined in the PSCI specification[2].
597ef62cebSEmmanuel Vadot        minItems: 1
60c66ec88fSEmmanuel Vadot        items:
61c66ec88fSEmmanuel Vadot          - const: arm,psci-1.0
62c66ec88fSEmmanuel Vadot          - const: arm,psci-0.2
637ef62cebSEmmanuel Vadot          - const: arm,psci
64c66ec88fSEmmanuel Vadot
65c66ec88fSEmmanuel Vadot  method:
66c66ec88fSEmmanuel Vadot    description: The method of calling the PSCI firmware.
67c66ec88fSEmmanuel Vadot    $ref: /schemas/types.yaml#/definitions/string-array
68c66ec88fSEmmanuel Vadot    enum:
69c66ec88fSEmmanuel Vadot      - smc
70c66ec88fSEmmanuel Vadot      # HVC #0, with the register assignments specified in this binding.
71c66ec88fSEmmanuel Vadot      - hvc
72c66ec88fSEmmanuel Vadot
73c66ec88fSEmmanuel Vadot  cpu_suspend:
74c66ec88fSEmmanuel Vadot    $ref: /schemas/types.yaml#/definitions/uint32
75c66ec88fSEmmanuel Vadot    description: Function ID for CPU_SUSPEND operation
76c66ec88fSEmmanuel Vadot
77c66ec88fSEmmanuel Vadot  cpu_off:
78c66ec88fSEmmanuel Vadot    $ref: /schemas/types.yaml#/definitions/uint32
79c66ec88fSEmmanuel Vadot    description: Function ID for CPU_OFF operation
80c66ec88fSEmmanuel Vadot
81c66ec88fSEmmanuel Vadot  cpu_on:
82c66ec88fSEmmanuel Vadot    $ref: /schemas/types.yaml#/definitions/uint32
83c66ec88fSEmmanuel Vadot    description: Function ID for CPU_ON operation
84c66ec88fSEmmanuel Vadot
85c66ec88fSEmmanuel Vadot  migrate:
86c66ec88fSEmmanuel Vadot    $ref: /schemas/types.yaml#/definitions/uint32
87c66ec88fSEmmanuel Vadot    description: Function ID for MIGRATE operation
88c66ec88fSEmmanuel Vadot
89c66ec88fSEmmanuel Vadot  arm,psci-suspend-param:
90c66ec88fSEmmanuel Vadot    $ref: /schemas/types.yaml#/definitions/uint32
91c66ec88fSEmmanuel Vadot    description: |
92c66ec88fSEmmanuel Vadot      power_state parameter to pass to the PSCI suspend call.
93c66ec88fSEmmanuel Vadot
94c66ec88fSEmmanuel Vadot      Device tree nodes that require usage of PSCI CPU_SUSPEND function (ie
95c66ec88fSEmmanuel Vadot      idle state nodes with entry-method property is set to "psci", as per
96c66ec88fSEmmanuel Vadot      bindings in [1]) must specify this property.
97c66ec88fSEmmanuel Vadot
98c66ec88fSEmmanuel Vadot      [1] Kernel documentation - ARM idle states bindings
99c9ccf3a3SEmmanuel Vadot        Documentation/devicetree/bindings/cpu/idle-states.yaml
100c66ec88fSEmmanuel Vadot
101c66ec88fSEmmanuel VadotpatternProperties:
102c66ec88fSEmmanuel Vadot  "^power-domain-":
103*f126890aSEmmanuel Vadot    $ref: /schemas/power/power-domain.yaml#
104c66ec88fSEmmanuel Vadot
105c66ec88fSEmmanuel Vadot    type: object
106c66ec88fSEmmanuel Vadot    description: |
107c66ec88fSEmmanuel Vadot      ARM systems can have multiple cores, sometimes in an hierarchical
108c66ec88fSEmmanuel Vadot      arrangement. This often, but not always, maps directly to the processor
109c66ec88fSEmmanuel Vadot      power topology of the system. Individual nodes in a topology have their
110c66ec88fSEmmanuel Vadot      own specific power states and can be better represented hierarchically.
111c66ec88fSEmmanuel Vadot
112c66ec88fSEmmanuel Vadot      For these cases, the definitions of the idle states for the CPUs and the
113c66ec88fSEmmanuel Vadot      CPU topology, must conform to the binding in [3]. The idle states
114c66ec88fSEmmanuel Vadot      themselves must conform to the binding in [4] and must specify the
115c66ec88fSEmmanuel Vadot      arm,psci-suspend-param property.
116c66ec88fSEmmanuel Vadot
117c66ec88fSEmmanuel Vadot      It should also be noted that, in PSCI firmware v1.0 the OS-Initiated
118c66ec88fSEmmanuel Vadot      (OSI) CPU suspend mode is introduced. Using a hierarchical representation
119c66ec88fSEmmanuel Vadot      helps to implement support for OSI mode and OS implementations may choose
120c66ec88fSEmmanuel Vadot      to mandate it.
121c66ec88fSEmmanuel Vadot
122c66ec88fSEmmanuel Vadot      [3] Documentation/devicetree/bindings/power/power-domain.yaml
123c66ec88fSEmmanuel Vadot      [4] Documentation/devicetree/bindings/power/domain-idle-state.yaml
124c66ec88fSEmmanuel Vadot
125c66ec88fSEmmanuel Vadotrequired:
126c66ec88fSEmmanuel Vadot  - compatible
127c66ec88fSEmmanuel Vadot  - method
128c66ec88fSEmmanuel Vadot
129c66ec88fSEmmanuel VadotallOf:
130c66ec88fSEmmanuel Vadot  - if:
131c66ec88fSEmmanuel Vadot      properties:
132c66ec88fSEmmanuel Vadot        compatible:
133c66ec88fSEmmanuel Vadot          contains:
134c66ec88fSEmmanuel Vadot            const: arm,psci
135c66ec88fSEmmanuel Vadot    then:
136c66ec88fSEmmanuel Vadot      required:
137c66ec88fSEmmanuel Vadot        - cpu_off
138c66ec88fSEmmanuel Vadot        - cpu_on
139c66ec88fSEmmanuel Vadot
140c66ec88fSEmmanuel VadotadditionalProperties: false
141c66ec88fSEmmanuel Vadot
142c66ec88fSEmmanuel Vadotexamples:
143c66ec88fSEmmanuel Vadot  - |+
144c66ec88fSEmmanuel Vadot
145c66ec88fSEmmanuel Vadot    // Case 1: PSCI v0.1 only.
146c66ec88fSEmmanuel Vadot
147c66ec88fSEmmanuel Vadot    psci {
148c66ec88fSEmmanuel Vadot      compatible      = "arm,psci";
149c66ec88fSEmmanuel Vadot      method          = "smc";
150c66ec88fSEmmanuel Vadot      cpu_suspend     = <0x95c10000>;
151c66ec88fSEmmanuel Vadot      cpu_off         = <0x95c10001>;
152c66ec88fSEmmanuel Vadot      cpu_on          = <0x95c10002>;
153c66ec88fSEmmanuel Vadot      migrate         = <0x95c10003>;
154c66ec88fSEmmanuel Vadot    };
155c66ec88fSEmmanuel Vadot
156c66ec88fSEmmanuel Vadot  - |+
157c66ec88fSEmmanuel Vadot
158c66ec88fSEmmanuel Vadot    // Case 2: PSCI v0.2 only
159c66ec88fSEmmanuel Vadot
160c66ec88fSEmmanuel Vadot    psci {
161c66ec88fSEmmanuel Vadot      compatible      = "arm,psci-0.2";
162c66ec88fSEmmanuel Vadot      method          = "smc";
163c66ec88fSEmmanuel Vadot    };
164c66ec88fSEmmanuel Vadot
165c66ec88fSEmmanuel Vadot
166c66ec88fSEmmanuel Vadot  - |+
167c66ec88fSEmmanuel Vadot
168c66ec88fSEmmanuel Vadot    // Case 3: PSCI v0.2 and PSCI v0.1.
169c66ec88fSEmmanuel Vadot
170c66ec88fSEmmanuel Vadot    /*
171c66ec88fSEmmanuel Vadot     * A DTB may provide IDs for use by kernels without PSCI 0.2 support,
172c66ec88fSEmmanuel Vadot     * enabling firmware and hypervisors to support existing and new kernels.
173c66ec88fSEmmanuel Vadot     * These IDs will be ignored by kernels with PSCI 0.2 support, which will
174c66ec88fSEmmanuel Vadot     * use the standard PSCI 0.2 IDs exclusively.
175c66ec88fSEmmanuel Vadot     */
176c66ec88fSEmmanuel Vadot
177c66ec88fSEmmanuel Vadot    psci {
178c66ec88fSEmmanuel Vadot      compatible = "arm,psci-0.2", "arm,psci";
179c66ec88fSEmmanuel Vadot      method = "hvc";
180c66ec88fSEmmanuel Vadot
181c66ec88fSEmmanuel Vadot      cpu_on = <0x95c10002>;
182c66ec88fSEmmanuel Vadot      cpu_off = <0x95c10001>;
183c66ec88fSEmmanuel Vadot    };
184c66ec88fSEmmanuel Vadot
185c66ec88fSEmmanuel Vadot  - |+
186c66ec88fSEmmanuel Vadot
187c66ec88fSEmmanuel Vadot    // Case 4: CPUs and CPU idle states described using the hierarchical model.
188c66ec88fSEmmanuel Vadot
189c66ec88fSEmmanuel Vadot    cpus {
190c66ec88fSEmmanuel Vadot      #size-cells = <0>;
191c66ec88fSEmmanuel Vadot      #address-cells = <1>;
192c66ec88fSEmmanuel Vadot
193c66ec88fSEmmanuel Vadot      CPU0: cpu@0 {
194c66ec88fSEmmanuel Vadot        device_type = "cpu";
195c66ec88fSEmmanuel Vadot        compatible = "arm,cortex-a53";
196c66ec88fSEmmanuel Vadot        reg = <0x0>;
197c66ec88fSEmmanuel Vadot        enable-method = "psci";
198c66ec88fSEmmanuel Vadot        power-domains = <&CPU_PD0>;
199c66ec88fSEmmanuel Vadot        power-domain-names = "psci";
200c66ec88fSEmmanuel Vadot      };
201c66ec88fSEmmanuel Vadot
202c66ec88fSEmmanuel Vadot      CPU1: cpu@1 {
203c66ec88fSEmmanuel Vadot        device_type = "cpu";
204c66ec88fSEmmanuel Vadot        compatible = "arm,cortex-a53";
205c66ec88fSEmmanuel Vadot        reg = <0x100>;
206c66ec88fSEmmanuel Vadot        enable-method = "psci";
207c66ec88fSEmmanuel Vadot        power-domains = <&CPU_PD1>;
208c66ec88fSEmmanuel Vadot        power-domain-names = "psci";
209c66ec88fSEmmanuel Vadot      };
210c66ec88fSEmmanuel Vadot
211c66ec88fSEmmanuel Vadot      idle-states {
212c66ec88fSEmmanuel Vadot
213c66ec88fSEmmanuel Vadot        CPU_PWRDN: cpu-power-down {
214c66ec88fSEmmanuel Vadot          compatible = "arm,idle-state";
215c66ec88fSEmmanuel Vadot          arm,psci-suspend-param = <0x0000001>;
216c66ec88fSEmmanuel Vadot          entry-latency-us = <10>;
217c66ec88fSEmmanuel Vadot          exit-latency-us = <10>;
218c66ec88fSEmmanuel Vadot          min-residency-us = <100>;
219c66ec88fSEmmanuel Vadot        };
220c66ec88fSEmmanuel Vadot      };
221c66ec88fSEmmanuel Vadot
222c66ec88fSEmmanuel Vadot      domain-idle-states {
223c66ec88fSEmmanuel Vadot
224c66ec88fSEmmanuel Vadot        CLUSTER_RET: cluster-retention {
225c66ec88fSEmmanuel Vadot          compatible = "domain-idle-state";
226c66ec88fSEmmanuel Vadot          arm,psci-suspend-param = <0x1000011>;
227c66ec88fSEmmanuel Vadot          entry-latency-us = <500>;
228c66ec88fSEmmanuel Vadot          exit-latency-us = <500>;
229c66ec88fSEmmanuel Vadot          min-residency-us = <2000>;
230c66ec88fSEmmanuel Vadot        };
231c66ec88fSEmmanuel Vadot
232c66ec88fSEmmanuel Vadot        CLUSTER_PWRDN: cluster-power-down {
233c66ec88fSEmmanuel Vadot          compatible = "domain-idle-state";
234c66ec88fSEmmanuel Vadot          arm,psci-suspend-param = <0x1000031>;
235c66ec88fSEmmanuel Vadot          entry-latency-us = <2000>;
236c66ec88fSEmmanuel Vadot          exit-latency-us = <2000>;
237c66ec88fSEmmanuel Vadot          min-residency-us = <6000>;
238c66ec88fSEmmanuel Vadot        };
239c66ec88fSEmmanuel Vadot      };
240c66ec88fSEmmanuel Vadot    };
241c66ec88fSEmmanuel Vadot
242c66ec88fSEmmanuel Vadot    psci {
243c66ec88fSEmmanuel Vadot      compatible = "arm,psci-1.0";
244c66ec88fSEmmanuel Vadot      method = "smc";
245c66ec88fSEmmanuel Vadot
246c66ec88fSEmmanuel Vadot      CPU_PD0: power-domain-cpu0 {
247c66ec88fSEmmanuel Vadot        #power-domain-cells = <0>;
248c66ec88fSEmmanuel Vadot        domain-idle-states = <&CPU_PWRDN>;
249c66ec88fSEmmanuel Vadot        power-domains = <&CLUSTER_PD>;
250c66ec88fSEmmanuel Vadot      };
251c66ec88fSEmmanuel Vadot
252c66ec88fSEmmanuel Vadot      CPU_PD1: power-domain-cpu1 {
253c66ec88fSEmmanuel Vadot        #power-domain-cells = <0>;
254c66ec88fSEmmanuel Vadot        domain-idle-states =  <&CPU_PWRDN>;
255c66ec88fSEmmanuel Vadot        power-domains = <&CLUSTER_PD>;
256c66ec88fSEmmanuel Vadot      };
257c66ec88fSEmmanuel Vadot
258c66ec88fSEmmanuel Vadot      CLUSTER_PD: power-domain-cluster {
259c66ec88fSEmmanuel Vadot        #power-domain-cells = <0>;
260c66ec88fSEmmanuel Vadot        domain-idle-states = <&CLUSTER_RET>, <&CLUSTER_PWRDN>;
261c66ec88fSEmmanuel Vadot      };
262c66ec88fSEmmanuel Vadot    };
263c66ec88fSEmmanuel Vadot...
264