cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

idle-states.yaml (30904B)


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