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