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-": 103*f126890aSEmmanuel Vadot $ref: /schemas/power/power-domain.yaml# 104c66ec88fSEmmanuel Vadot 105c66ec88fSEmmanuel Vadot type: object 106c66ec88fSEmmanuel Vadot description: | 107c66ec88fSEmmanuel Vadot ARM systems can have multiple cores, sometimes in an hierarchical 108c66ec88fSEmmanuel Vadot arrangement. This often, but not always, maps directly to the processor 109c66ec88fSEmmanuel Vadot power topology of the system. Individual nodes in a topology have their 110c66ec88fSEmmanuel Vadot own specific power states and can be better represented hierarchically. 111c66ec88fSEmmanuel Vadot 112c66ec88fSEmmanuel Vadot For these cases, the definitions of the idle states for the CPUs and the 113c66ec88fSEmmanuel Vadot CPU topology, must conform to the binding in [3]. The idle states 114c66ec88fSEmmanuel Vadot themselves must conform to the binding in [4] and must specify the 115c66ec88fSEmmanuel Vadot arm,psci-suspend-param property. 116c66ec88fSEmmanuel Vadot 117c66ec88fSEmmanuel Vadot It should also be noted that, in PSCI firmware v1.0 the OS-Initiated 118c66ec88fSEmmanuel Vadot (OSI) CPU suspend mode is introduced. Using a hierarchical representation 119c66ec88fSEmmanuel Vadot helps to implement support for OSI mode and OS implementations may choose 120c66ec88fSEmmanuel Vadot to mandate it. 121c66ec88fSEmmanuel Vadot 122c66ec88fSEmmanuel Vadot [3] Documentation/devicetree/bindings/power/power-domain.yaml 123c66ec88fSEmmanuel Vadot [4] Documentation/devicetree/bindings/power/domain-idle-state.yaml 124c66ec88fSEmmanuel Vadot 125c66ec88fSEmmanuel Vadotrequired: 126c66ec88fSEmmanuel Vadot - compatible 127c66ec88fSEmmanuel Vadot - method 128c66ec88fSEmmanuel Vadot 129c66ec88fSEmmanuel VadotallOf: 130c66ec88fSEmmanuel Vadot - if: 131c66ec88fSEmmanuel Vadot properties: 132c66ec88fSEmmanuel Vadot compatible: 133c66ec88fSEmmanuel Vadot contains: 134c66ec88fSEmmanuel Vadot const: arm,psci 135c66ec88fSEmmanuel Vadot then: 136c66ec88fSEmmanuel Vadot required: 137c66ec88fSEmmanuel Vadot - cpu_off 138c66ec88fSEmmanuel Vadot - cpu_on 139c66ec88fSEmmanuel Vadot 140c66ec88fSEmmanuel VadotadditionalProperties: false 141c66ec88fSEmmanuel Vadot 142c66ec88fSEmmanuel Vadotexamples: 143c66ec88fSEmmanuel Vadot - |+ 144c66ec88fSEmmanuel Vadot 145c66ec88fSEmmanuel Vadot // Case 1: PSCI v0.1 only. 146c66ec88fSEmmanuel Vadot 147c66ec88fSEmmanuel Vadot psci { 148c66ec88fSEmmanuel Vadot compatible = "arm,psci"; 149c66ec88fSEmmanuel Vadot method = "smc"; 150c66ec88fSEmmanuel Vadot cpu_suspend = <0x95c10000>; 151c66ec88fSEmmanuel Vadot cpu_off = <0x95c10001>; 152c66ec88fSEmmanuel Vadot cpu_on = <0x95c10002>; 153c66ec88fSEmmanuel Vadot migrate = <0x95c10003>; 154c66ec88fSEmmanuel Vadot }; 155c66ec88fSEmmanuel Vadot 156c66ec88fSEmmanuel Vadot - |+ 157c66ec88fSEmmanuel Vadot 158c66ec88fSEmmanuel Vadot // Case 2: PSCI v0.2 only 159c66ec88fSEmmanuel Vadot 160c66ec88fSEmmanuel Vadot psci { 161c66ec88fSEmmanuel Vadot compatible = "arm,psci-0.2"; 162c66ec88fSEmmanuel Vadot method = "smc"; 163c66ec88fSEmmanuel Vadot }; 164c66ec88fSEmmanuel Vadot 165c66ec88fSEmmanuel Vadot 166c66ec88fSEmmanuel Vadot - |+ 167c66ec88fSEmmanuel Vadot 168c66ec88fSEmmanuel Vadot // Case 3: PSCI v0.2 and PSCI v0.1. 169c66ec88fSEmmanuel Vadot 170c66ec88fSEmmanuel Vadot /* 171c66ec88fSEmmanuel Vadot * A DTB may provide IDs for use by kernels without PSCI 0.2 support, 172c66ec88fSEmmanuel Vadot * enabling firmware and hypervisors to support existing and new kernels. 173c66ec88fSEmmanuel Vadot * These IDs will be ignored by kernels with PSCI 0.2 support, which will 174c66ec88fSEmmanuel Vadot * use the standard PSCI 0.2 IDs exclusively. 175c66ec88fSEmmanuel Vadot */ 176c66ec88fSEmmanuel Vadot 177c66ec88fSEmmanuel Vadot psci { 178c66ec88fSEmmanuel Vadot compatible = "arm,psci-0.2", "arm,psci"; 179c66ec88fSEmmanuel Vadot method = "hvc"; 180c66ec88fSEmmanuel Vadot 181c66ec88fSEmmanuel Vadot cpu_on = <0x95c10002>; 182c66ec88fSEmmanuel Vadot cpu_off = <0x95c10001>; 183c66ec88fSEmmanuel Vadot }; 184c66ec88fSEmmanuel Vadot 185c66ec88fSEmmanuel Vadot - |+ 186c66ec88fSEmmanuel Vadot 187c66ec88fSEmmanuel Vadot // Case 4: CPUs and CPU idle states described using the hierarchical model. 188c66ec88fSEmmanuel Vadot 189c66ec88fSEmmanuel Vadot cpus { 190c66ec88fSEmmanuel Vadot #size-cells = <0>; 191c66ec88fSEmmanuel Vadot #address-cells = <1>; 192c66ec88fSEmmanuel Vadot 193c66ec88fSEmmanuel Vadot CPU0: cpu@0 { 194c66ec88fSEmmanuel Vadot device_type = "cpu"; 195c66ec88fSEmmanuel Vadot compatible = "arm,cortex-a53"; 196c66ec88fSEmmanuel Vadot reg = <0x0>; 197c66ec88fSEmmanuel Vadot enable-method = "psci"; 198c66ec88fSEmmanuel Vadot power-domains = <&CPU_PD0>; 199c66ec88fSEmmanuel Vadot power-domain-names = "psci"; 200c66ec88fSEmmanuel Vadot }; 201c66ec88fSEmmanuel Vadot 202c66ec88fSEmmanuel Vadot CPU1: cpu@1 { 203c66ec88fSEmmanuel Vadot device_type = "cpu"; 204c66ec88fSEmmanuel Vadot compatible = "arm,cortex-a53"; 205c66ec88fSEmmanuel Vadot reg = <0x100>; 206c66ec88fSEmmanuel Vadot enable-method = "psci"; 207c66ec88fSEmmanuel Vadot power-domains = <&CPU_PD1>; 208c66ec88fSEmmanuel Vadot power-domain-names = "psci"; 209c66ec88fSEmmanuel Vadot }; 210c66ec88fSEmmanuel Vadot 211c66ec88fSEmmanuel Vadot idle-states { 212c66ec88fSEmmanuel Vadot 213c66ec88fSEmmanuel Vadot CPU_PWRDN: cpu-power-down { 214c66ec88fSEmmanuel Vadot compatible = "arm,idle-state"; 215c66ec88fSEmmanuel Vadot arm,psci-suspend-param = <0x0000001>; 216c66ec88fSEmmanuel Vadot entry-latency-us = <10>; 217c66ec88fSEmmanuel Vadot exit-latency-us = <10>; 218c66ec88fSEmmanuel Vadot min-residency-us = <100>; 219c66ec88fSEmmanuel Vadot }; 220c66ec88fSEmmanuel Vadot }; 221c66ec88fSEmmanuel Vadot 222c66ec88fSEmmanuel Vadot domain-idle-states { 223c66ec88fSEmmanuel Vadot 224c66ec88fSEmmanuel Vadot CLUSTER_RET: cluster-retention { 225c66ec88fSEmmanuel Vadot compatible = "domain-idle-state"; 226c66ec88fSEmmanuel Vadot arm,psci-suspend-param = <0x1000011>; 227c66ec88fSEmmanuel Vadot entry-latency-us = <500>; 228c66ec88fSEmmanuel Vadot exit-latency-us = <500>; 229c66ec88fSEmmanuel Vadot min-residency-us = <2000>; 230c66ec88fSEmmanuel Vadot }; 231c66ec88fSEmmanuel Vadot 232c66ec88fSEmmanuel Vadot CLUSTER_PWRDN: cluster-power-down { 233c66ec88fSEmmanuel Vadot compatible = "domain-idle-state"; 234c66ec88fSEmmanuel Vadot arm,psci-suspend-param = <0x1000031>; 235c66ec88fSEmmanuel Vadot entry-latency-us = <2000>; 236c66ec88fSEmmanuel Vadot exit-latency-us = <2000>; 237c66ec88fSEmmanuel Vadot min-residency-us = <6000>; 238c66ec88fSEmmanuel Vadot }; 239c66ec88fSEmmanuel Vadot }; 240c66ec88fSEmmanuel Vadot }; 241c66ec88fSEmmanuel Vadot 242c66ec88fSEmmanuel Vadot psci { 243c66ec88fSEmmanuel Vadot compatible = "arm,psci-1.0"; 244c66ec88fSEmmanuel Vadot method = "smc"; 245c66ec88fSEmmanuel Vadot 246c66ec88fSEmmanuel Vadot CPU_PD0: power-domain-cpu0 { 247c66ec88fSEmmanuel Vadot #power-domain-cells = <0>; 248c66ec88fSEmmanuel Vadot domain-idle-states = <&CPU_PWRDN>; 249c66ec88fSEmmanuel Vadot power-domains = <&CLUSTER_PD>; 250c66ec88fSEmmanuel Vadot }; 251c66ec88fSEmmanuel Vadot 252c66ec88fSEmmanuel Vadot CPU_PD1: power-domain-cpu1 { 253c66ec88fSEmmanuel Vadot #power-domain-cells = <0>; 254c66ec88fSEmmanuel Vadot domain-idle-states = <&CPU_PWRDN>; 255c66ec88fSEmmanuel Vadot power-domains = <&CLUSTER_PD>; 256c66ec88fSEmmanuel Vadot }; 257c66ec88fSEmmanuel Vadot 258c66ec88fSEmmanuel Vadot CLUSTER_PD: power-domain-cluster { 259c66ec88fSEmmanuel Vadot #power-domain-cells = <0>; 260c66ec88fSEmmanuel Vadot domain-idle-states = <&CLUSTER_RET>, <&CLUSTER_PWRDN>; 261c66ec88fSEmmanuel Vadot }; 262c66ec88fSEmmanuel Vadot }; 263c66ec88fSEmmanuel Vadot... 264