xref: /freebsd/sys/contrib/device-tree/Bindings/cpu/idle-states.yaml (revision b2d2a78ad80ec68d4a17f5aef97d21686cb1e29b)
1c9ccf3a3SEmmanuel Vadot# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2c9ccf3a3SEmmanuel Vadot%YAML 1.2
3c9ccf3a3SEmmanuel Vadot---
4c9ccf3a3SEmmanuel Vadot$id: http://devicetree.org/schemas/cpu/idle-states.yaml#
5c9ccf3a3SEmmanuel Vadot$schema: http://devicetree.org/meta-schemas/core.yaml#
6c9ccf3a3SEmmanuel Vadot
78bab661aSEmmanuel Vadottitle: Idle states
8c9ccf3a3SEmmanuel Vadot
9c9ccf3a3SEmmanuel Vadotmaintainers:
10c9ccf3a3SEmmanuel Vadot  - Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
11c9ccf3a3SEmmanuel Vadot  - Anup Patel <anup@brainfault.org>
12c9ccf3a3SEmmanuel Vadot
13c9ccf3a3SEmmanuel Vadotdescription: |+
14c9ccf3a3SEmmanuel Vadot  ==========================================
15c9ccf3a3SEmmanuel Vadot  1 - Introduction
16c9ccf3a3SEmmanuel Vadot  ==========================================
17c9ccf3a3SEmmanuel Vadot
18c9ccf3a3SEmmanuel Vadot  ARM and RISC-V systems contain HW capable of managing power consumption
19c9ccf3a3SEmmanuel Vadot  dynamically, where cores can be put in different low-power states (ranging
20c9ccf3a3SEmmanuel Vadot  from simple wfi to power gating) according to OS PM policies. The CPU states
21c9ccf3a3SEmmanuel Vadot  representing the range of dynamic idle states that a processor can enter at
22c9ccf3a3SEmmanuel Vadot  run-time, can be specified through device tree bindings representing the
23c9ccf3a3SEmmanuel Vadot  parameters required to enter/exit specific idle states on a given processor.
24c9ccf3a3SEmmanuel Vadot
25c9ccf3a3SEmmanuel Vadot  ==========================================
26c9ccf3a3SEmmanuel Vadot  2 - ARM idle states
27c9ccf3a3SEmmanuel Vadot  ==========================================
28c9ccf3a3SEmmanuel Vadot
29c9ccf3a3SEmmanuel Vadot  According to the Server Base System Architecture document (SBSA, [3]), the
30c9ccf3a3SEmmanuel Vadot  power states an ARM CPU can be put into are identified by the following list:
31c9ccf3a3SEmmanuel Vadot
32c9ccf3a3SEmmanuel Vadot  - Running
33c9ccf3a3SEmmanuel Vadot  - Idle_standby
34c9ccf3a3SEmmanuel Vadot  - Idle_retention
35c9ccf3a3SEmmanuel Vadot  - Sleep
36c9ccf3a3SEmmanuel Vadot  - Off
37c9ccf3a3SEmmanuel Vadot
38c9ccf3a3SEmmanuel Vadot  The power states described in the SBSA document define the basic CPU states on
39c9ccf3a3SEmmanuel Vadot  top of which ARM platforms implement power management schemes that allow an OS
40c9ccf3a3SEmmanuel Vadot  PM implementation to put the processor in different idle states (which include
41c9ccf3a3SEmmanuel Vadot  states listed above; "off" state is not an idle state since it does not have
42c9ccf3a3SEmmanuel Vadot  wake-up capabilities, hence it is not considered in this document).
43c9ccf3a3SEmmanuel Vadot
44c9ccf3a3SEmmanuel Vadot  Idle state parameters (e.g. entry latency) are platform specific and need to
45c9ccf3a3SEmmanuel Vadot  be characterized with bindings that provide the required information to OS PM
46c9ccf3a3SEmmanuel Vadot  code so that it can build the required tables and use them at runtime.
47c9ccf3a3SEmmanuel Vadot
48c9ccf3a3SEmmanuel Vadot  The device tree binding definition for ARM idle states is the subject of this
49c9ccf3a3SEmmanuel Vadot  document.
50c9ccf3a3SEmmanuel Vadot
51c9ccf3a3SEmmanuel Vadot  ==========================================
52c9ccf3a3SEmmanuel Vadot  3 - RISC-V idle states
53c9ccf3a3SEmmanuel Vadot  ==========================================
54c9ccf3a3SEmmanuel Vadot
55c9ccf3a3SEmmanuel Vadot  On RISC-V systems, the HARTs (or CPUs) [6] can be put in platform specific
56c9ccf3a3SEmmanuel Vadot  suspend (or idle) states (ranging from simple WFI, power gating, etc). The
57c9ccf3a3SEmmanuel Vadot  RISC-V SBI v0.3 (or higher) [7] hart state management extension provides a
58c9ccf3a3SEmmanuel Vadot  standard mechanism for OS to request HART state transitions.
59c9ccf3a3SEmmanuel Vadot
60c9ccf3a3SEmmanuel Vadot  The platform specific suspend (or idle) states of a hart can be either
61c9ccf3a3SEmmanuel Vadot  retentive or non-rententive in nature. A retentive suspend state will
62c9ccf3a3SEmmanuel Vadot  preserve HART registers and CSR values for all privilege modes whereas
63c9ccf3a3SEmmanuel Vadot  a non-retentive suspend state will not preserve HART registers and CSR
64c9ccf3a3SEmmanuel Vadot  values.
65c9ccf3a3SEmmanuel Vadot
66c9ccf3a3SEmmanuel Vadot  ===========================================
67c9ccf3a3SEmmanuel Vadot  4 - idle-states definitions
68c9ccf3a3SEmmanuel Vadot  ===========================================
69c9ccf3a3SEmmanuel Vadot
70c9ccf3a3SEmmanuel Vadot  Idle states are characterized for a specific system through a set of
71c9ccf3a3SEmmanuel Vadot  timing and energy related properties, that underline the HW behaviour
72c9ccf3a3SEmmanuel Vadot  triggered upon idle states entry and exit.
73c9ccf3a3SEmmanuel Vadot
74c9ccf3a3SEmmanuel Vadot  The following diagram depicts the CPU execution phases and related timing
75c9ccf3a3SEmmanuel Vadot  properties required to enter and exit an idle state:
76c9ccf3a3SEmmanuel Vadot
77c9ccf3a3SEmmanuel Vadot  ..__[EXEC]__|__[PREP]__|__[ENTRY]__|__[IDLE]__|__[EXIT]__|__[EXEC]__..
78c9ccf3a3SEmmanuel Vadot              |          |           |          |          |
79c9ccf3a3SEmmanuel Vadot
80c9ccf3a3SEmmanuel Vadot              |<------ entry ------->|
81c9ccf3a3SEmmanuel Vadot              |       latency        |
82c9ccf3a3SEmmanuel Vadot                                                |<- exit ->|
83c9ccf3a3SEmmanuel Vadot                                                |  latency |
84c9ccf3a3SEmmanuel Vadot              |<-------- min-residency -------->|
85c9ccf3a3SEmmanuel Vadot                         |<-------  wakeup-latency ------->|
86c9ccf3a3SEmmanuel Vadot
87c9ccf3a3SEmmanuel Vadot      Diagram 1: CPU idle state execution phases
88c9ccf3a3SEmmanuel Vadot
89c9ccf3a3SEmmanuel Vadot  EXEC:  Normal CPU execution.
90c9ccf3a3SEmmanuel Vadot
91c9ccf3a3SEmmanuel Vadot  PREP:  Preparation phase before committing the hardware to idle mode
92c9ccf3a3SEmmanuel Vadot    like cache flushing. This is abortable on pending wake-up
93c9ccf3a3SEmmanuel Vadot    event conditions. The abort latency is assumed to be negligible
94c9ccf3a3SEmmanuel Vadot    (i.e. less than the ENTRY + EXIT duration). If aborted, CPU
95c9ccf3a3SEmmanuel Vadot    goes back to EXEC. This phase is optional. If not abortable,
96c9ccf3a3SEmmanuel Vadot    this should be included in the ENTRY phase instead.
97c9ccf3a3SEmmanuel Vadot
98c9ccf3a3SEmmanuel Vadot  ENTRY:  The hardware is committed to idle mode. This period must run
99c9ccf3a3SEmmanuel Vadot    to completion up to IDLE before anything else can happen.
100c9ccf3a3SEmmanuel Vadot
101c9ccf3a3SEmmanuel Vadot  IDLE:  This is the actual energy-saving idle period. This may last
102c9ccf3a3SEmmanuel Vadot    between 0 and infinite time, until a wake-up event occurs.
103c9ccf3a3SEmmanuel Vadot
104c9ccf3a3SEmmanuel Vadot  EXIT:  Period during which the CPU is brought back to operational
105c9ccf3a3SEmmanuel Vadot    mode (EXEC).
106c9ccf3a3SEmmanuel Vadot
107c9ccf3a3SEmmanuel Vadot  entry-latency: Worst case latency required to enter the idle state. The
108c9ccf3a3SEmmanuel Vadot  exit-latency may be guaranteed only after entry-latency has passed.
109c9ccf3a3SEmmanuel Vadot
110c9ccf3a3SEmmanuel Vadot  min-residency: Minimum period, including preparation and entry, for a given
111c9ccf3a3SEmmanuel Vadot  idle state to be worthwhile energywise.
112c9ccf3a3SEmmanuel Vadot
113c9ccf3a3SEmmanuel Vadot  wakeup-latency: Maximum delay between the signaling of a wake-up event and the
114c9ccf3a3SEmmanuel Vadot  CPU being able to execute normal code again. If not specified, this is assumed
115c9ccf3a3SEmmanuel Vadot  to be entry-latency + exit-latency.
116c9ccf3a3SEmmanuel Vadot
117c9ccf3a3SEmmanuel Vadot  These timing parameters can be used by an OS in different circumstances.
118c9ccf3a3SEmmanuel Vadot
119c9ccf3a3SEmmanuel Vadot  An idle CPU requires the expected min-residency time to select the most
120c9ccf3a3SEmmanuel Vadot  appropriate idle state based on the expected expiry time of the next IRQ
121c9ccf3a3SEmmanuel Vadot  (i.e. wake-up) that causes the CPU to return to the EXEC phase.
122c9ccf3a3SEmmanuel Vadot
123c9ccf3a3SEmmanuel Vadot  An operating system scheduler may need to compute the shortest wake-up delay
124c9ccf3a3SEmmanuel Vadot  for CPUs in the system by detecting how long will it take to get a CPU out
125c9ccf3a3SEmmanuel Vadot  of an idle state, e.g.:
126c9ccf3a3SEmmanuel Vadot
127c9ccf3a3SEmmanuel Vadot  wakeup-delay = exit-latency + max(entry-latency - (now - entry-timestamp), 0)
128c9ccf3a3SEmmanuel Vadot
129c9ccf3a3SEmmanuel Vadot  In other words, the scheduler can make its scheduling decision by selecting
130c9ccf3a3SEmmanuel Vadot  (e.g. waking-up) the CPU with the shortest wake-up delay.
131c9ccf3a3SEmmanuel Vadot  The wake-up delay must take into account the entry latency if that period
132c9ccf3a3SEmmanuel Vadot  has not expired. The abortable nature of the PREP period can be ignored
133c9ccf3a3SEmmanuel Vadot  if it cannot be relied upon (e.g. the PREP deadline may occur much sooner than
134c9ccf3a3SEmmanuel Vadot  the worst case since it depends on the CPU operating conditions, i.e. caches
135c9ccf3a3SEmmanuel Vadot  state).
136c9ccf3a3SEmmanuel Vadot
137c9ccf3a3SEmmanuel Vadot  An OS has to reliably probe the wakeup-latency since some devices can enforce
138c9ccf3a3SEmmanuel Vadot  latency constraint guarantees to work properly, so the OS has to detect the
139c9ccf3a3SEmmanuel Vadot  worst case wake-up latency it can incur if a CPU is allowed to enter an
140c9ccf3a3SEmmanuel Vadot  idle state, and possibly to prevent that to guarantee reliable device
141c9ccf3a3SEmmanuel Vadot  functioning.
142c9ccf3a3SEmmanuel Vadot
143c9ccf3a3SEmmanuel Vadot  The min-residency time parameter deserves further explanation since it is
144c9ccf3a3SEmmanuel Vadot  expressed in time units but must factor in energy consumption coefficients.
145c9ccf3a3SEmmanuel Vadot
146c9ccf3a3SEmmanuel Vadot  The energy consumption of a cpu when it enters a power state can be roughly
147c9ccf3a3SEmmanuel Vadot  characterised by the following graph:
148c9ccf3a3SEmmanuel Vadot
149c9ccf3a3SEmmanuel Vadot                 |
150c9ccf3a3SEmmanuel Vadot                 |
151c9ccf3a3SEmmanuel Vadot                 |
152c9ccf3a3SEmmanuel Vadot             e   |
153c9ccf3a3SEmmanuel Vadot             n   |                                      /---
154c9ccf3a3SEmmanuel Vadot             e   |                               /------
155c9ccf3a3SEmmanuel Vadot             r   |                        /------
156c9ccf3a3SEmmanuel Vadot             g   |                  /-----
157c9ccf3a3SEmmanuel Vadot             y   |           /------
158c9ccf3a3SEmmanuel Vadot                 |       ----
159c9ccf3a3SEmmanuel Vadot                 |      /|
160c9ccf3a3SEmmanuel Vadot                 |     / |
161c9ccf3a3SEmmanuel Vadot                 |    /  |
162c9ccf3a3SEmmanuel Vadot                 |   /   |
163c9ccf3a3SEmmanuel Vadot                 |  /    |
164c9ccf3a3SEmmanuel Vadot                 | /     |
165c9ccf3a3SEmmanuel Vadot                 |/      |
166c9ccf3a3SEmmanuel Vadot            -----|-------+----------------------------------
167c9ccf3a3SEmmanuel Vadot                0|       1                              time(ms)
168c9ccf3a3SEmmanuel Vadot
169c9ccf3a3SEmmanuel Vadot      Graph 1: Energy vs time example
170c9ccf3a3SEmmanuel Vadot
171c9ccf3a3SEmmanuel Vadot  The graph is split in two parts delimited by time 1ms on the X-axis.
172c9ccf3a3SEmmanuel Vadot  The graph curve with X-axis values = { x | 0 < x < 1ms } has a steep slope
173c9ccf3a3SEmmanuel Vadot  and denotes the energy costs incurred while entering and leaving the idle
174c9ccf3a3SEmmanuel Vadot  state.
175c9ccf3a3SEmmanuel Vadot  The graph curve in the area delimited by X-axis values = {x | x > 1ms } has
176c9ccf3a3SEmmanuel Vadot  shallower slope and essentially represents the energy consumption of the idle
177c9ccf3a3SEmmanuel Vadot  state.
178c9ccf3a3SEmmanuel Vadot
179c9ccf3a3SEmmanuel Vadot  min-residency is defined for a given idle state as the minimum expected
180c9ccf3a3SEmmanuel Vadot  residency time for a state (inclusive of preparation and entry) after
181c9ccf3a3SEmmanuel Vadot  which choosing that state become the most energy efficient option. A good
182c9ccf3a3SEmmanuel Vadot  way to visualise this, is by taking the same graph above and comparing some
183c9ccf3a3SEmmanuel Vadot  states energy consumptions plots.
184c9ccf3a3SEmmanuel Vadot
185c9ccf3a3SEmmanuel Vadot  For sake of simplicity, let's consider a system with two idle states IDLE1,
186c9ccf3a3SEmmanuel Vadot  and IDLE2:
187c9ccf3a3SEmmanuel Vadot
188c9ccf3a3SEmmanuel Vadot            |
189c9ccf3a3SEmmanuel Vadot            |
190c9ccf3a3SEmmanuel Vadot            |
191c9ccf3a3SEmmanuel Vadot            |                                                  /-- IDLE1
192c9ccf3a3SEmmanuel Vadot         e  |                                              /---
193c9ccf3a3SEmmanuel Vadot         n  |                                         /----
194c9ccf3a3SEmmanuel Vadot         e  |                                     /---
195c9ccf3a3SEmmanuel Vadot         r  |                                /-----/--------- IDLE2
196c9ccf3a3SEmmanuel Vadot         g  |                    /-------/---------
197c9ccf3a3SEmmanuel Vadot         y  |        ------------    /---|
198c9ccf3a3SEmmanuel Vadot            |       /           /----    |
199c9ccf3a3SEmmanuel Vadot            |      /        /---         |
200c9ccf3a3SEmmanuel Vadot            |     /    /----             |
201c9ccf3a3SEmmanuel Vadot            |    / /---                  |
202c9ccf3a3SEmmanuel Vadot            |   ---                      |
203c9ccf3a3SEmmanuel Vadot            |  /                         |
204c9ccf3a3SEmmanuel Vadot            | /                          |
205c9ccf3a3SEmmanuel Vadot            |/                           |                  time
206c9ccf3a3SEmmanuel Vadot         ---/----------------------------+------------------------
207c9ccf3a3SEmmanuel Vadot            |IDLE1-energy < IDLE2-energy | IDLE2-energy < IDLE1-energy
208c9ccf3a3SEmmanuel Vadot                                         |
209c9ccf3a3SEmmanuel Vadot                                  IDLE2-min-residency
210c9ccf3a3SEmmanuel Vadot
211c9ccf3a3SEmmanuel Vadot      Graph 2: idle states min-residency example
212c9ccf3a3SEmmanuel Vadot
213c9ccf3a3SEmmanuel Vadot  In graph 2 above, that takes into account idle states entry/exit energy
214c9ccf3a3SEmmanuel Vadot  costs, it is clear that if the idle state residency time (i.e. time till next
215c9ccf3a3SEmmanuel Vadot  wake-up IRQ) is less than IDLE2-min-residency, IDLE1 is the better idle state
216c9ccf3a3SEmmanuel Vadot  choice energywise.
217c9ccf3a3SEmmanuel Vadot
218c9ccf3a3SEmmanuel Vadot  This is mainly down to the fact that IDLE1 entry/exit energy costs are lower
219c9ccf3a3SEmmanuel Vadot  than IDLE2.
220c9ccf3a3SEmmanuel Vadot
221c9ccf3a3SEmmanuel Vadot  However, the lower power consumption (i.e. shallower energy curve slope) of
222c9ccf3a3SEmmanuel Vadot  idle state IDLE2 implies that after a suitable time, IDLE2 becomes more energy
223c9ccf3a3SEmmanuel Vadot  efficient.
224c9ccf3a3SEmmanuel Vadot
225c9ccf3a3SEmmanuel Vadot  The time at which IDLE2 becomes more energy efficient than IDLE1 (and other
226c9ccf3a3SEmmanuel Vadot  shallower states in a system with multiple idle states) is defined
227c9ccf3a3SEmmanuel Vadot  IDLE2-min-residency and corresponds to the time when energy consumption of
228c9ccf3a3SEmmanuel Vadot  IDLE1 and IDLE2 states breaks even.
229c9ccf3a3SEmmanuel Vadot
230c9ccf3a3SEmmanuel Vadot  The definitions provided in this section underpin the idle states
231c9ccf3a3SEmmanuel Vadot  properties specification that is the subject of the following sections.
232c9ccf3a3SEmmanuel Vadot
233c9ccf3a3SEmmanuel Vadot  ===========================================
234c9ccf3a3SEmmanuel Vadot  5 - idle-states node
235c9ccf3a3SEmmanuel Vadot  ===========================================
236c9ccf3a3SEmmanuel Vadot
237c9ccf3a3SEmmanuel Vadot  The processor idle states are defined within the idle-states node, which is
238c9ccf3a3SEmmanuel Vadot  a direct child of the cpus node [1] and provides a container where the
239c9ccf3a3SEmmanuel Vadot  processor idle states, defined as device tree nodes, are listed.
240c9ccf3a3SEmmanuel Vadot
241c9ccf3a3SEmmanuel Vadot  On ARM systems, it is a container of processor idle states nodes. If the
242c9ccf3a3SEmmanuel Vadot  system does not provide CPU power management capabilities, or the processor
243c9ccf3a3SEmmanuel Vadot  just supports idle_standby, an idle-states node is not required.
244c9ccf3a3SEmmanuel Vadot
245c9ccf3a3SEmmanuel Vadot  ===========================================
2468d13bc63SEmmanuel Vadot  6 - Qualcomm specific STATES
2478d13bc63SEmmanuel Vadot  ===========================================
2488d13bc63SEmmanuel Vadot
2498d13bc63SEmmanuel Vadot  Idle states have different enter/exit latency and residency values.
2508d13bc63SEmmanuel Vadot  The idle states supported by the QCOM SoC are defined as -
2518d13bc63SEmmanuel Vadot
2528d13bc63SEmmanuel Vadot    * Standby
2538d13bc63SEmmanuel Vadot    * Retention
2548d13bc63SEmmanuel Vadot    * Standalone Power Collapse (Standalone PC or SPC)
2558d13bc63SEmmanuel Vadot    * Power Collapse (PC)
2568d13bc63SEmmanuel Vadot
2578d13bc63SEmmanuel Vadot  Standby: Standby does a little more in addition to architectural clock gating.
2588d13bc63SEmmanuel Vadot  When the WFI instruction is executed the ARM core would gate its internal
2598d13bc63SEmmanuel Vadot  clocks. In addition to gating the clocks, QCOM cpus use this instruction as a
2608d13bc63SEmmanuel Vadot  trigger to execute the SPM state machine. The SPM state machine waits for the
2618d13bc63SEmmanuel Vadot  interrupt to trigger the core back in to active. This triggers the cache
2628d13bc63SEmmanuel Vadot  hierarchy to enter standby states, when all cpus are idle. An interrupt brings
2638d13bc63SEmmanuel Vadot  the SPM state machine out of its wait, the next step is to ensure that the
2648d13bc63SEmmanuel Vadot  cache hierarchy is also out of standby, and then the cpu is allowed to resume
2658d13bc63SEmmanuel Vadot  execution. This state is defined as a generic ARM WFI state by the ARM cpuidle
2668d13bc63SEmmanuel Vadot  driver and is not defined in the DT. The SPM state machine should be
2678d13bc63SEmmanuel Vadot  configured to execute this state by default and after executing every other
2688d13bc63SEmmanuel Vadot  state below.
2698d13bc63SEmmanuel Vadot
2708d13bc63SEmmanuel Vadot  Retention: Retention is a low power state where the core is clock gated and
2718d13bc63SEmmanuel Vadot  the memory and the registers associated with the core are retained. The
2728d13bc63SEmmanuel Vadot  voltage may be reduced to the minimum value needed to keep the processor
2738d13bc63SEmmanuel Vadot  registers active. The SPM should be configured to execute the retention
2748d13bc63SEmmanuel Vadot  sequence and would wait for interrupt, before restoring the cpu to execution
2758d13bc63SEmmanuel Vadot  state. Retention may have a slightly higher latency than Standby.
2768d13bc63SEmmanuel Vadot
2778d13bc63SEmmanuel Vadot  Standalone PC: A cpu can power down and warmboot if there is a sufficient time
2788d13bc63SEmmanuel Vadot  between the time it enters idle and the next known wake up. SPC mode is used
2798d13bc63SEmmanuel Vadot  to indicate a core entering a power down state without consulting any other
2808d13bc63SEmmanuel Vadot  cpu or the system resources. This helps save power only on that core.  The SPM
2818d13bc63SEmmanuel Vadot  sequence for this idle state is programmed to power down the supply to the
2828d13bc63SEmmanuel Vadot  core, wait for the interrupt, restore power to the core, and ensure the
2838d13bc63SEmmanuel Vadot  system state including cache hierarchy is ready before allowing core to
2848d13bc63SEmmanuel Vadot  resume. Applying power and resetting the core causes the core to warmboot
2858d13bc63SEmmanuel Vadot  back into Elevation Level (EL) which trampolines the control back to the
2868d13bc63SEmmanuel Vadot  kernel. Entering a power down state for the cpu, needs to be done by trapping
2878d13bc63SEmmanuel Vadot  into a EL. Failing to do so, would result in a crash enforced by the warm boot
2888d13bc63SEmmanuel Vadot  code in the EL for the SoC. On SoCs with write-back L1 cache, the cache has to
2898d13bc63SEmmanuel Vadot  be flushed in s/w, before powering down the core.
2908d13bc63SEmmanuel Vadot
2918d13bc63SEmmanuel Vadot  Power Collapse: This state is similar to the SPC mode, but distinguishes
2928d13bc63SEmmanuel Vadot  itself in that the cpu acknowledges and permits the SoC to enter deeper sleep
2938d13bc63SEmmanuel Vadot  modes. In a hierarchical power domain SoC, this means L2 and other caches can
2948d13bc63SEmmanuel Vadot  be flushed, system bus, clocks - lowered, and SoC main XO clock gated and
2958d13bc63SEmmanuel Vadot  voltages reduced, provided all cpus enter this state.  Since the span of low
2968d13bc63SEmmanuel Vadot  power modes possible at this state is vast, the exit latency and the residency
2978d13bc63SEmmanuel Vadot  of this low power mode would be considered high even though at a cpu level,
2988d13bc63SEmmanuel Vadot  this essentially is cpu power down. The SPM in this state also may handshake
2998d13bc63SEmmanuel Vadot  with the Resource power manager (RPM) processor in the SoC to indicate a
3008d13bc63SEmmanuel Vadot  complete application processor subsystem shut down.
3018d13bc63SEmmanuel Vadot
3028d13bc63SEmmanuel Vadot  ===========================================
3038d13bc63SEmmanuel Vadot  7 - References
304c9ccf3a3SEmmanuel Vadot  ===========================================
305c9ccf3a3SEmmanuel Vadot
306c9ccf3a3SEmmanuel Vadot  [1] ARM Linux Kernel documentation - CPUs bindings
307c9ccf3a3SEmmanuel Vadot      Documentation/devicetree/bindings/arm/cpus.yaml
308c9ccf3a3SEmmanuel Vadot
309c9ccf3a3SEmmanuel Vadot  [2] ARM Linux Kernel documentation - PSCI bindings
310c9ccf3a3SEmmanuel Vadot      Documentation/devicetree/bindings/arm/psci.yaml
311c9ccf3a3SEmmanuel Vadot
312c9ccf3a3SEmmanuel Vadot  [3] ARM Server Base System Architecture (SBSA)
313c9ccf3a3SEmmanuel Vadot      http://infocenter.arm.com/help/index.jsp
314c9ccf3a3SEmmanuel Vadot
315c9ccf3a3SEmmanuel Vadot  [4] ARM Architecture Reference Manuals
316c9ccf3a3SEmmanuel Vadot      http://infocenter.arm.com/help/index.jsp
317c9ccf3a3SEmmanuel Vadot
318c9ccf3a3SEmmanuel Vadot  [5] ARM Linux Kernel documentation - Booting AArch64 Linux
319f126890aSEmmanuel Vadot      Documentation/arch/arm64/booting.rst
320c9ccf3a3SEmmanuel Vadot
321c9ccf3a3SEmmanuel Vadot  [6] RISC-V Linux Kernel documentation - CPUs bindings
322c9ccf3a3SEmmanuel Vadot      Documentation/devicetree/bindings/riscv/cpus.yaml
323c9ccf3a3SEmmanuel Vadot
324c9ccf3a3SEmmanuel Vadot  [7] RISC-V Supervisor Binary Interface (SBI)
325c9ccf3a3SEmmanuel Vadot      http://github.com/riscv/riscv-sbi-doc/riscv-sbi.adoc
326c9ccf3a3SEmmanuel Vadot
327c9ccf3a3SEmmanuel Vadotproperties:
328c9ccf3a3SEmmanuel Vadot  $nodename:
329c9ccf3a3SEmmanuel Vadot    const: idle-states
330c9ccf3a3SEmmanuel Vadot
331c9ccf3a3SEmmanuel Vadot  entry-method:
332c9ccf3a3SEmmanuel Vadot    description: |
333c9ccf3a3SEmmanuel Vadot      Usage and definition depend on ARM architecture version.
334c9ccf3a3SEmmanuel Vadot
335c9ccf3a3SEmmanuel Vadot      On ARM v8 64-bit this property is required.
336c9ccf3a3SEmmanuel Vadot      On ARM 32-bit systems this property is optional
337c9ccf3a3SEmmanuel Vadot
338c9ccf3a3SEmmanuel Vadot      This assumes that the "enable-method" property is set to "psci" in the cpu
339c9ccf3a3SEmmanuel Vadot      node[5] that is responsible for setting up CPU idle management in the OS
340c9ccf3a3SEmmanuel Vadot      implementation.
341c9ccf3a3SEmmanuel Vadot    const: psci
342c9ccf3a3SEmmanuel Vadot
343c9ccf3a3SEmmanuel VadotpatternProperties:
344c9ccf3a3SEmmanuel Vadot  "^(cpu|cluster)-":
345c9ccf3a3SEmmanuel Vadot    type: object
346c9ccf3a3SEmmanuel Vadot    description: |
347c9ccf3a3SEmmanuel Vadot      Each state node represents an idle state description and must be defined
348c9ccf3a3SEmmanuel Vadot      as follows.
349c9ccf3a3SEmmanuel Vadot
350c9ccf3a3SEmmanuel Vadot      The idle state entered by executing the wfi instruction (idle_standby
351c9ccf3a3SEmmanuel Vadot      SBSA,[3][4]) is considered standard on all ARM and RISC-V platforms and
352c9ccf3a3SEmmanuel Vadot      therefore must not be listed.
353c9ccf3a3SEmmanuel Vadot
354c9ccf3a3SEmmanuel Vadot      In addition to the properties listed above, a state node may require
355c9ccf3a3SEmmanuel Vadot      additional properties specific to the entry-method defined in the
356c9ccf3a3SEmmanuel Vadot      idle-states node. Please refer to the entry-method bindings
357c9ccf3a3SEmmanuel Vadot      documentation for properties definitions.
358c9ccf3a3SEmmanuel Vadot
359c9ccf3a3SEmmanuel Vadot    properties:
360c9ccf3a3SEmmanuel Vadot      compatible:
3618d13bc63SEmmanuel Vadot        oneOf:
3628d13bc63SEmmanuel Vadot          - items:
3638d13bc63SEmmanuel Vadot              - enum:
3648d13bc63SEmmanuel Vadot                  - qcom,idle-state-ret
3658d13bc63SEmmanuel Vadot                  - qcom,idle-state-spc
3668d13bc63SEmmanuel Vadot                  - qcom,idle-state-pc
3678d13bc63SEmmanuel Vadot              - const: arm,idle-state
3688d13bc63SEmmanuel Vadot          - enum:
369c9ccf3a3SEmmanuel Vadot              - arm,idle-state
370c9ccf3a3SEmmanuel Vadot              - riscv,idle-state
371c9ccf3a3SEmmanuel Vadot
372c9ccf3a3SEmmanuel Vadot      arm,psci-suspend-param:
373c9ccf3a3SEmmanuel Vadot        $ref: /schemas/types.yaml#/definitions/uint32
374c9ccf3a3SEmmanuel Vadot        description: |
375c9ccf3a3SEmmanuel Vadot          power_state parameter to pass to the ARM PSCI suspend call.
376c9ccf3a3SEmmanuel Vadot
377c9ccf3a3SEmmanuel Vadot          Device tree nodes that require usage of PSCI CPU_SUSPEND function
378c9ccf3a3SEmmanuel Vadot          (i.e. idle states node with entry-method property is set to "psci")
379c9ccf3a3SEmmanuel Vadot          must specify this property.
380c9ccf3a3SEmmanuel Vadot
381c9ccf3a3SEmmanuel Vadot      riscv,sbi-suspend-param:
382c9ccf3a3SEmmanuel Vadot        $ref: /schemas/types.yaml#/definitions/uint32
383c9ccf3a3SEmmanuel Vadot        description: |
384c9ccf3a3SEmmanuel Vadot          suspend_type parameter to pass to the RISC-V SBI HSM suspend call.
385c9ccf3a3SEmmanuel Vadot
386c9ccf3a3SEmmanuel Vadot          This property is required in idle state nodes of device tree meant
387c9ccf3a3SEmmanuel Vadot          for RISC-V systems. For more details on the suspend_type parameter
388*b2d2a78aSEmmanuel Vadot          refer the SBI specification v0.3 (or higher) [7].
389c9ccf3a3SEmmanuel Vadot
390c9ccf3a3SEmmanuel Vadot      local-timer-stop:
391c9ccf3a3SEmmanuel Vadot        description:
392c9ccf3a3SEmmanuel Vadot          If present the CPU local timer control logic is
393c9ccf3a3SEmmanuel Vadot             lost on state entry, otherwise it is retained.
394c9ccf3a3SEmmanuel Vadot        type: boolean
395c9ccf3a3SEmmanuel Vadot
396c9ccf3a3SEmmanuel Vadot      entry-latency-us:
397c9ccf3a3SEmmanuel Vadot        description:
398c9ccf3a3SEmmanuel Vadot          Worst case latency in microseconds required to enter the idle state.
399c9ccf3a3SEmmanuel Vadot
400c9ccf3a3SEmmanuel Vadot      exit-latency-us:
401c9ccf3a3SEmmanuel Vadot        description:
402c9ccf3a3SEmmanuel Vadot          Worst case latency in microseconds required to exit the idle state.
403c9ccf3a3SEmmanuel Vadot          The exit-latency-us duration may be guaranteed only after
404c9ccf3a3SEmmanuel Vadot          entry-latency-us has passed.
405c9ccf3a3SEmmanuel Vadot
406c9ccf3a3SEmmanuel Vadot      min-residency-us:
407c9ccf3a3SEmmanuel Vadot        description:
408c9ccf3a3SEmmanuel Vadot          Minimum residency duration in microseconds, inclusive of preparation
409c9ccf3a3SEmmanuel Vadot          and entry, for this idle state to be considered worthwhile energy wise
410c9ccf3a3SEmmanuel Vadot          (refer to section 2 of this document for a complete description).
411c9ccf3a3SEmmanuel Vadot
412c9ccf3a3SEmmanuel Vadot      wakeup-latency-us:
413c9ccf3a3SEmmanuel Vadot        description: |
414c9ccf3a3SEmmanuel Vadot          Maximum delay between the signaling of a wake-up event and the CPU
415c9ccf3a3SEmmanuel Vadot          being able to execute normal code again. If omitted, this is assumed
416c9ccf3a3SEmmanuel Vadot          to be equal to:
417c9ccf3a3SEmmanuel Vadot
418c9ccf3a3SEmmanuel Vadot            entry-latency-us + exit-latency-us
419c9ccf3a3SEmmanuel Vadot
420c9ccf3a3SEmmanuel Vadot          It is important to supply this value on systems where the duration of
421c9ccf3a3SEmmanuel Vadot          PREP phase (see diagram 1, section 2) is non-neglibigle. In such
422c9ccf3a3SEmmanuel Vadot          systems entry-latency-us + exit-latency-us will exceed
423c9ccf3a3SEmmanuel Vadot          wakeup-latency-us by this duration.
424c9ccf3a3SEmmanuel Vadot
425c9ccf3a3SEmmanuel Vadot      idle-state-name:
426c9ccf3a3SEmmanuel Vadot        $ref: /schemas/types.yaml#/definitions/string
427c9ccf3a3SEmmanuel Vadot        description:
428c9ccf3a3SEmmanuel Vadot          A string used as a descriptive name for the idle state.
429c9ccf3a3SEmmanuel Vadot
430c9ccf3a3SEmmanuel Vadot    additionalProperties: false
431c9ccf3a3SEmmanuel Vadot
432c9ccf3a3SEmmanuel Vadot    required:
433c9ccf3a3SEmmanuel Vadot      - compatible
434c9ccf3a3SEmmanuel Vadot      - entry-latency-us
435c9ccf3a3SEmmanuel Vadot      - exit-latency-us
436c9ccf3a3SEmmanuel Vadot      - min-residency-us
437c9ccf3a3SEmmanuel Vadot
438c9ccf3a3SEmmanuel VadotadditionalProperties: false
439c9ccf3a3SEmmanuel Vadot
440c9ccf3a3SEmmanuel Vadotexamples:
441c9ccf3a3SEmmanuel Vadot  - |
442c9ccf3a3SEmmanuel Vadot
443c9ccf3a3SEmmanuel Vadot    cpus {
444c9ccf3a3SEmmanuel Vadot        #size-cells = <0>;
445c9ccf3a3SEmmanuel Vadot        #address-cells = <2>;
446c9ccf3a3SEmmanuel Vadot
447c9ccf3a3SEmmanuel Vadot        cpu@0 {
448c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
449c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a57";
450c9ccf3a3SEmmanuel Vadot            reg = <0x0 0x0>;
451c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
452c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
453c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
454c9ccf3a3SEmmanuel Vadot        };
455c9ccf3a3SEmmanuel Vadot
456c9ccf3a3SEmmanuel Vadot        cpu@1 {
457c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
458c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a57";
459c9ccf3a3SEmmanuel Vadot            reg = <0x0 0x1>;
460c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
461c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
462c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
463c9ccf3a3SEmmanuel Vadot        };
464c9ccf3a3SEmmanuel Vadot
465c9ccf3a3SEmmanuel Vadot        cpu@100 {
466c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
467c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a57";
468c9ccf3a3SEmmanuel Vadot            reg = <0x0 0x100>;
469c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
470c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
471c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
472c9ccf3a3SEmmanuel Vadot        };
473c9ccf3a3SEmmanuel Vadot
474c9ccf3a3SEmmanuel Vadot        cpu@101 {
475c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
476c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a57";
477c9ccf3a3SEmmanuel Vadot            reg = <0x0 0x101>;
478c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
479c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
480c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
481c9ccf3a3SEmmanuel Vadot        };
482c9ccf3a3SEmmanuel Vadot
483c9ccf3a3SEmmanuel Vadot        cpu@10000 {
484c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
485c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a57";
486c9ccf3a3SEmmanuel Vadot            reg = <0x0 0x10000>;
487c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
488c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
489c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
490c9ccf3a3SEmmanuel Vadot        };
491c9ccf3a3SEmmanuel Vadot
492c9ccf3a3SEmmanuel Vadot        cpu@10001 {
493c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
494c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a57";
495c9ccf3a3SEmmanuel Vadot            reg = <0x0 0x10001>;
496c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
497c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
498c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
499c9ccf3a3SEmmanuel Vadot        };
500c9ccf3a3SEmmanuel Vadot
501c9ccf3a3SEmmanuel Vadot        cpu@10100 {
502c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
503c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a57";
504c9ccf3a3SEmmanuel Vadot            reg = <0x0 0x10100>;
505c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
506c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
507c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
508c9ccf3a3SEmmanuel Vadot        };
509c9ccf3a3SEmmanuel Vadot
510c9ccf3a3SEmmanuel Vadot        cpu@10101 {
511c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
512c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a57";
513c9ccf3a3SEmmanuel Vadot            reg = <0x0 0x10101>;
514c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
515c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
516c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
517c9ccf3a3SEmmanuel Vadot        };
518c9ccf3a3SEmmanuel Vadot
519c9ccf3a3SEmmanuel Vadot        cpu@100000000 {
520c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
521c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a53";
522c9ccf3a3SEmmanuel Vadot            reg = <0x1 0x0>;
523c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
524c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
525c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
526c9ccf3a3SEmmanuel Vadot        };
527c9ccf3a3SEmmanuel Vadot
528c9ccf3a3SEmmanuel Vadot        cpu@100000001 {
529c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
530c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a53";
531c9ccf3a3SEmmanuel Vadot            reg = <0x1 0x1>;
532c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
533c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
534c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
535c9ccf3a3SEmmanuel Vadot        };
536c9ccf3a3SEmmanuel Vadot
537c9ccf3a3SEmmanuel Vadot        cpu@100000100 {
538c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
539c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a53";
540c9ccf3a3SEmmanuel Vadot            reg = <0x1 0x100>;
541c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
542c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
543c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
544c9ccf3a3SEmmanuel Vadot        };
545c9ccf3a3SEmmanuel Vadot
546c9ccf3a3SEmmanuel Vadot        cpu@100000101 {
547c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
548c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a53";
549c9ccf3a3SEmmanuel Vadot            reg = <0x1 0x101>;
550c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
551c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
552c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
553c9ccf3a3SEmmanuel Vadot        };
554c9ccf3a3SEmmanuel Vadot
555c9ccf3a3SEmmanuel Vadot        cpu@100010000 {
556c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
557c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a53";
558c9ccf3a3SEmmanuel Vadot            reg = <0x1 0x10000>;
559c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
560c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
561c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
562c9ccf3a3SEmmanuel Vadot        };
563c9ccf3a3SEmmanuel Vadot
564c9ccf3a3SEmmanuel Vadot        cpu@100010001 {
565c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
566c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a53";
567c9ccf3a3SEmmanuel Vadot            reg = <0x1 0x10001>;
568c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
569c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
570c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
571c9ccf3a3SEmmanuel Vadot        };
572c9ccf3a3SEmmanuel Vadot
573c9ccf3a3SEmmanuel Vadot        cpu@100010100 {
574c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
575c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a53";
576c9ccf3a3SEmmanuel Vadot            reg = <0x1 0x10100>;
577c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
578c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
579c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
580c9ccf3a3SEmmanuel Vadot        };
581c9ccf3a3SEmmanuel Vadot
582c9ccf3a3SEmmanuel Vadot        cpu@100010101 {
583c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
584c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a53";
585c9ccf3a3SEmmanuel Vadot            reg = <0x1 0x10101>;
586c9ccf3a3SEmmanuel Vadot            enable-method = "psci";
587c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
588c9ccf3a3SEmmanuel Vadot                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
589c9ccf3a3SEmmanuel Vadot        };
590c9ccf3a3SEmmanuel Vadot
591c9ccf3a3SEmmanuel Vadot        idle-states {
592c9ccf3a3SEmmanuel Vadot            entry-method = "psci";
593c9ccf3a3SEmmanuel Vadot
594c9ccf3a3SEmmanuel Vadot            CPU_RETENTION_0_0: cpu-retention-0-0 {
595c9ccf3a3SEmmanuel Vadot                compatible = "arm,idle-state";
596c9ccf3a3SEmmanuel Vadot                arm,psci-suspend-param = <0x0010000>;
597c9ccf3a3SEmmanuel Vadot                entry-latency-us = <20>;
598c9ccf3a3SEmmanuel Vadot                exit-latency-us = <40>;
599c9ccf3a3SEmmanuel Vadot                min-residency-us = <80>;
600c9ccf3a3SEmmanuel Vadot            };
601c9ccf3a3SEmmanuel Vadot
602c9ccf3a3SEmmanuel Vadot            CLUSTER_RETENTION_0: cluster-retention-0 {
603c9ccf3a3SEmmanuel Vadot                compatible = "arm,idle-state";
604c9ccf3a3SEmmanuel Vadot                local-timer-stop;
605c9ccf3a3SEmmanuel Vadot                arm,psci-suspend-param = <0x1010000>;
606c9ccf3a3SEmmanuel Vadot                entry-latency-us = <50>;
607c9ccf3a3SEmmanuel Vadot                exit-latency-us = <100>;
608c9ccf3a3SEmmanuel Vadot                min-residency-us = <250>;
609c9ccf3a3SEmmanuel Vadot                wakeup-latency-us = <130>;
610c9ccf3a3SEmmanuel Vadot            };
611c9ccf3a3SEmmanuel Vadot
612c9ccf3a3SEmmanuel Vadot            CPU_SLEEP_0_0: cpu-sleep-0-0 {
613c9ccf3a3SEmmanuel Vadot                compatible = "arm,idle-state";
614c9ccf3a3SEmmanuel Vadot                local-timer-stop;
615c9ccf3a3SEmmanuel Vadot                arm,psci-suspend-param = <0x0010000>;
616c9ccf3a3SEmmanuel Vadot                entry-latency-us = <250>;
617c9ccf3a3SEmmanuel Vadot                exit-latency-us = <500>;
618c9ccf3a3SEmmanuel Vadot                min-residency-us = <950>;
619c9ccf3a3SEmmanuel Vadot            };
620c9ccf3a3SEmmanuel Vadot
621c9ccf3a3SEmmanuel Vadot            CLUSTER_SLEEP_0: cluster-sleep-0 {
622c9ccf3a3SEmmanuel Vadot                compatible = "arm,idle-state";
623c9ccf3a3SEmmanuel Vadot                local-timer-stop;
624c9ccf3a3SEmmanuel Vadot                arm,psci-suspend-param = <0x1010000>;
625c9ccf3a3SEmmanuel Vadot                entry-latency-us = <600>;
626c9ccf3a3SEmmanuel Vadot                exit-latency-us = <1100>;
627c9ccf3a3SEmmanuel Vadot                min-residency-us = <2700>;
628c9ccf3a3SEmmanuel Vadot                wakeup-latency-us = <1500>;
629c9ccf3a3SEmmanuel Vadot            };
630c9ccf3a3SEmmanuel Vadot
631c9ccf3a3SEmmanuel Vadot            CPU_RETENTION_1_0: cpu-retention-1-0 {
632c9ccf3a3SEmmanuel Vadot                compatible = "arm,idle-state";
633c9ccf3a3SEmmanuel Vadot                arm,psci-suspend-param = <0x0010000>;
634c9ccf3a3SEmmanuel Vadot                entry-latency-us = <20>;
635c9ccf3a3SEmmanuel Vadot                exit-latency-us = <40>;
636c9ccf3a3SEmmanuel Vadot                min-residency-us = <90>;
637c9ccf3a3SEmmanuel Vadot            };
638c9ccf3a3SEmmanuel Vadot
639c9ccf3a3SEmmanuel Vadot            CLUSTER_RETENTION_1: cluster-retention-1 {
640c9ccf3a3SEmmanuel Vadot                compatible = "arm,idle-state";
641c9ccf3a3SEmmanuel Vadot                local-timer-stop;
642c9ccf3a3SEmmanuel Vadot                arm,psci-suspend-param = <0x1010000>;
643c9ccf3a3SEmmanuel Vadot                entry-latency-us = <50>;
644c9ccf3a3SEmmanuel Vadot                exit-latency-us = <100>;
645c9ccf3a3SEmmanuel Vadot                min-residency-us = <270>;
646c9ccf3a3SEmmanuel Vadot                wakeup-latency-us = <100>;
647c9ccf3a3SEmmanuel Vadot            };
648c9ccf3a3SEmmanuel Vadot
649c9ccf3a3SEmmanuel Vadot            CPU_SLEEP_1_0: cpu-sleep-1-0 {
650c9ccf3a3SEmmanuel Vadot                compatible = "arm,idle-state";
651c9ccf3a3SEmmanuel Vadot                local-timer-stop;
652c9ccf3a3SEmmanuel Vadot                arm,psci-suspend-param = <0x0010000>;
653c9ccf3a3SEmmanuel Vadot                entry-latency-us = <70>;
654c9ccf3a3SEmmanuel Vadot                exit-latency-us = <100>;
655c9ccf3a3SEmmanuel Vadot                min-residency-us = <300>;
656c9ccf3a3SEmmanuel Vadot                wakeup-latency-us = <150>;
657c9ccf3a3SEmmanuel Vadot            };
658c9ccf3a3SEmmanuel Vadot
659c9ccf3a3SEmmanuel Vadot            CLUSTER_SLEEP_1: cluster-sleep-1 {
660c9ccf3a3SEmmanuel Vadot                compatible = "arm,idle-state";
661c9ccf3a3SEmmanuel Vadot                local-timer-stop;
662c9ccf3a3SEmmanuel Vadot                arm,psci-suspend-param = <0x1010000>;
663c9ccf3a3SEmmanuel Vadot                entry-latency-us = <500>;
664c9ccf3a3SEmmanuel Vadot                exit-latency-us = <1200>;
665c9ccf3a3SEmmanuel Vadot                min-residency-us = <3500>;
666c9ccf3a3SEmmanuel Vadot                wakeup-latency-us = <1300>;
667c9ccf3a3SEmmanuel Vadot            };
668c9ccf3a3SEmmanuel Vadot        };
669c9ccf3a3SEmmanuel Vadot    };
670c9ccf3a3SEmmanuel Vadot
671c9ccf3a3SEmmanuel Vadot  - |
672c9ccf3a3SEmmanuel Vadot    // Example 2 (ARM 32-bit, 8-cpu system, two clusters):
673c9ccf3a3SEmmanuel Vadot
674c9ccf3a3SEmmanuel Vadot    cpus {
675c9ccf3a3SEmmanuel Vadot        #size-cells = <0>;
676c9ccf3a3SEmmanuel Vadot        #address-cells = <1>;
677c9ccf3a3SEmmanuel Vadot
678c9ccf3a3SEmmanuel Vadot        cpu@0 {
679c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
680c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a15";
681c9ccf3a3SEmmanuel Vadot            reg = <0x0>;
682c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&cpu_sleep_0_0>, <&cluster_sleep_0>;
683c9ccf3a3SEmmanuel Vadot        };
684c9ccf3a3SEmmanuel Vadot
685c9ccf3a3SEmmanuel Vadot        cpu@1 {
686c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
687c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a15";
688c9ccf3a3SEmmanuel Vadot            reg = <0x1>;
689c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&cpu_sleep_0_0>, <&cluster_sleep_0>;
690c9ccf3a3SEmmanuel Vadot        };
691c9ccf3a3SEmmanuel Vadot
692c9ccf3a3SEmmanuel Vadot        cpu@2 {
693c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
694c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a15";
695c9ccf3a3SEmmanuel Vadot            reg = <0x2>;
696c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&cpu_sleep_0_0>, <&cluster_sleep_0>;
697c9ccf3a3SEmmanuel Vadot        };
698c9ccf3a3SEmmanuel Vadot
699c9ccf3a3SEmmanuel Vadot        cpu@3 {
700c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
701c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a15";
702c9ccf3a3SEmmanuel Vadot            reg = <0x3>;
703c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&cpu_sleep_0_0>, <&cluster_sleep_0>;
704c9ccf3a3SEmmanuel Vadot        };
705c9ccf3a3SEmmanuel Vadot
706c9ccf3a3SEmmanuel Vadot        cpu@100 {
707c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
708c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a7";
709c9ccf3a3SEmmanuel Vadot            reg = <0x100>;
710c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&cpu_sleep_1_0>, <&cluster_sleep_1>;
711c9ccf3a3SEmmanuel Vadot        };
712c9ccf3a3SEmmanuel Vadot
713c9ccf3a3SEmmanuel Vadot        cpu@101 {
714c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
715c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a7";
716c9ccf3a3SEmmanuel Vadot            reg = <0x101>;
717c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&cpu_sleep_1_0>, <&cluster_sleep_1>;
718c9ccf3a3SEmmanuel Vadot        };
719c9ccf3a3SEmmanuel Vadot
720c9ccf3a3SEmmanuel Vadot        cpu@102 {
721c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
722c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a7";
723c9ccf3a3SEmmanuel Vadot            reg = <0x102>;
724c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&cpu_sleep_1_0>, <&cluster_sleep_1>;
725c9ccf3a3SEmmanuel Vadot        };
726c9ccf3a3SEmmanuel Vadot
727c9ccf3a3SEmmanuel Vadot        cpu@103 {
728c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
729c9ccf3a3SEmmanuel Vadot            compatible = "arm,cortex-a7";
730c9ccf3a3SEmmanuel Vadot            reg = <0x103>;
731c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&cpu_sleep_1_0>, <&cluster_sleep_1>;
732c9ccf3a3SEmmanuel Vadot        };
733c9ccf3a3SEmmanuel Vadot
734c9ccf3a3SEmmanuel Vadot        idle-states {
735c9ccf3a3SEmmanuel Vadot            cpu_sleep_0_0: cpu-sleep-0-0 {
736c9ccf3a3SEmmanuel Vadot                compatible = "arm,idle-state";
737c9ccf3a3SEmmanuel Vadot                local-timer-stop;
738c9ccf3a3SEmmanuel Vadot                entry-latency-us = <200>;
739c9ccf3a3SEmmanuel Vadot                exit-latency-us = <100>;
740c9ccf3a3SEmmanuel Vadot                min-residency-us = <400>;
741c9ccf3a3SEmmanuel Vadot                wakeup-latency-us = <250>;
742c9ccf3a3SEmmanuel Vadot            };
743c9ccf3a3SEmmanuel Vadot
744c9ccf3a3SEmmanuel Vadot            cluster_sleep_0: cluster-sleep-0 {
745c9ccf3a3SEmmanuel Vadot                compatible = "arm,idle-state";
746c9ccf3a3SEmmanuel Vadot                local-timer-stop;
747c9ccf3a3SEmmanuel Vadot                entry-latency-us = <500>;
748c9ccf3a3SEmmanuel Vadot                exit-latency-us = <1500>;
749c9ccf3a3SEmmanuel Vadot                min-residency-us = <2500>;
750c9ccf3a3SEmmanuel Vadot                wakeup-latency-us = <1700>;
751c9ccf3a3SEmmanuel Vadot            };
752c9ccf3a3SEmmanuel Vadot
753c9ccf3a3SEmmanuel Vadot            cpu_sleep_1_0: cpu-sleep-1-0 {
754c9ccf3a3SEmmanuel Vadot                compatible = "arm,idle-state";
755c9ccf3a3SEmmanuel Vadot                local-timer-stop;
756c9ccf3a3SEmmanuel Vadot                entry-latency-us = <300>;
757c9ccf3a3SEmmanuel Vadot                exit-latency-us = <500>;
758c9ccf3a3SEmmanuel Vadot                min-residency-us = <900>;
759c9ccf3a3SEmmanuel Vadot                wakeup-latency-us = <600>;
760c9ccf3a3SEmmanuel Vadot            };
761c9ccf3a3SEmmanuel Vadot
762c9ccf3a3SEmmanuel Vadot            cluster_sleep_1: cluster-sleep-1 {
763c9ccf3a3SEmmanuel Vadot                compatible = "arm,idle-state";
764c9ccf3a3SEmmanuel Vadot                local-timer-stop;
765c9ccf3a3SEmmanuel Vadot                entry-latency-us = <800>;
766c9ccf3a3SEmmanuel Vadot                exit-latency-us = <2000>;
767c9ccf3a3SEmmanuel Vadot                min-residency-us = <6500>;
768c9ccf3a3SEmmanuel Vadot                wakeup-latency-us = <2300>;
769c9ccf3a3SEmmanuel Vadot            };
770c9ccf3a3SEmmanuel Vadot        };
771c9ccf3a3SEmmanuel Vadot    };
772c9ccf3a3SEmmanuel Vadot
773c9ccf3a3SEmmanuel Vadot  - |
774c9ccf3a3SEmmanuel Vadot    // Example 3 (RISC-V 64-bit, 4-cpu systems, two clusters):
775c9ccf3a3SEmmanuel Vadot
776c9ccf3a3SEmmanuel Vadot    cpus {
777c9ccf3a3SEmmanuel Vadot        #size-cells = <0>;
778c9ccf3a3SEmmanuel Vadot        #address-cells = <1>;
779c9ccf3a3SEmmanuel Vadot
780c9ccf3a3SEmmanuel Vadot        cpu@0 {
781c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
782c9ccf3a3SEmmanuel Vadot            compatible = "riscv";
783c9ccf3a3SEmmanuel Vadot            reg = <0x0>;
784c9ccf3a3SEmmanuel Vadot            riscv,isa = "rv64imafdc";
785c9ccf3a3SEmmanuel Vadot            mmu-type = "riscv,sv48";
786c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RET_0_0>, <&CPU_NONRET_0_0>,
787c9ccf3a3SEmmanuel Vadot                            <&CLUSTER_RET_0>, <&CLUSTER_NONRET_0>;
788c9ccf3a3SEmmanuel Vadot
789c9ccf3a3SEmmanuel Vadot            cpu_intc0: interrupt-controller {
790c9ccf3a3SEmmanuel Vadot                #interrupt-cells = <1>;
791c9ccf3a3SEmmanuel Vadot                compatible = "riscv,cpu-intc";
792c9ccf3a3SEmmanuel Vadot                interrupt-controller;
793c9ccf3a3SEmmanuel Vadot            };
794c9ccf3a3SEmmanuel Vadot        };
795c9ccf3a3SEmmanuel Vadot
796c9ccf3a3SEmmanuel Vadot        cpu@1 {
797c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
798c9ccf3a3SEmmanuel Vadot            compatible = "riscv";
799c9ccf3a3SEmmanuel Vadot            reg = <0x1>;
800c9ccf3a3SEmmanuel Vadot            riscv,isa = "rv64imafdc";
801c9ccf3a3SEmmanuel Vadot            mmu-type = "riscv,sv48";
802c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RET_0_0>, <&CPU_NONRET_0_0>,
803c9ccf3a3SEmmanuel Vadot                            <&CLUSTER_RET_0>, <&CLUSTER_NONRET_0>;
804c9ccf3a3SEmmanuel Vadot
805c9ccf3a3SEmmanuel Vadot            cpu_intc1: interrupt-controller {
806c9ccf3a3SEmmanuel Vadot                #interrupt-cells = <1>;
807c9ccf3a3SEmmanuel Vadot                compatible = "riscv,cpu-intc";
808c9ccf3a3SEmmanuel Vadot                interrupt-controller;
809c9ccf3a3SEmmanuel Vadot            };
810c9ccf3a3SEmmanuel Vadot        };
811c9ccf3a3SEmmanuel Vadot
812c9ccf3a3SEmmanuel Vadot        cpu@10 {
813c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
814c9ccf3a3SEmmanuel Vadot            compatible = "riscv";
815c9ccf3a3SEmmanuel Vadot            reg = <0x10>;
816c9ccf3a3SEmmanuel Vadot            riscv,isa = "rv64imafdc";
817c9ccf3a3SEmmanuel Vadot            mmu-type = "riscv,sv48";
818c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RET_1_0>, <&CPU_NONRET_1_0>,
819c9ccf3a3SEmmanuel Vadot                            <&CLUSTER_RET_1>, <&CLUSTER_NONRET_1>;
820c9ccf3a3SEmmanuel Vadot
821c9ccf3a3SEmmanuel Vadot            cpu_intc10: interrupt-controller {
822c9ccf3a3SEmmanuel Vadot                #interrupt-cells = <1>;
823c9ccf3a3SEmmanuel Vadot                compatible = "riscv,cpu-intc";
824c9ccf3a3SEmmanuel Vadot                interrupt-controller;
825c9ccf3a3SEmmanuel Vadot            };
826c9ccf3a3SEmmanuel Vadot        };
827c9ccf3a3SEmmanuel Vadot
828c9ccf3a3SEmmanuel Vadot        cpu@11 {
829c9ccf3a3SEmmanuel Vadot            device_type = "cpu";
830c9ccf3a3SEmmanuel Vadot            compatible = "riscv";
831c9ccf3a3SEmmanuel Vadot            reg = <0x11>;
832c9ccf3a3SEmmanuel Vadot            riscv,isa = "rv64imafdc";
833c9ccf3a3SEmmanuel Vadot            mmu-type = "riscv,sv48";
834c9ccf3a3SEmmanuel Vadot            cpu-idle-states = <&CPU_RET_1_0>, <&CPU_NONRET_1_0>,
835c9ccf3a3SEmmanuel Vadot                            <&CLUSTER_RET_1>, <&CLUSTER_NONRET_1>;
836c9ccf3a3SEmmanuel Vadot
837c9ccf3a3SEmmanuel Vadot            cpu_intc11: interrupt-controller {
838c9ccf3a3SEmmanuel Vadot                #interrupt-cells = <1>;
839c9ccf3a3SEmmanuel Vadot                compatible = "riscv,cpu-intc";
840c9ccf3a3SEmmanuel Vadot                interrupt-controller;
841c9ccf3a3SEmmanuel Vadot            };
842c9ccf3a3SEmmanuel Vadot        };
843c9ccf3a3SEmmanuel Vadot
844c9ccf3a3SEmmanuel Vadot        idle-states {
845c9ccf3a3SEmmanuel Vadot            CPU_RET_0_0: cpu-retentive-0-0 {
846c9ccf3a3SEmmanuel Vadot                compatible = "riscv,idle-state";
847c9ccf3a3SEmmanuel Vadot                riscv,sbi-suspend-param = <0x10000000>;
848c9ccf3a3SEmmanuel Vadot                entry-latency-us = <20>;
849c9ccf3a3SEmmanuel Vadot                exit-latency-us = <40>;
850c9ccf3a3SEmmanuel Vadot                min-residency-us = <80>;
851c9ccf3a3SEmmanuel Vadot            };
852c9ccf3a3SEmmanuel Vadot
853c9ccf3a3SEmmanuel Vadot            CPU_NONRET_0_0: cpu-nonretentive-0-0 {
854c9ccf3a3SEmmanuel Vadot                compatible = "riscv,idle-state";
855c9ccf3a3SEmmanuel Vadot                riscv,sbi-suspend-param = <0x90000000>;
856c9ccf3a3SEmmanuel Vadot                entry-latency-us = <250>;
857c9ccf3a3SEmmanuel Vadot                exit-latency-us = <500>;
858c9ccf3a3SEmmanuel Vadot                min-residency-us = <950>;
859c9ccf3a3SEmmanuel Vadot            };
860c9ccf3a3SEmmanuel Vadot
861c9ccf3a3SEmmanuel Vadot            CLUSTER_RET_0: cluster-retentive-0 {
862c9ccf3a3SEmmanuel Vadot                compatible = "riscv,idle-state";
863c9ccf3a3SEmmanuel Vadot                riscv,sbi-suspend-param = <0x11000000>;
864c9ccf3a3SEmmanuel Vadot                local-timer-stop;
865c9ccf3a3SEmmanuel Vadot                entry-latency-us = <50>;
866c9ccf3a3SEmmanuel Vadot                exit-latency-us = <100>;
867c9ccf3a3SEmmanuel Vadot                min-residency-us = <250>;
868c9ccf3a3SEmmanuel Vadot                wakeup-latency-us = <130>;
869c9ccf3a3SEmmanuel Vadot            };
870c9ccf3a3SEmmanuel Vadot
871c9ccf3a3SEmmanuel Vadot            CLUSTER_NONRET_0: cluster-nonretentive-0 {
872c9ccf3a3SEmmanuel Vadot                compatible = "riscv,idle-state";
873c9ccf3a3SEmmanuel Vadot                riscv,sbi-suspend-param = <0x91000000>;
874c9ccf3a3SEmmanuel Vadot                local-timer-stop;
875c9ccf3a3SEmmanuel Vadot                entry-latency-us = <600>;
876c9ccf3a3SEmmanuel Vadot                exit-latency-us = <1100>;
877c9ccf3a3SEmmanuel Vadot                min-residency-us = <2700>;
878c9ccf3a3SEmmanuel Vadot                wakeup-latency-us = <1500>;
879c9ccf3a3SEmmanuel Vadot            };
880c9ccf3a3SEmmanuel Vadot
881c9ccf3a3SEmmanuel Vadot            CPU_RET_1_0: cpu-retentive-1-0 {
882c9ccf3a3SEmmanuel Vadot                compatible = "riscv,idle-state";
883c9ccf3a3SEmmanuel Vadot                riscv,sbi-suspend-param = <0x10000010>;
884c9ccf3a3SEmmanuel Vadot                entry-latency-us = <20>;
885c9ccf3a3SEmmanuel Vadot                exit-latency-us = <40>;
886c9ccf3a3SEmmanuel Vadot                min-residency-us = <80>;
887c9ccf3a3SEmmanuel Vadot            };
888c9ccf3a3SEmmanuel Vadot
889c9ccf3a3SEmmanuel Vadot            CPU_NONRET_1_0: cpu-nonretentive-1-0 {
890c9ccf3a3SEmmanuel Vadot                compatible = "riscv,idle-state";
891c9ccf3a3SEmmanuel Vadot                riscv,sbi-suspend-param = <0x90000010>;
892c9ccf3a3SEmmanuel Vadot                entry-latency-us = <250>;
893c9ccf3a3SEmmanuel Vadot                exit-latency-us = <500>;
894c9ccf3a3SEmmanuel Vadot                min-residency-us = <950>;
895c9ccf3a3SEmmanuel Vadot            };
896c9ccf3a3SEmmanuel Vadot
897c9ccf3a3SEmmanuel Vadot            CLUSTER_RET_1: cluster-retentive-1 {
898c9ccf3a3SEmmanuel Vadot                compatible = "riscv,idle-state";
899c9ccf3a3SEmmanuel Vadot                riscv,sbi-suspend-param = <0x11000010>;
900c9ccf3a3SEmmanuel Vadot                local-timer-stop;
901c9ccf3a3SEmmanuel Vadot                entry-latency-us = <50>;
902c9ccf3a3SEmmanuel Vadot                exit-latency-us = <100>;
903c9ccf3a3SEmmanuel Vadot                min-residency-us = <250>;
904c9ccf3a3SEmmanuel Vadot                wakeup-latency-us = <130>;
905c9ccf3a3SEmmanuel Vadot            };
906c9ccf3a3SEmmanuel Vadot
907c9ccf3a3SEmmanuel Vadot            CLUSTER_NONRET_1: cluster-nonretentive-1 {
908c9ccf3a3SEmmanuel Vadot                compatible = "riscv,idle-state";
909c9ccf3a3SEmmanuel Vadot                riscv,sbi-suspend-param = <0x91000010>;
910c9ccf3a3SEmmanuel Vadot                local-timer-stop;
911c9ccf3a3SEmmanuel Vadot                entry-latency-us = <600>;
912c9ccf3a3SEmmanuel Vadot                exit-latency-us = <1100>;
913c9ccf3a3SEmmanuel Vadot                min-residency-us = <2700>;
914c9ccf3a3SEmmanuel Vadot                wakeup-latency-us = <1500>;
915c9ccf3a3SEmmanuel Vadot            };
916c9ccf3a3SEmmanuel Vadot        };
917c9ccf3a3SEmmanuel Vadot    };
918c9ccf3a3SEmmanuel Vadot
9198d13bc63SEmmanuel Vadot    // Example 4 - Qualcomm SPC
9208d13bc63SEmmanuel Vadot    idle-states {
9218d13bc63SEmmanuel Vadot      cpu_spc: cpu-spc {
9228d13bc63SEmmanuel Vadot        compatible = "qcom,idle-state-spc", "arm,idle-state";
9238d13bc63SEmmanuel Vadot        entry-latency-us = <150>;
9248d13bc63SEmmanuel Vadot        exit-latency-us = <200>;
9258d13bc63SEmmanuel Vadot        min-residency-us = <2000>;
9268d13bc63SEmmanuel Vadot      };
9278d13bc63SEmmanuel Vadot    };
928c9ccf3a3SEmmanuel Vadot...
929