162306a36Sopenharmony_ci# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
262306a36Sopenharmony_ci%YAML 1.2
362306a36Sopenharmony_ci---
462306a36Sopenharmony_ci$id: http://devicetree.org/schemas/cpu/idle-states.yaml#
562306a36Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml#
662306a36Sopenharmony_ci
762306a36Sopenharmony_cititle: Idle states
862306a36Sopenharmony_ci
962306a36Sopenharmony_cimaintainers:
1062306a36Sopenharmony_ci  - Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
1162306a36Sopenharmony_ci  - Anup Patel <anup@brainfault.org>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cidescription: |+
1462306a36Sopenharmony_ci  ==========================================
1562306a36Sopenharmony_ci  1 - Introduction
1662306a36Sopenharmony_ci  ==========================================
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci  ARM and RISC-V systems contain HW capable of managing power consumption
1962306a36Sopenharmony_ci  dynamically, where cores can be put in different low-power states (ranging
2062306a36Sopenharmony_ci  from simple wfi to power gating) according to OS PM policies. The CPU states
2162306a36Sopenharmony_ci  representing the range of dynamic idle states that a processor can enter at
2262306a36Sopenharmony_ci  run-time, can be specified through device tree bindings representing the
2362306a36Sopenharmony_ci  parameters required to enter/exit specific idle states on a given processor.
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci  ==========================================
2662306a36Sopenharmony_ci  2 - ARM idle states
2762306a36Sopenharmony_ci  ==========================================
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci  According to the Server Base System Architecture document (SBSA, [3]), the
3062306a36Sopenharmony_ci  power states an ARM CPU can be put into are identified by the following list:
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci  - Running
3362306a36Sopenharmony_ci  - Idle_standby
3462306a36Sopenharmony_ci  - Idle_retention
3562306a36Sopenharmony_ci  - Sleep
3662306a36Sopenharmony_ci  - Off
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci  The power states described in the SBSA document define the basic CPU states on
3962306a36Sopenharmony_ci  top of which ARM platforms implement power management schemes that allow an OS
4062306a36Sopenharmony_ci  PM implementation to put the processor in different idle states (which include
4162306a36Sopenharmony_ci  states listed above; "off" state is not an idle state since it does not have
4262306a36Sopenharmony_ci  wake-up capabilities, hence it is not considered in this document).
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci  Idle state parameters (e.g. entry latency) are platform specific and need to
4562306a36Sopenharmony_ci  be characterized with bindings that provide the required information to OS PM
4662306a36Sopenharmony_ci  code so that it can build the required tables and use them at runtime.
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci  The device tree binding definition for ARM idle states is the subject of this
4962306a36Sopenharmony_ci  document.
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci  ==========================================
5262306a36Sopenharmony_ci  3 - RISC-V idle states
5362306a36Sopenharmony_ci  ==========================================
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci  On RISC-V systems, the HARTs (or CPUs) [6] can be put in platform specific
5662306a36Sopenharmony_ci  suspend (or idle) states (ranging from simple WFI, power gating, etc). The
5762306a36Sopenharmony_ci  RISC-V SBI v0.3 (or higher) [7] hart state management extension provides a
5862306a36Sopenharmony_ci  standard mechanism for OS to request HART state transitions.
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci  The platform specific suspend (or idle) states of a hart can be either
6162306a36Sopenharmony_ci  retentive or non-rententive in nature. A retentive suspend state will
6262306a36Sopenharmony_ci  preserve HART registers and CSR values for all privilege modes whereas
6362306a36Sopenharmony_ci  a non-retentive suspend state will not preserve HART registers and CSR
6462306a36Sopenharmony_ci  values.
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci  ===========================================
6762306a36Sopenharmony_ci  4 - idle-states definitions
6862306a36Sopenharmony_ci  ===========================================
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci  Idle states are characterized for a specific system through a set of
7162306a36Sopenharmony_ci  timing and energy related properties, that underline the HW behaviour
7262306a36Sopenharmony_ci  triggered upon idle states entry and exit.
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci  The following diagram depicts the CPU execution phases and related timing
7562306a36Sopenharmony_ci  properties required to enter and exit an idle state:
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci  ..__[EXEC]__|__[PREP]__|__[ENTRY]__|__[IDLE]__|__[EXIT]__|__[EXEC]__..
7862306a36Sopenharmony_ci              |          |           |          |          |
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci              |<------ entry ------->|
8162306a36Sopenharmony_ci              |       latency        |
8262306a36Sopenharmony_ci                                                |<- exit ->|
8362306a36Sopenharmony_ci                                                |  latency |
8462306a36Sopenharmony_ci              |<-------- min-residency -------->|
8562306a36Sopenharmony_ci                         |<-------  wakeup-latency ------->|
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci      Diagram 1: CPU idle state execution phases
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci  EXEC:  Normal CPU execution.
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci  PREP:  Preparation phase before committing the hardware to idle mode
9262306a36Sopenharmony_ci    like cache flushing. This is abortable on pending wake-up
9362306a36Sopenharmony_ci    event conditions. The abort latency is assumed to be negligible
9462306a36Sopenharmony_ci    (i.e. less than the ENTRY + EXIT duration). If aborted, CPU
9562306a36Sopenharmony_ci    goes back to EXEC. This phase is optional. If not abortable,
9662306a36Sopenharmony_ci    this should be included in the ENTRY phase instead.
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci  ENTRY:  The hardware is committed to idle mode. This period must run
9962306a36Sopenharmony_ci    to completion up to IDLE before anything else can happen.
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci  IDLE:  This is the actual energy-saving idle period. This may last
10262306a36Sopenharmony_ci    between 0 and infinite time, until a wake-up event occurs.
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci  EXIT:  Period during which the CPU is brought back to operational
10562306a36Sopenharmony_ci    mode (EXEC).
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci  entry-latency: Worst case latency required to enter the idle state. The
10862306a36Sopenharmony_ci  exit-latency may be guaranteed only after entry-latency has passed.
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci  min-residency: Minimum period, including preparation and entry, for a given
11162306a36Sopenharmony_ci  idle state to be worthwhile energywise.
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci  wakeup-latency: Maximum delay between the signaling of a wake-up event and the
11462306a36Sopenharmony_ci  CPU being able to execute normal code again. If not specified, this is assumed
11562306a36Sopenharmony_ci  to be entry-latency + exit-latency.
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci  These timing parameters can be used by an OS in different circumstances.
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci  An idle CPU requires the expected min-residency time to select the most
12062306a36Sopenharmony_ci  appropriate idle state based on the expected expiry time of the next IRQ
12162306a36Sopenharmony_ci  (i.e. wake-up) that causes the CPU to return to the EXEC phase.
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci  An operating system scheduler may need to compute the shortest wake-up delay
12462306a36Sopenharmony_ci  for CPUs in the system by detecting how long will it take to get a CPU out
12562306a36Sopenharmony_ci  of an idle state, e.g.:
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci  wakeup-delay = exit-latency + max(entry-latency - (now - entry-timestamp), 0)
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci  In other words, the scheduler can make its scheduling decision by selecting
13062306a36Sopenharmony_ci  (e.g. waking-up) the CPU with the shortest wake-up delay.
13162306a36Sopenharmony_ci  The wake-up delay must take into account the entry latency if that period
13262306a36Sopenharmony_ci  has not expired. The abortable nature of the PREP period can be ignored
13362306a36Sopenharmony_ci  if it cannot be relied upon (e.g. the PREP deadline may occur much sooner than
13462306a36Sopenharmony_ci  the worst case since it depends on the CPU operating conditions, i.e. caches
13562306a36Sopenharmony_ci  state).
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci  An OS has to reliably probe the wakeup-latency since some devices can enforce
13862306a36Sopenharmony_ci  latency constraint guarantees to work properly, so the OS has to detect the
13962306a36Sopenharmony_ci  worst case wake-up latency it can incur if a CPU is allowed to enter an
14062306a36Sopenharmony_ci  idle state, and possibly to prevent that to guarantee reliable device
14162306a36Sopenharmony_ci  functioning.
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci  The min-residency time parameter deserves further explanation since it is
14462306a36Sopenharmony_ci  expressed in time units but must factor in energy consumption coefficients.
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci  The energy consumption of a cpu when it enters a power state can be roughly
14762306a36Sopenharmony_ci  characterised by the following graph:
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci                 |
15062306a36Sopenharmony_ci                 |
15162306a36Sopenharmony_ci                 |
15262306a36Sopenharmony_ci             e   |
15362306a36Sopenharmony_ci             n   |                                      /---
15462306a36Sopenharmony_ci             e   |                               /------
15562306a36Sopenharmony_ci             r   |                        /------
15662306a36Sopenharmony_ci             g   |                  /-----
15762306a36Sopenharmony_ci             y   |           /------
15862306a36Sopenharmony_ci                 |       ----
15962306a36Sopenharmony_ci                 |      /|
16062306a36Sopenharmony_ci                 |     / |
16162306a36Sopenharmony_ci                 |    /  |
16262306a36Sopenharmony_ci                 |   /   |
16362306a36Sopenharmony_ci                 |  /    |
16462306a36Sopenharmony_ci                 | /     |
16562306a36Sopenharmony_ci                 |/      |
16662306a36Sopenharmony_ci            -----|-------+----------------------------------
16762306a36Sopenharmony_ci                0|       1                              time(ms)
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci      Graph 1: Energy vs time example
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci  The graph is split in two parts delimited by time 1ms on the X-axis.
17262306a36Sopenharmony_ci  The graph curve with X-axis values = { x | 0 < x < 1ms } has a steep slope
17362306a36Sopenharmony_ci  and denotes the energy costs incurred while entering and leaving the idle
17462306a36Sopenharmony_ci  state.
17562306a36Sopenharmony_ci  The graph curve in the area delimited by X-axis values = {x | x > 1ms } has
17662306a36Sopenharmony_ci  shallower slope and essentially represents the energy consumption of the idle
17762306a36Sopenharmony_ci  state.
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci  min-residency is defined for a given idle state as the minimum expected
18062306a36Sopenharmony_ci  residency time for a state (inclusive of preparation and entry) after
18162306a36Sopenharmony_ci  which choosing that state become the most energy efficient option. A good
18262306a36Sopenharmony_ci  way to visualise this, is by taking the same graph above and comparing some
18362306a36Sopenharmony_ci  states energy consumptions plots.
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci  For sake of simplicity, let's consider a system with two idle states IDLE1,
18662306a36Sopenharmony_ci  and IDLE2:
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci            |
18962306a36Sopenharmony_ci            |
19062306a36Sopenharmony_ci            |
19162306a36Sopenharmony_ci            |                                                  /-- IDLE1
19262306a36Sopenharmony_ci         e  |                                              /---
19362306a36Sopenharmony_ci         n  |                                         /----
19462306a36Sopenharmony_ci         e  |                                     /---
19562306a36Sopenharmony_ci         r  |                                /-----/--------- IDLE2
19662306a36Sopenharmony_ci         g  |                    /-------/---------
19762306a36Sopenharmony_ci         y  |        ------------    /---|
19862306a36Sopenharmony_ci            |       /           /----    |
19962306a36Sopenharmony_ci            |      /        /---         |
20062306a36Sopenharmony_ci            |     /    /----             |
20162306a36Sopenharmony_ci            |    / /---                  |
20262306a36Sopenharmony_ci            |   ---                      |
20362306a36Sopenharmony_ci            |  /                         |
20462306a36Sopenharmony_ci            | /                          |
20562306a36Sopenharmony_ci            |/                           |                  time
20662306a36Sopenharmony_ci         ---/----------------------------+------------------------
20762306a36Sopenharmony_ci            |IDLE1-energy < IDLE2-energy | IDLE2-energy < IDLE1-energy
20862306a36Sopenharmony_ci                                         |
20962306a36Sopenharmony_ci                                  IDLE2-min-residency
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci      Graph 2: idle states min-residency example
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci  In graph 2 above, that takes into account idle states entry/exit energy
21462306a36Sopenharmony_ci  costs, it is clear that if the idle state residency time (i.e. time till next
21562306a36Sopenharmony_ci  wake-up IRQ) is less than IDLE2-min-residency, IDLE1 is the better idle state
21662306a36Sopenharmony_ci  choice energywise.
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci  This is mainly down to the fact that IDLE1 entry/exit energy costs are lower
21962306a36Sopenharmony_ci  than IDLE2.
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci  However, the lower power consumption (i.e. shallower energy curve slope) of
22262306a36Sopenharmony_ci  idle state IDLE2 implies that after a suitable time, IDLE2 becomes more energy
22362306a36Sopenharmony_ci  efficient.
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci  The time at which IDLE2 becomes more energy efficient than IDLE1 (and other
22662306a36Sopenharmony_ci  shallower states in a system with multiple idle states) is defined
22762306a36Sopenharmony_ci  IDLE2-min-residency and corresponds to the time when energy consumption of
22862306a36Sopenharmony_ci  IDLE1 and IDLE2 states breaks even.
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci  The definitions provided in this section underpin the idle states
23162306a36Sopenharmony_ci  properties specification that is the subject of the following sections.
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci  ===========================================
23462306a36Sopenharmony_ci  5 - idle-states node
23562306a36Sopenharmony_ci  ===========================================
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci  The processor idle states are defined within the idle-states node, which is
23862306a36Sopenharmony_ci  a direct child of the cpus node [1] and provides a container where the
23962306a36Sopenharmony_ci  processor idle states, defined as device tree nodes, are listed.
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci  On ARM systems, it is a container of processor idle states nodes. If the
24262306a36Sopenharmony_ci  system does not provide CPU power management capabilities, or the processor
24362306a36Sopenharmony_ci  just supports idle_standby, an idle-states node is not required.
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci  ===========================================
24662306a36Sopenharmony_ci  6 - References
24762306a36Sopenharmony_ci  ===========================================
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci  [1] ARM Linux Kernel documentation - CPUs bindings
25062306a36Sopenharmony_ci      Documentation/devicetree/bindings/arm/cpus.yaml
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci  [2] ARM Linux Kernel documentation - PSCI bindings
25362306a36Sopenharmony_ci      Documentation/devicetree/bindings/arm/psci.yaml
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci  [3] ARM Server Base System Architecture (SBSA)
25662306a36Sopenharmony_ci      http://infocenter.arm.com/help/index.jsp
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci  [4] ARM Architecture Reference Manuals
25962306a36Sopenharmony_ci      http://infocenter.arm.com/help/index.jsp
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci  [5] ARM Linux Kernel documentation - Booting AArch64 Linux
26262306a36Sopenharmony_ci      Documentation/arch/arm64/booting.rst
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci  [6] RISC-V Linux Kernel documentation - CPUs bindings
26562306a36Sopenharmony_ci      Documentation/devicetree/bindings/riscv/cpus.yaml
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci  [7] RISC-V Supervisor Binary Interface (SBI)
26862306a36Sopenharmony_ci      http://github.com/riscv/riscv-sbi-doc/riscv-sbi.adoc
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ciproperties:
27162306a36Sopenharmony_ci  $nodename:
27262306a36Sopenharmony_ci    const: idle-states
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ci  entry-method:
27562306a36Sopenharmony_ci    description: |
27662306a36Sopenharmony_ci      Usage and definition depend on ARM architecture version.
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci      On ARM v8 64-bit this property is required.
27962306a36Sopenharmony_ci      On ARM 32-bit systems this property is optional
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci      This assumes that the "enable-method" property is set to "psci" in the cpu
28262306a36Sopenharmony_ci      node[5] that is responsible for setting up CPU idle management in the OS
28362306a36Sopenharmony_ci      implementation.
28462306a36Sopenharmony_ci    const: psci
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_cipatternProperties:
28762306a36Sopenharmony_ci  "^(cpu|cluster)-":
28862306a36Sopenharmony_ci    type: object
28962306a36Sopenharmony_ci    description: |
29062306a36Sopenharmony_ci      Each state node represents an idle state description and must be defined
29162306a36Sopenharmony_ci      as follows.
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ci      The idle state entered by executing the wfi instruction (idle_standby
29462306a36Sopenharmony_ci      SBSA,[3][4]) is considered standard on all ARM and RISC-V platforms and
29562306a36Sopenharmony_ci      therefore must not be listed.
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci      In addition to the properties listed above, a state node may require
29862306a36Sopenharmony_ci      additional properties specific to the entry-method defined in the
29962306a36Sopenharmony_ci      idle-states node. Please refer to the entry-method bindings
30062306a36Sopenharmony_ci      documentation for properties definitions.
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci    properties:
30362306a36Sopenharmony_ci      compatible:
30462306a36Sopenharmony_ci        enum:
30562306a36Sopenharmony_ci          - arm,idle-state
30662306a36Sopenharmony_ci          - riscv,idle-state
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci      arm,psci-suspend-param:
30962306a36Sopenharmony_ci        $ref: /schemas/types.yaml#/definitions/uint32
31062306a36Sopenharmony_ci        description: |
31162306a36Sopenharmony_ci          power_state parameter to pass to the ARM PSCI suspend call.
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci          Device tree nodes that require usage of PSCI CPU_SUSPEND function
31462306a36Sopenharmony_ci          (i.e. idle states node with entry-method property is set to "psci")
31562306a36Sopenharmony_ci          must specify this property.
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci      riscv,sbi-suspend-param:
31862306a36Sopenharmony_ci        $ref: /schemas/types.yaml#/definitions/uint32
31962306a36Sopenharmony_ci        description: |
32062306a36Sopenharmony_ci          suspend_type parameter to pass to the RISC-V SBI HSM suspend call.
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci          This property is required in idle state nodes of device tree meant
32362306a36Sopenharmony_ci          for RISC-V systems. For more details on the suspend_type parameter
32462306a36Sopenharmony_ci          refer the SBI specifiation v0.3 (or higher) [7].
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ci      local-timer-stop:
32762306a36Sopenharmony_ci        description:
32862306a36Sopenharmony_ci          If present the CPU local timer control logic is
32962306a36Sopenharmony_ci             lost on state entry, otherwise it is retained.
33062306a36Sopenharmony_ci        type: boolean
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci      entry-latency-us:
33362306a36Sopenharmony_ci        description:
33462306a36Sopenharmony_ci          Worst case latency in microseconds required to enter the idle state.
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ci      exit-latency-us:
33762306a36Sopenharmony_ci        description:
33862306a36Sopenharmony_ci          Worst case latency in microseconds required to exit the idle state.
33962306a36Sopenharmony_ci          The exit-latency-us duration may be guaranteed only after
34062306a36Sopenharmony_ci          entry-latency-us has passed.
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci      min-residency-us:
34362306a36Sopenharmony_ci        description:
34462306a36Sopenharmony_ci          Minimum residency duration in microseconds, inclusive of preparation
34562306a36Sopenharmony_ci          and entry, for this idle state to be considered worthwhile energy wise
34662306a36Sopenharmony_ci          (refer to section 2 of this document for a complete description).
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_ci      wakeup-latency-us:
34962306a36Sopenharmony_ci        description: |
35062306a36Sopenharmony_ci          Maximum delay between the signaling of a wake-up event and the CPU
35162306a36Sopenharmony_ci          being able to execute normal code again. If omitted, this is assumed
35262306a36Sopenharmony_ci          to be equal to:
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci            entry-latency-us + exit-latency-us
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci          It is important to supply this value on systems where the duration of
35762306a36Sopenharmony_ci          PREP phase (see diagram 1, section 2) is non-neglibigle. In such
35862306a36Sopenharmony_ci          systems entry-latency-us + exit-latency-us will exceed
35962306a36Sopenharmony_ci          wakeup-latency-us by this duration.
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci      idle-state-name:
36262306a36Sopenharmony_ci        $ref: /schemas/types.yaml#/definitions/string
36362306a36Sopenharmony_ci        description:
36462306a36Sopenharmony_ci          A string used as a descriptive name for the idle state.
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci    additionalProperties: false
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci    required:
36962306a36Sopenharmony_ci      - compatible
37062306a36Sopenharmony_ci      - entry-latency-us
37162306a36Sopenharmony_ci      - exit-latency-us
37262306a36Sopenharmony_ci      - min-residency-us
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ciadditionalProperties: false
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ciexamples:
37762306a36Sopenharmony_ci  - |
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci    cpus {
38062306a36Sopenharmony_ci        #size-cells = <0>;
38162306a36Sopenharmony_ci        #address-cells = <2>;
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci        cpu@0 {
38462306a36Sopenharmony_ci            device_type = "cpu";
38562306a36Sopenharmony_ci            compatible = "arm,cortex-a57";
38662306a36Sopenharmony_ci            reg = <0x0 0x0>;
38762306a36Sopenharmony_ci            enable-method = "psci";
38862306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
38962306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
39062306a36Sopenharmony_ci        };
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_ci        cpu@1 {
39362306a36Sopenharmony_ci            device_type = "cpu";
39462306a36Sopenharmony_ci            compatible = "arm,cortex-a57";
39562306a36Sopenharmony_ci            reg = <0x0 0x1>;
39662306a36Sopenharmony_ci            enable-method = "psci";
39762306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
39862306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
39962306a36Sopenharmony_ci        };
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_ci        cpu@100 {
40262306a36Sopenharmony_ci            device_type = "cpu";
40362306a36Sopenharmony_ci            compatible = "arm,cortex-a57";
40462306a36Sopenharmony_ci            reg = <0x0 0x100>;
40562306a36Sopenharmony_ci            enable-method = "psci";
40662306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
40762306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
40862306a36Sopenharmony_ci        };
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci        cpu@101 {
41162306a36Sopenharmony_ci            device_type = "cpu";
41262306a36Sopenharmony_ci            compatible = "arm,cortex-a57";
41362306a36Sopenharmony_ci            reg = <0x0 0x101>;
41462306a36Sopenharmony_ci            enable-method = "psci";
41562306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
41662306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
41762306a36Sopenharmony_ci        };
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_ci        cpu@10000 {
42062306a36Sopenharmony_ci            device_type = "cpu";
42162306a36Sopenharmony_ci            compatible = "arm,cortex-a57";
42262306a36Sopenharmony_ci            reg = <0x0 0x10000>;
42362306a36Sopenharmony_ci            enable-method = "psci";
42462306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
42562306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
42662306a36Sopenharmony_ci        };
42762306a36Sopenharmony_ci
42862306a36Sopenharmony_ci        cpu@10001 {
42962306a36Sopenharmony_ci            device_type = "cpu";
43062306a36Sopenharmony_ci            compatible = "arm,cortex-a57";
43162306a36Sopenharmony_ci            reg = <0x0 0x10001>;
43262306a36Sopenharmony_ci            enable-method = "psci";
43362306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
43462306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
43562306a36Sopenharmony_ci        };
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci        cpu@10100 {
43862306a36Sopenharmony_ci            device_type = "cpu";
43962306a36Sopenharmony_ci            compatible = "arm,cortex-a57";
44062306a36Sopenharmony_ci            reg = <0x0 0x10100>;
44162306a36Sopenharmony_ci            enable-method = "psci";
44262306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
44362306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
44462306a36Sopenharmony_ci        };
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ci        cpu@10101 {
44762306a36Sopenharmony_ci            device_type = "cpu";
44862306a36Sopenharmony_ci            compatible = "arm,cortex-a57";
44962306a36Sopenharmony_ci            reg = <0x0 0x10101>;
45062306a36Sopenharmony_ci            enable-method = "psci";
45162306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_0_0>, <&CPU_SLEEP_0_0>,
45262306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_0>, <&CLUSTER_SLEEP_0>;
45362306a36Sopenharmony_ci        };
45462306a36Sopenharmony_ci
45562306a36Sopenharmony_ci        cpu@100000000 {
45662306a36Sopenharmony_ci            device_type = "cpu";
45762306a36Sopenharmony_ci            compatible = "arm,cortex-a53";
45862306a36Sopenharmony_ci            reg = <0x1 0x0>;
45962306a36Sopenharmony_ci            enable-method = "psci";
46062306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
46162306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
46262306a36Sopenharmony_ci        };
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci        cpu@100000001 {
46562306a36Sopenharmony_ci            device_type = "cpu";
46662306a36Sopenharmony_ci            compatible = "arm,cortex-a53";
46762306a36Sopenharmony_ci            reg = <0x1 0x1>;
46862306a36Sopenharmony_ci            enable-method = "psci";
46962306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
47062306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
47162306a36Sopenharmony_ci        };
47262306a36Sopenharmony_ci
47362306a36Sopenharmony_ci        cpu@100000100 {
47462306a36Sopenharmony_ci            device_type = "cpu";
47562306a36Sopenharmony_ci            compatible = "arm,cortex-a53";
47662306a36Sopenharmony_ci            reg = <0x1 0x100>;
47762306a36Sopenharmony_ci            enable-method = "psci";
47862306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
47962306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
48062306a36Sopenharmony_ci        };
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_ci        cpu@100000101 {
48362306a36Sopenharmony_ci            device_type = "cpu";
48462306a36Sopenharmony_ci            compatible = "arm,cortex-a53";
48562306a36Sopenharmony_ci            reg = <0x1 0x101>;
48662306a36Sopenharmony_ci            enable-method = "psci";
48762306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
48862306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
48962306a36Sopenharmony_ci        };
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_ci        cpu@100010000 {
49262306a36Sopenharmony_ci            device_type = "cpu";
49362306a36Sopenharmony_ci            compatible = "arm,cortex-a53";
49462306a36Sopenharmony_ci            reg = <0x1 0x10000>;
49562306a36Sopenharmony_ci            enable-method = "psci";
49662306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
49762306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
49862306a36Sopenharmony_ci        };
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_ci        cpu@100010001 {
50162306a36Sopenharmony_ci            device_type = "cpu";
50262306a36Sopenharmony_ci            compatible = "arm,cortex-a53";
50362306a36Sopenharmony_ci            reg = <0x1 0x10001>;
50462306a36Sopenharmony_ci            enable-method = "psci";
50562306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
50662306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
50762306a36Sopenharmony_ci        };
50862306a36Sopenharmony_ci
50962306a36Sopenharmony_ci        cpu@100010100 {
51062306a36Sopenharmony_ci            device_type = "cpu";
51162306a36Sopenharmony_ci            compatible = "arm,cortex-a53";
51262306a36Sopenharmony_ci            reg = <0x1 0x10100>;
51362306a36Sopenharmony_ci            enable-method = "psci";
51462306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
51562306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
51662306a36Sopenharmony_ci        };
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ci        cpu@100010101 {
51962306a36Sopenharmony_ci            device_type = "cpu";
52062306a36Sopenharmony_ci            compatible = "arm,cortex-a53";
52162306a36Sopenharmony_ci            reg = <0x1 0x10101>;
52262306a36Sopenharmony_ci            enable-method = "psci";
52362306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RETENTION_1_0>, <&CPU_SLEEP_1_0>,
52462306a36Sopenharmony_ci                    <&CLUSTER_RETENTION_1>, <&CLUSTER_SLEEP_1>;
52562306a36Sopenharmony_ci        };
52662306a36Sopenharmony_ci
52762306a36Sopenharmony_ci        idle-states {
52862306a36Sopenharmony_ci            entry-method = "psci";
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_ci            CPU_RETENTION_0_0: cpu-retention-0-0 {
53162306a36Sopenharmony_ci                compatible = "arm,idle-state";
53262306a36Sopenharmony_ci                arm,psci-suspend-param = <0x0010000>;
53362306a36Sopenharmony_ci                entry-latency-us = <20>;
53462306a36Sopenharmony_ci                exit-latency-us = <40>;
53562306a36Sopenharmony_ci                min-residency-us = <80>;
53662306a36Sopenharmony_ci            };
53762306a36Sopenharmony_ci
53862306a36Sopenharmony_ci            CLUSTER_RETENTION_0: cluster-retention-0 {
53962306a36Sopenharmony_ci                compatible = "arm,idle-state";
54062306a36Sopenharmony_ci                local-timer-stop;
54162306a36Sopenharmony_ci                arm,psci-suspend-param = <0x1010000>;
54262306a36Sopenharmony_ci                entry-latency-us = <50>;
54362306a36Sopenharmony_ci                exit-latency-us = <100>;
54462306a36Sopenharmony_ci                min-residency-us = <250>;
54562306a36Sopenharmony_ci                wakeup-latency-us = <130>;
54662306a36Sopenharmony_ci            };
54762306a36Sopenharmony_ci
54862306a36Sopenharmony_ci            CPU_SLEEP_0_0: cpu-sleep-0-0 {
54962306a36Sopenharmony_ci                compatible = "arm,idle-state";
55062306a36Sopenharmony_ci                local-timer-stop;
55162306a36Sopenharmony_ci                arm,psci-suspend-param = <0x0010000>;
55262306a36Sopenharmony_ci                entry-latency-us = <250>;
55362306a36Sopenharmony_ci                exit-latency-us = <500>;
55462306a36Sopenharmony_ci                min-residency-us = <950>;
55562306a36Sopenharmony_ci            };
55662306a36Sopenharmony_ci
55762306a36Sopenharmony_ci            CLUSTER_SLEEP_0: cluster-sleep-0 {
55862306a36Sopenharmony_ci                compatible = "arm,idle-state";
55962306a36Sopenharmony_ci                local-timer-stop;
56062306a36Sopenharmony_ci                arm,psci-suspend-param = <0x1010000>;
56162306a36Sopenharmony_ci                entry-latency-us = <600>;
56262306a36Sopenharmony_ci                exit-latency-us = <1100>;
56362306a36Sopenharmony_ci                min-residency-us = <2700>;
56462306a36Sopenharmony_ci                wakeup-latency-us = <1500>;
56562306a36Sopenharmony_ci            };
56662306a36Sopenharmony_ci
56762306a36Sopenharmony_ci            CPU_RETENTION_1_0: cpu-retention-1-0 {
56862306a36Sopenharmony_ci                compatible = "arm,idle-state";
56962306a36Sopenharmony_ci                arm,psci-suspend-param = <0x0010000>;
57062306a36Sopenharmony_ci                entry-latency-us = <20>;
57162306a36Sopenharmony_ci                exit-latency-us = <40>;
57262306a36Sopenharmony_ci                min-residency-us = <90>;
57362306a36Sopenharmony_ci            };
57462306a36Sopenharmony_ci
57562306a36Sopenharmony_ci            CLUSTER_RETENTION_1: cluster-retention-1 {
57662306a36Sopenharmony_ci                compatible = "arm,idle-state";
57762306a36Sopenharmony_ci                local-timer-stop;
57862306a36Sopenharmony_ci                arm,psci-suspend-param = <0x1010000>;
57962306a36Sopenharmony_ci                entry-latency-us = <50>;
58062306a36Sopenharmony_ci                exit-latency-us = <100>;
58162306a36Sopenharmony_ci                min-residency-us = <270>;
58262306a36Sopenharmony_ci                wakeup-latency-us = <100>;
58362306a36Sopenharmony_ci            };
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci            CPU_SLEEP_1_0: cpu-sleep-1-0 {
58662306a36Sopenharmony_ci                compatible = "arm,idle-state";
58762306a36Sopenharmony_ci                local-timer-stop;
58862306a36Sopenharmony_ci                arm,psci-suspend-param = <0x0010000>;
58962306a36Sopenharmony_ci                entry-latency-us = <70>;
59062306a36Sopenharmony_ci                exit-latency-us = <100>;
59162306a36Sopenharmony_ci                min-residency-us = <300>;
59262306a36Sopenharmony_ci                wakeup-latency-us = <150>;
59362306a36Sopenharmony_ci            };
59462306a36Sopenharmony_ci
59562306a36Sopenharmony_ci            CLUSTER_SLEEP_1: cluster-sleep-1 {
59662306a36Sopenharmony_ci                compatible = "arm,idle-state";
59762306a36Sopenharmony_ci                local-timer-stop;
59862306a36Sopenharmony_ci                arm,psci-suspend-param = <0x1010000>;
59962306a36Sopenharmony_ci                entry-latency-us = <500>;
60062306a36Sopenharmony_ci                exit-latency-us = <1200>;
60162306a36Sopenharmony_ci                min-residency-us = <3500>;
60262306a36Sopenharmony_ci                wakeup-latency-us = <1300>;
60362306a36Sopenharmony_ci            };
60462306a36Sopenharmony_ci        };
60562306a36Sopenharmony_ci    };
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_ci  - |
60862306a36Sopenharmony_ci    // Example 2 (ARM 32-bit, 8-cpu system, two clusters):
60962306a36Sopenharmony_ci
61062306a36Sopenharmony_ci    cpus {
61162306a36Sopenharmony_ci        #size-cells = <0>;
61262306a36Sopenharmony_ci        #address-cells = <1>;
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ci        cpu@0 {
61562306a36Sopenharmony_ci            device_type = "cpu";
61662306a36Sopenharmony_ci            compatible = "arm,cortex-a15";
61762306a36Sopenharmony_ci            reg = <0x0>;
61862306a36Sopenharmony_ci            cpu-idle-states = <&cpu_sleep_0_0>, <&cluster_sleep_0>;
61962306a36Sopenharmony_ci        };
62062306a36Sopenharmony_ci
62162306a36Sopenharmony_ci        cpu@1 {
62262306a36Sopenharmony_ci            device_type = "cpu";
62362306a36Sopenharmony_ci            compatible = "arm,cortex-a15";
62462306a36Sopenharmony_ci            reg = <0x1>;
62562306a36Sopenharmony_ci            cpu-idle-states = <&cpu_sleep_0_0>, <&cluster_sleep_0>;
62662306a36Sopenharmony_ci        };
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_ci        cpu@2 {
62962306a36Sopenharmony_ci            device_type = "cpu";
63062306a36Sopenharmony_ci            compatible = "arm,cortex-a15";
63162306a36Sopenharmony_ci            reg = <0x2>;
63262306a36Sopenharmony_ci            cpu-idle-states = <&cpu_sleep_0_0>, <&cluster_sleep_0>;
63362306a36Sopenharmony_ci        };
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_ci        cpu@3 {
63662306a36Sopenharmony_ci            device_type = "cpu";
63762306a36Sopenharmony_ci            compatible = "arm,cortex-a15";
63862306a36Sopenharmony_ci            reg = <0x3>;
63962306a36Sopenharmony_ci            cpu-idle-states = <&cpu_sleep_0_0>, <&cluster_sleep_0>;
64062306a36Sopenharmony_ci        };
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_ci        cpu@100 {
64362306a36Sopenharmony_ci            device_type = "cpu";
64462306a36Sopenharmony_ci            compatible = "arm,cortex-a7";
64562306a36Sopenharmony_ci            reg = <0x100>;
64662306a36Sopenharmony_ci            cpu-idle-states = <&cpu_sleep_1_0>, <&cluster_sleep_1>;
64762306a36Sopenharmony_ci        };
64862306a36Sopenharmony_ci
64962306a36Sopenharmony_ci        cpu@101 {
65062306a36Sopenharmony_ci            device_type = "cpu";
65162306a36Sopenharmony_ci            compatible = "arm,cortex-a7";
65262306a36Sopenharmony_ci            reg = <0x101>;
65362306a36Sopenharmony_ci            cpu-idle-states = <&cpu_sleep_1_0>, <&cluster_sleep_1>;
65462306a36Sopenharmony_ci        };
65562306a36Sopenharmony_ci
65662306a36Sopenharmony_ci        cpu@102 {
65762306a36Sopenharmony_ci            device_type = "cpu";
65862306a36Sopenharmony_ci            compatible = "arm,cortex-a7";
65962306a36Sopenharmony_ci            reg = <0x102>;
66062306a36Sopenharmony_ci            cpu-idle-states = <&cpu_sleep_1_0>, <&cluster_sleep_1>;
66162306a36Sopenharmony_ci        };
66262306a36Sopenharmony_ci
66362306a36Sopenharmony_ci        cpu@103 {
66462306a36Sopenharmony_ci            device_type = "cpu";
66562306a36Sopenharmony_ci            compatible = "arm,cortex-a7";
66662306a36Sopenharmony_ci            reg = <0x103>;
66762306a36Sopenharmony_ci            cpu-idle-states = <&cpu_sleep_1_0>, <&cluster_sleep_1>;
66862306a36Sopenharmony_ci        };
66962306a36Sopenharmony_ci
67062306a36Sopenharmony_ci        idle-states {
67162306a36Sopenharmony_ci            cpu_sleep_0_0: cpu-sleep-0-0 {
67262306a36Sopenharmony_ci                compatible = "arm,idle-state";
67362306a36Sopenharmony_ci                local-timer-stop;
67462306a36Sopenharmony_ci                entry-latency-us = <200>;
67562306a36Sopenharmony_ci                exit-latency-us = <100>;
67662306a36Sopenharmony_ci                min-residency-us = <400>;
67762306a36Sopenharmony_ci                wakeup-latency-us = <250>;
67862306a36Sopenharmony_ci            };
67962306a36Sopenharmony_ci
68062306a36Sopenharmony_ci            cluster_sleep_0: cluster-sleep-0 {
68162306a36Sopenharmony_ci                compatible = "arm,idle-state";
68262306a36Sopenharmony_ci                local-timer-stop;
68362306a36Sopenharmony_ci                entry-latency-us = <500>;
68462306a36Sopenharmony_ci                exit-latency-us = <1500>;
68562306a36Sopenharmony_ci                min-residency-us = <2500>;
68662306a36Sopenharmony_ci                wakeup-latency-us = <1700>;
68762306a36Sopenharmony_ci            };
68862306a36Sopenharmony_ci
68962306a36Sopenharmony_ci            cpu_sleep_1_0: cpu-sleep-1-0 {
69062306a36Sopenharmony_ci                compatible = "arm,idle-state";
69162306a36Sopenharmony_ci                local-timer-stop;
69262306a36Sopenharmony_ci                entry-latency-us = <300>;
69362306a36Sopenharmony_ci                exit-latency-us = <500>;
69462306a36Sopenharmony_ci                min-residency-us = <900>;
69562306a36Sopenharmony_ci                wakeup-latency-us = <600>;
69662306a36Sopenharmony_ci            };
69762306a36Sopenharmony_ci
69862306a36Sopenharmony_ci            cluster_sleep_1: cluster-sleep-1 {
69962306a36Sopenharmony_ci                compatible = "arm,idle-state";
70062306a36Sopenharmony_ci                local-timer-stop;
70162306a36Sopenharmony_ci                entry-latency-us = <800>;
70262306a36Sopenharmony_ci                exit-latency-us = <2000>;
70362306a36Sopenharmony_ci                min-residency-us = <6500>;
70462306a36Sopenharmony_ci                wakeup-latency-us = <2300>;
70562306a36Sopenharmony_ci            };
70662306a36Sopenharmony_ci        };
70762306a36Sopenharmony_ci    };
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_ci  - |
71062306a36Sopenharmony_ci    // Example 3 (RISC-V 64-bit, 4-cpu systems, two clusters):
71162306a36Sopenharmony_ci
71262306a36Sopenharmony_ci    cpus {
71362306a36Sopenharmony_ci        #size-cells = <0>;
71462306a36Sopenharmony_ci        #address-cells = <1>;
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci        cpu@0 {
71762306a36Sopenharmony_ci            device_type = "cpu";
71862306a36Sopenharmony_ci            compatible = "riscv";
71962306a36Sopenharmony_ci            reg = <0x0>;
72062306a36Sopenharmony_ci            riscv,isa = "rv64imafdc";
72162306a36Sopenharmony_ci            mmu-type = "riscv,sv48";
72262306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RET_0_0>, <&CPU_NONRET_0_0>,
72362306a36Sopenharmony_ci                            <&CLUSTER_RET_0>, <&CLUSTER_NONRET_0>;
72462306a36Sopenharmony_ci
72562306a36Sopenharmony_ci            cpu_intc0: interrupt-controller {
72662306a36Sopenharmony_ci                #interrupt-cells = <1>;
72762306a36Sopenharmony_ci                compatible = "riscv,cpu-intc";
72862306a36Sopenharmony_ci                interrupt-controller;
72962306a36Sopenharmony_ci            };
73062306a36Sopenharmony_ci        };
73162306a36Sopenharmony_ci
73262306a36Sopenharmony_ci        cpu@1 {
73362306a36Sopenharmony_ci            device_type = "cpu";
73462306a36Sopenharmony_ci            compatible = "riscv";
73562306a36Sopenharmony_ci            reg = <0x1>;
73662306a36Sopenharmony_ci            riscv,isa = "rv64imafdc";
73762306a36Sopenharmony_ci            mmu-type = "riscv,sv48";
73862306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RET_0_0>, <&CPU_NONRET_0_0>,
73962306a36Sopenharmony_ci                            <&CLUSTER_RET_0>, <&CLUSTER_NONRET_0>;
74062306a36Sopenharmony_ci
74162306a36Sopenharmony_ci            cpu_intc1: interrupt-controller {
74262306a36Sopenharmony_ci                #interrupt-cells = <1>;
74362306a36Sopenharmony_ci                compatible = "riscv,cpu-intc";
74462306a36Sopenharmony_ci                interrupt-controller;
74562306a36Sopenharmony_ci            };
74662306a36Sopenharmony_ci        };
74762306a36Sopenharmony_ci
74862306a36Sopenharmony_ci        cpu@10 {
74962306a36Sopenharmony_ci            device_type = "cpu";
75062306a36Sopenharmony_ci            compatible = "riscv";
75162306a36Sopenharmony_ci            reg = <0x10>;
75262306a36Sopenharmony_ci            riscv,isa = "rv64imafdc";
75362306a36Sopenharmony_ci            mmu-type = "riscv,sv48";
75462306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RET_1_0>, <&CPU_NONRET_1_0>,
75562306a36Sopenharmony_ci                            <&CLUSTER_RET_1>, <&CLUSTER_NONRET_1>;
75662306a36Sopenharmony_ci
75762306a36Sopenharmony_ci            cpu_intc10: interrupt-controller {
75862306a36Sopenharmony_ci                #interrupt-cells = <1>;
75962306a36Sopenharmony_ci                compatible = "riscv,cpu-intc";
76062306a36Sopenharmony_ci                interrupt-controller;
76162306a36Sopenharmony_ci            };
76262306a36Sopenharmony_ci        };
76362306a36Sopenharmony_ci
76462306a36Sopenharmony_ci        cpu@11 {
76562306a36Sopenharmony_ci            device_type = "cpu";
76662306a36Sopenharmony_ci            compatible = "riscv";
76762306a36Sopenharmony_ci            reg = <0x11>;
76862306a36Sopenharmony_ci            riscv,isa = "rv64imafdc";
76962306a36Sopenharmony_ci            mmu-type = "riscv,sv48";
77062306a36Sopenharmony_ci            cpu-idle-states = <&CPU_RET_1_0>, <&CPU_NONRET_1_0>,
77162306a36Sopenharmony_ci                            <&CLUSTER_RET_1>, <&CLUSTER_NONRET_1>;
77262306a36Sopenharmony_ci
77362306a36Sopenharmony_ci            cpu_intc11: interrupt-controller {
77462306a36Sopenharmony_ci                #interrupt-cells = <1>;
77562306a36Sopenharmony_ci                compatible = "riscv,cpu-intc";
77662306a36Sopenharmony_ci                interrupt-controller;
77762306a36Sopenharmony_ci            };
77862306a36Sopenharmony_ci        };
77962306a36Sopenharmony_ci
78062306a36Sopenharmony_ci        idle-states {
78162306a36Sopenharmony_ci            CPU_RET_0_0: cpu-retentive-0-0 {
78262306a36Sopenharmony_ci                compatible = "riscv,idle-state";
78362306a36Sopenharmony_ci                riscv,sbi-suspend-param = <0x10000000>;
78462306a36Sopenharmony_ci                entry-latency-us = <20>;
78562306a36Sopenharmony_ci                exit-latency-us = <40>;
78662306a36Sopenharmony_ci                min-residency-us = <80>;
78762306a36Sopenharmony_ci            };
78862306a36Sopenharmony_ci
78962306a36Sopenharmony_ci            CPU_NONRET_0_0: cpu-nonretentive-0-0 {
79062306a36Sopenharmony_ci                compatible = "riscv,idle-state";
79162306a36Sopenharmony_ci                riscv,sbi-suspend-param = <0x90000000>;
79262306a36Sopenharmony_ci                entry-latency-us = <250>;
79362306a36Sopenharmony_ci                exit-latency-us = <500>;
79462306a36Sopenharmony_ci                min-residency-us = <950>;
79562306a36Sopenharmony_ci            };
79662306a36Sopenharmony_ci
79762306a36Sopenharmony_ci            CLUSTER_RET_0: cluster-retentive-0 {
79862306a36Sopenharmony_ci                compatible = "riscv,idle-state";
79962306a36Sopenharmony_ci                riscv,sbi-suspend-param = <0x11000000>;
80062306a36Sopenharmony_ci                local-timer-stop;
80162306a36Sopenharmony_ci                entry-latency-us = <50>;
80262306a36Sopenharmony_ci                exit-latency-us = <100>;
80362306a36Sopenharmony_ci                min-residency-us = <250>;
80462306a36Sopenharmony_ci                wakeup-latency-us = <130>;
80562306a36Sopenharmony_ci            };
80662306a36Sopenharmony_ci
80762306a36Sopenharmony_ci            CLUSTER_NONRET_0: cluster-nonretentive-0 {
80862306a36Sopenharmony_ci                compatible = "riscv,idle-state";
80962306a36Sopenharmony_ci                riscv,sbi-suspend-param = <0x91000000>;
81062306a36Sopenharmony_ci                local-timer-stop;
81162306a36Sopenharmony_ci                entry-latency-us = <600>;
81262306a36Sopenharmony_ci                exit-latency-us = <1100>;
81362306a36Sopenharmony_ci                min-residency-us = <2700>;
81462306a36Sopenharmony_ci                wakeup-latency-us = <1500>;
81562306a36Sopenharmony_ci            };
81662306a36Sopenharmony_ci
81762306a36Sopenharmony_ci            CPU_RET_1_0: cpu-retentive-1-0 {
81862306a36Sopenharmony_ci                compatible = "riscv,idle-state";
81962306a36Sopenharmony_ci                riscv,sbi-suspend-param = <0x10000010>;
82062306a36Sopenharmony_ci                entry-latency-us = <20>;
82162306a36Sopenharmony_ci                exit-latency-us = <40>;
82262306a36Sopenharmony_ci                min-residency-us = <80>;
82362306a36Sopenharmony_ci            };
82462306a36Sopenharmony_ci
82562306a36Sopenharmony_ci            CPU_NONRET_1_0: cpu-nonretentive-1-0 {
82662306a36Sopenharmony_ci                compatible = "riscv,idle-state";
82762306a36Sopenharmony_ci                riscv,sbi-suspend-param = <0x90000010>;
82862306a36Sopenharmony_ci                entry-latency-us = <250>;
82962306a36Sopenharmony_ci                exit-latency-us = <500>;
83062306a36Sopenharmony_ci                min-residency-us = <950>;
83162306a36Sopenharmony_ci            };
83262306a36Sopenharmony_ci
83362306a36Sopenharmony_ci            CLUSTER_RET_1: cluster-retentive-1 {
83462306a36Sopenharmony_ci                compatible = "riscv,idle-state";
83562306a36Sopenharmony_ci                riscv,sbi-suspend-param = <0x11000010>;
83662306a36Sopenharmony_ci                local-timer-stop;
83762306a36Sopenharmony_ci                entry-latency-us = <50>;
83862306a36Sopenharmony_ci                exit-latency-us = <100>;
83962306a36Sopenharmony_ci                min-residency-us = <250>;
84062306a36Sopenharmony_ci                wakeup-latency-us = <130>;
84162306a36Sopenharmony_ci            };
84262306a36Sopenharmony_ci
84362306a36Sopenharmony_ci            CLUSTER_NONRET_1: cluster-nonretentive-1 {
84462306a36Sopenharmony_ci                compatible = "riscv,idle-state";
84562306a36Sopenharmony_ci                riscv,sbi-suspend-param = <0x91000010>;
84662306a36Sopenharmony_ci                local-timer-stop;
84762306a36Sopenharmony_ci                entry-latency-us = <600>;
84862306a36Sopenharmony_ci                exit-latency-us = <1100>;
84962306a36Sopenharmony_ci                min-residency-us = <2700>;
85062306a36Sopenharmony_ci                wakeup-latency-us = <1500>;
85162306a36Sopenharmony_ci            };
85262306a36Sopenharmony_ci        };
85362306a36Sopenharmony_ci    };
85462306a36Sopenharmony_ci
85562306a36Sopenharmony_ci...
856