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