1c66ec88fSEmmanuel Vadot# SPDX-License-Identifier: GPL-2.0 2c66ec88fSEmmanuel Vadot%YAML 1.2 3c66ec88fSEmmanuel Vadot--- 4c66ec88fSEmmanuel Vadot$id: http://devicetree.org/schemas/arm/psci.yaml# 5c66ec88fSEmmanuel Vadot$schema: http://devicetree.org/meta-schemas/core.yaml# 6c66ec88fSEmmanuel Vadot 7c66ec88fSEmmanuel Vadottitle: Power State Coordination Interface (PSCI) 8c66ec88fSEmmanuel Vadot 9c66ec88fSEmmanuel Vadotmaintainers: 10c66ec88fSEmmanuel Vadot - Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> 11c66ec88fSEmmanuel Vadot 12c66ec88fSEmmanuel Vadotdescription: |+ 13c66ec88fSEmmanuel Vadot Firmware implementing the PSCI functions described in ARM document number 14c66ec88fSEmmanuel Vadot ARM DEN 0022A ("Power State Coordination Interface System Software on ARM 15c66ec88fSEmmanuel Vadot processors") can be used by Linux to initiate various CPU-centric power 16c66ec88fSEmmanuel Vadot operations. 17c66ec88fSEmmanuel Vadot 18c66ec88fSEmmanuel Vadot Issue A of the specification describes functions for CPU suspend, hotplug 19c66ec88fSEmmanuel Vadot and migration of secure software. 20c66ec88fSEmmanuel Vadot 21c66ec88fSEmmanuel Vadot Functions are invoked by trapping to the privilege level of the PSCI 22c66ec88fSEmmanuel Vadot firmware (specified as part of the binding below) and passing arguments 23c66ec88fSEmmanuel Vadot in a manner similar to that specified by AAPCS: 24c66ec88fSEmmanuel Vadot 25c66ec88fSEmmanuel Vadot r0 => 32-bit Function ID / return value 26c66ec88fSEmmanuel Vadot {r1 - r3} => Parameters 27c66ec88fSEmmanuel Vadot 28c66ec88fSEmmanuel Vadot Note that the immediate field of the trapping instruction must be set 29c66ec88fSEmmanuel Vadot to #0. 30c66ec88fSEmmanuel Vadot 31c66ec88fSEmmanuel Vadot [2] Power State Coordination Interface (PSCI) specification 32c66ec88fSEmmanuel Vadot http://infocenter.arm.com/help/topic/com.arm.doc.den0022c/DEN0022C_Power_State_Coordination_Interface.pdf 33c66ec88fSEmmanuel Vadot 34c66ec88fSEmmanuel Vadotproperties: 35c66ec88fSEmmanuel Vadot $nodename: 36c66ec88fSEmmanuel Vadot const: psci 37c66ec88fSEmmanuel Vadot 38c66ec88fSEmmanuel Vadot compatible: 39c66ec88fSEmmanuel Vadot oneOf: 40c66ec88fSEmmanuel Vadot - description: 41c66ec88fSEmmanuel Vadot For implementations complying to PSCI versions prior to 0.2. 42c66ec88fSEmmanuel Vadot const: arm,psci 43c66ec88fSEmmanuel Vadot 44c66ec88fSEmmanuel Vadot - description: 45c66ec88fSEmmanuel Vadot For implementations complying to PSCI 0.2. 46c66ec88fSEmmanuel Vadot Function IDs are not required and should be ignored by an OS with 47c66ec88fSEmmanuel Vadot PSCI 0.2 support, but are permitted to be present for compatibility 48c66ec88fSEmmanuel Vadot with existing software when "arm,psci" is later in the compatible 49c66ec88fSEmmanuel Vadot list. 507ef62cebSEmmanuel Vadot minItems: 1 51c66ec88fSEmmanuel Vadot items: 52c66ec88fSEmmanuel Vadot - const: arm,psci-0.2 53c66ec88fSEmmanuel Vadot - const: arm,psci 54c66ec88fSEmmanuel Vadot 55c66ec88fSEmmanuel Vadot - description: 56c66ec88fSEmmanuel Vadot For implementations complying to PSCI 1.0. 57c66ec88fSEmmanuel Vadot PSCI 1.0 is backward compatible with PSCI 0.2 with minor 58c66ec88fSEmmanuel Vadot specification updates, as defined in the PSCI specification[2]. 597ef62cebSEmmanuel Vadot minItems: 1 60c66ec88fSEmmanuel Vadot items: 61c66ec88fSEmmanuel Vadot - const: arm,psci-1.0 62c66ec88fSEmmanuel Vadot - const: arm,psci-0.2 637ef62cebSEmmanuel Vadot - const: arm,psci 64c66ec88fSEmmanuel Vadot 65c66ec88fSEmmanuel Vadot method: 66c66ec88fSEmmanuel Vadot description: The method of calling the PSCI firmware. 67c66ec88fSEmmanuel Vadot $ref: /schemas/types.yaml#/definitions/string-array 68c66ec88fSEmmanuel Vadot enum: 69c66ec88fSEmmanuel Vadot - smc 70c66ec88fSEmmanuel Vadot # HVC #0, with the register assignments specified in this binding. 71c66ec88fSEmmanuel Vadot - hvc 72c66ec88fSEmmanuel Vadot 73c66ec88fSEmmanuel Vadot cpu_suspend: 74c66ec88fSEmmanuel Vadot $ref: /schemas/types.yaml#/definitions/uint32 75c66ec88fSEmmanuel Vadot description: Function ID for CPU_SUSPEND operation 76c66ec88fSEmmanuel Vadot 77c66ec88fSEmmanuel Vadot cpu_off: 78c66ec88fSEmmanuel Vadot $ref: /schemas/types.yaml#/definitions/uint32 79c66ec88fSEmmanuel Vadot description: Function ID for CPU_OFF operation 80c66ec88fSEmmanuel Vadot 81c66ec88fSEmmanuel Vadot cpu_on: 82c66ec88fSEmmanuel Vadot $ref: /schemas/types.yaml#/definitions/uint32 83c66ec88fSEmmanuel Vadot description: Function ID for CPU_ON operation 84c66ec88fSEmmanuel Vadot 85c66ec88fSEmmanuel Vadot migrate: 86c66ec88fSEmmanuel Vadot $ref: /schemas/types.yaml#/definitions/uint32 87c66ec88fSEmmanuel Vadot description: Function ID for MIGRATE operation 88c66ec88fSEmmanuel Vadot 89c66ec88fSEmmanuel Vadot arm,psci-suspend-param: 90c66ec88fSEmmanuel Vadot $ref: /schemas/types.yaml#/definitions/uint32 91c66ec88fSEmmanuel Vadot description: | 92c66ec88fSEmmanuel Vadot power_state parameter to pass to the PSCI suspend call. 93c66ec88fSEmmanuel Vadot 94c66ec88fSEmmanuel Vadot Device tree nodes that require usage of PSCI CPU_SUSPEND function (ie 95c66ec88fSEmmanuel Vadot idle state nodes with entry-method property is set to "psci", as per 96c66ec88fSEmmanuel Vadot bindings in [1]) must specify this property. 97c66ec88fSEmmanuel Vadot 98c66ec88fSEmmanuel Vadot [1] Kernel documentation - ARM idle states bindings 99c9ccf3a3SEmmanuel Vadot Documentation/devicetree/bindings/cpu/idle-states.yaml 100c66ec88fSEmmanuel Vadot 101c66ec88fSEmmanuel VadotpatternProperties: 102c66ec88fSEmmanuel Vadot "^power-domain-": 103f126890aSEmmanuel Vadot $ref: /schemas/power/power-domain.yaml# 104*84943d6fSEmmanuel Vadot unevaluatedProperties: false 105c66ec88fSEmmanuel Vadot 106c66ec88fSEmmanuel Vadot type: object 107c66ec88fSEmmanuel Vadot description: | 108c66ec88fSEmmanuel Vadot ARM systems can have multiple cores, sometimes in an hierarchical 109c66ec88fSEmmanuel Vadot arrangement. This often, but not always, maps directly to the processor 110c66ec88fSEmmanuel Vadot power topology of the system. Individual nodes in a topology have their 111c66ec88fSEmmanuel Vadot own specific power states and can be better represented hierarchically. 112c66ec88fSEmmanuel Vadot 113c66ec88fSEmmanuel Vadot For these cases, the definitions of the idle states for the CPUs and the 114c66ec88fSEmmanuel Vadot CPU topology, must conform to the binding in [3]. The idle states 115c66ec88fSEmmanuel Vadot themselves must conform to the binding in [4] and must specify the 116c66ec88fSEmmanuel Vadot arm,psci-suspend-param property. 117c66ec88fSEmmanuel Vadot 118c66ec88fSEmmanuel Vadot It should also be noted that, in PSCI firmware v1.0 the OS-Initiated 119c66ec88fSEmmanuel Vadot (OSI) CPU suspend mode is introduced. Using a hierarchical representation 120c66ec88fSEmmanuel Vadot helps to implement support for OSI mode and OS implementations may choose 121c66ec88fSEmmanuel Vadot to mandate it. 122c66ec88fSEmmanuel Vadot 123c66ec88fSEmmanuel Vadot [3] Documentation/devicetree/bindings/power/power-domain.yaml 124c66ec88fSEmmanuel Vadot [4] Documentation/devicetree/bindings/power/domain-idle-state.yaml 125c66ec88fSEmmanuel Vadot 126c66ec88fSEmmanuel Vadotrequired: 127c66ec88fSEmmanuel Vadot - compatible 128c66ec88fSEmmanuel Vadot - method 129c66ec88fSEmmanuel Vadot 130c66ec88fSEmmanuel VadotallOf: 131c66ec88fSEmmanuel Vadot - if: 132c66ec88fSEmmanuel Vadot properties: 133c66ec88fSEmmanuel Vadot compatible: 134c66ec88fSEmmanuel Vadot contains: 135c66ec88fSEmmanuel Vadot const: arm,psci 136c66ec88fSEmmanuel Vadot then: 137c66ec88fSEmmanuel Vadot required: 138c66ec88fSEmmanuel Vadot - cpu_off 139c66ec88fSEmmanuel Vadot - cpu_on 140c66ec88fSEmmanuel Vadot 141c66ec88fSEmmanuel VadotadditionalProperties: false 142c66ec88fSEmmanuel Vadot 143c66ec88fSEmmanuel Vadotexamples: 144c66ec88fSEmmanuel Vadot - |+ 145c66ec88fSEmmanuel Vadot 146c66ec88fSEmmanuel Vadot // Case 1: PSCI v0.1 only. 147c66ec88fSEmmanuel Vadot 148c66ec88fSEmmanuel Vadot psci { 149c66ec88fSEmmanuel Vadot compatible = "arm,psci"; 150c66ec88fSEmmanuel Vadot method = "smc"; 151c66ec88fSEmmanuel Vadot cpu_suspend = <0x95c10000>; 152c66ec88fSEmmanuel Vadot cpu_off = <0x95c10001>; 153c66ec88fSEmmanuel Vadot cpu_on = <0x95c10002>; 154c66ec88fSEmmanuel Vadot migrate = <0x95c10003>; 155c66ec88fSEmmanuel Vadot }; 156c66ec88fSEmmanuel Vadot 157c66ec88fSEmmanuel Vadot - |+ 158c66ec88fSEmmanuel Vadot 159c66ec88fSEmmanuel Vadot // Case 2: PSCI v0.2 only 160c66ec88fSEmmanuel Vadot 161c66ec88fSEmmanuel Vadot psci { 162c66ec88fSEmmanuel Vadot compatible = "arm,psci-0.2"; 163c66ec88fSEmmanuel Vadot method = "smc"; 164c66ec88fSEmmanuel Vadot }; 165c66ec88fSEmmanuel Vadot 166c66ec88fSEmmanuel Vadot 167c66ec88fSEmmanuel Vadot - |+ 168c66ec88fSEmmanuel Vadot 169c66ec88fSEmmanuel Vadot // Case 3: PSCI v0.2 and PSCI v0.1. 170c66ec88fSEmmanuel Vadot 171c66ec88fSEmmanuel Vadot /* 172c66ec88fSEmmanuel Vadot * A DTB may provide IDs for use by kernels without PSCI 0.2 support, 173c66ec88fSEmmanuel Vadot * enabling firmware and hypervisors to support existing and new kernels. 174c66ec88fSEmmanuel Vadot * These IDs will be ignored by kernels with PSCI 0.2 support, which will 175c66ec88fSEmmanuel Vadot * use the standard PSCI 0.2 IDs exclusively. 176c66ec88fSEmmanuel Vadot */ 177c66ec88fSEmmanuel Vadot 178c66ec88fSEmmanuel Vadot psci { 179c66ec88fSEmmanuel Vadot compatible = "arm,psci-0.2", "arm,psci"; 180c66ec88fSEmmanuel Vadot method = "hvc"; 181c66ec88fSEmmanuel Vadot 182c66ec88fSEmmanuel Vadot cpu_on = <0x95c10002>; 183c66ec88fSEmmanuel Vadot cpu_off = <0x95c10001>; 184c66ec88fSEmmanuel Vadot }; 185c66ec88fSEmmanuel Vadot 186c66ec88fSEmmanuel Vadot - |+ 187c66ec88fSEmmanuel Vadot 188c66ec88fSEmmanuel Vadot // Case 4: CPUs and CPU idle states described using the hierarchical model. 189c66ec88fSEmmanuel Vadot 190c66ec88fSEmmanuel Vadot cpus { 191c66ec88fSEmmanuel Vadot #size-cells = <0>; 192c66ec88fSEmmanuel Vadot #address-cells = <1>; 193c66ec88fSEmmanuel Vadot 194c66ec88fSEmmanuel Vadot CPU0: cpu@0 { 195c66ec88fSEmmanuel Vadot device_type = "cpu"; 196c66ec88fSEmmanuel Vadot compatible = "arm,cortex-a53"; 197c66ec88fSEmmanuel Vadot reg = <0x0>; 198c66ec88fSEmmanuel Vadot enable-method = "psci"; 199c66ec88fSEmmanuel Vadot power-domains = <&CPU_PD0>; 200c66ec88fSEmmanuel Vadot power-domain-names = "psci"; 201c66ec88fSEmmanuel Vadot }; 202c66ec88fSEmmanuel Vadot 203c66ec88fSEmmanuel Vadot CPU1: cpu@1 { 204c66ec88fSEmmanuel Vadot device_type = "cpu"; 205c66ec88fSEmmanuel Vadot compatible = "arm,cortex-a53"; 206c66ec88fSEmmanuel Vadot reg = <0x100>; 207c66ec88fSEmmanuel Vadot enable-method = "psci"; 208c66ec88fSEmmanuel Vadot power-domains = <&CPU_PD1>; 209c66ec88fSEmmanuel Vadot power-domain-names = "psci"; 210c66ec88fSEmmanuel Vadot }; 211c66ec88fSEmmanuel Vadot 212c66ec88fSEmmanuel Vadot idle-states { 213c66ec88fSEmmanuel Vadot 214c66ec88fSEmmanuel Vadot CPU_PWRDN: cpu-power-down { 215c66ec88fSEmmanuel Vadot compatible = "arm,idle-state"; 216c66ec88fSEmmanuel Vadot arm,psci-suspend-param = <0x0000001>; 217c66ec88fSEmmanuel Vadot entry-latency-us = <10>; 218c66ec88fSEmmanuel Vadot exit-latency-us = <10>; 219c66ec88fSEmmanuel Vadot min-residency-us = <100>; 220c66ec88fSEmmanuel Vadot }; 221c66ec88fSEmmanuel Vadot }; 222c66ec88fSEmmanuel Vadot 223c66ec88fSEmmanuel Vadot domain-idle-states { 224c66ec88fSEmmanuel Vadot 225c66ec88fSEmmanuel Vadot CLUSTER_RET: cluster-retention { 226c66ec88fSEmmanuel Vadot compatible = "domain-idle-state"; 227c66ec88fSEmmanuel Vadot arm,psci-suspend-param = <0x1000011>; 228c66ec88fSEmmanuel Vadot entry-latency-us = <500>; 229c66ec88fSEmmanuel Vadot exit-latency-us = <500>; 230c66ec88fSEmmanuel Vadot min-residency-us = <2000>; 231c66ec88fSEmmanuel Vadot }; 232c66ec88fSEmmanuel Vadot 233c66ec88fSEmmanuel Vadot CLUSTER_PWRDN: cluster-power-down { 234c66ec88fSEmmanuel Vadot compatible = "domain-idle-state"; 235c66ec88fSEmmanuel Vadot arm,psci-suspend-param = <0x1000031>; 236c66ec88fSEmmanuel Vadot entry-latency-us = <2000>; 237c66ec88fSEmmanuel Vadot exit-latency-us = <2000>; 238c66ec88fSEmmanuel Vadot min-residency-us = <6000>; 239c66ec88fSEmmanuel Vadot }; 240c66ec88fSEmmanuel Vadot }; 241c66ec88fSEmmanuel Vadot }; 242c66ec88fSEmmanuel Vadot 243c66ec88fSEmmanuel Vadot psci { 244c66ec88fSEmmanuel Vadot compatible = "arm,psci-1.0"; 245c66ec88fSEmmanuel Vadot method = "smc"; 246c66ec88fSEmmanuel Vadot 247c66ec88fSEmmanuel Vadot CPU_PD0: power-domain-cpu0 { 248c66ec88fSEmmanuel Vadot #power-domain-cells = <0>; 249c66ec88fSEmmanuel Vadot domain-idle-states = <&CPU_PWRDN>; 250c66ec88fSEmmanuel Vadot power-domains = <&CLUSTER_PD>; 251c66ec88fSEmmanuel Vadot }; 252c66ec88fSEmmanuel Vadot 253c66ec88fSEmmanuel Vadot CPU_PD1: power-domain-cpu1 { 254c66ec88fSEmmanuel Vadot #power-domain-cells = <0>; 255c66ec88fSEmmanuel Vadot domain-idle-states = <&CPU_PWRDN>; 256c66ec88fSEmmanuel Vadot power-domains = <&CLUSTER_PD>; 257c66ec88fSEmmanuel Vadot }; 258c66ec88fSEmmanuel Vadot 259c66ec88fSEmmanuel Vadot CLUSTER_PD: power-domain-cluster { 260c66ec88fSEmmanuel Vadot #power-domain-cells = <0>; 261c66ec88fSEmmanuel Vadot domain-idle-states = <&CLUSTER_RET>, <&CLUSTER_PWRDN>; 262c66ec88fSEmmanuel Vadot }; 263c66ec88fSEmmanuel Vadot }; 264c66ec88fSEmmanuel Vadot... 265