18c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci%YAML 1.2 38c2ecf20Sopenharmony_ci--- 48c2ecf20Sopenharmony_ci$id: http://devicetree.org/schemas/arm/psci.yaml# 58c2ecf20Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml# 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_cititle: Power State Coordination Interface (PSCI) 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_cimaintainers: 108c2ecf20Sopenharmony_ci - Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_cidescription: |+ 138c2ecf20Sopenharmony_ci Firmware implementing the PSCI functions described in ARM document number 148c2ecf20Sopenharmony_ci ARM DEN 0022A ("Power State Coordination Interface System Software on ARM 158c2ecf20Sopenharmony_ci processors") can be used by Linux to initiate various CPU-centric power 168c2ecf20Sopenharmony_ci operations. 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci Issue A of the specification describes functions for CPU suspend, hotplug 198c2ecf20Sopenharmony_ci and migration of secure software. 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci Functions are invoked by trapping to the privilege level of the PSCI 228c2ecf20Sopenharmony_ci firmware (specified as part of the binding below) and passing arguments 238c2ecf20Sopenharmony_ci in a manner similar to that specified by AAPCS: 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci r0 => 32-bit Function ID / return value 268c2ecf20Sopenharmony_ci {r1 - r3} => Parameters 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci Note that the immediate field of the trapping instruction must be set 298c2ecf20Sopenharmony_ci to #0. 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci [2] Power State Coordination Interface (PSCI) specification 328c2ecf20Sopenharmony_ci http://infocenter.arm.com/help/topic/com.arm.doc.den0022c/DEN0022C_Power_State_Coordination_Interface.pdf 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ciproperties: 358c2ecf20Sopenharmony_ci $nodename: 368c2ecf20Sopenharmony_ci const: psci 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci compatible: 398c2ecf20Sopenharmony_ci oneOf: 408c2ecf20Sopenharmony_ci - description: 418c2ecf20Sopenharmony_ci For implementations complying to PSCI versions prior to 0.2. 428c2ecf20Sopenharmony_ci const: arm,psci 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci - description: 458c2ecf20Sopenharmony_ci For implementations complying to PSCI 0.2. 468c2ecf20Sopenharmony_ci const: arm,psci-0.2 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci - description: 498c2ecf20Sopenharmony_ci For implementations complying to PSCI 0.2. 508c2ecf20Sopenharmony_ci Function IDs are not required and should be ignored by an OS with 518c2ecf20Sopenharmony_ci PSCI 0.2 support, but are permitted to be present for compatibility 528c2ecf20Sopenharmony_ci with existing software when "arm,psci" is later in the compatible 538c2ecf20Sopenharmony_ci list. 548c2ecf20Sopenharmony_ci items: 558c2ecf20Sopenharmony_ci - const: arm,psci-0.2 568c2ecf20Sopenharmony_ci - const: arm,psci 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci - description: 598c2ecf20Sopenharmony_ci For implementations complying to PSCI 1.0. 608c2ecf20Sopenharmony_ci const: arm,psci-1.0 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci - description: 638c2ecf20Sopenharmony_ci For implementations complying to PSCI 1.0. 648c2ecf20Sopenharmony_ci PSCI 1.0 is backward compatible with PSCI 0.2 with minor 658c2ecf20Sopenharmony_ci specification updates, as defined in the PSCI specification[2]. 668c2ecf20Sopenharmony_ci items: 678c2ecf20Sopenharmony_ci - const: arm,psci-1.0 688c2ecf20Sopenharmony_ci - const: arm,psci-0.2 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci method: 718c2ecf20Sopenharmony_ci description: The method of calling the PSCI firmware. 728c2ecf20Sopenharmony_ci $ref: /schemas/types.yaml#/definitions/string-array 738c2ecf20Sopenharmony_ci enum: 748c2ecf20Sopenharmony_ci - smc 758c2ecf20Sopenharmony_ci # HVC #0, with the register assignments specified in this binding. 768c2ecf20Sopenharmony_ci - hvc 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci cpu_suspend: 798c2ecf20Sopenharmony_ci $ref: /schemas/types.yaml#/definitions/uint32 808c2ecf20Sopenharmony_ci description: Function ID for CPU_SUSPEND operation 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci cpu_off: 838c2ecf20Sopenharmony_ci $ref: /schemas/types.yaml#/definitions/uint32 848c2ecf20Sopenharmony_ci description: Function ID for CPU_OFF operation 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci cpu_on: 878c2ecf20Sopenharmony_ci $ref: /schemas/types.yaml#/definitions/uint32 888c2ecf20Sopenharmony_ci description: Function ID for CPU_ON operation 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci migrate: 918c2ecf20Sopenharmony_ci $ref: /schemas/types.yaml#/definitions/uint32 928c2ecf20Sopenharmony_ci description: Function ID for MIGRATE operation 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci arm,psci-suspend-param: 958c2ecf20Sopenharmony_ci $ref: /schemas/types.yaml#/definitions/uint32 968c2ecf20Sopenharmony_ci description: | 978c2ecf20Sopenharmony_ci power_state parameter to pass to the PSCI suspend call. 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci Device tree nodes that require usage of PSCI CPU_SUSPEND function (ie 1008c2ecf20Sopenharmony_ci idle state nodes with entry-method property is set to "psci", as per 1018c2ecf20Sopenharmony_ci bindings in [1]) must specify this property. 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci [1] Kernel documentation - ARM idle states bindings 1048c2ecf20Sopenharmony_ci Documentation/devicetree/bindings/arm/idle-states.yaml 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_cipatternProperties: 1078c2ecf20Sopenharmony_ci "^power-domain-": 1088c2ecf20Sopenharmony_ci $ref: "../power/power-domain.yaml#" 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci type: object 1118c2ecf20Sopenharmony_ci description: | 1128c2ecf20Sopenharmony_ci ARM systems can have multiple cores, sometimes in an hierarchical 1138c2ecf20Sopenharmony_ci arrangement. This often, but not always, maps directly to the processor 1148c2ecf20Sopenharmony_ci power topology of the system. Individual nodes in a topology have their 1158c2ecf20Sopenharmony_ci own specific power states and can be better represented hierarchically. 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci For these cases, the definitions of the idle states for the CPUs and the 1188c2ecf20Sopenharmony_ci CPU topology, must conform to the binding in [3]. The idle states 1198c2ecf20Sopenharmony_ci themselves must conform to the binding in [4] and must specify the 1208c2ecf20Sopenharmony_ci arm,psci-suspend-param property. 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci It should also be noted that, in PSCI firmware v1.0 the OS-Initiated 1238c2ecf20Sopenharmony_ci (OSI) CPU suspend mode is introduced. Using a hierarchical representation 1248c2ecf20Sopenharmony_ci helps to implement support for OSI mode and OS implementations may choose 1258c2ecf20Sopenharmony_ci to mandate it. 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci [3] Documentation/devicetree/bindings/power/power-domain.yaml 1288c2ecf20Sopenharmony_ci [4] Documentation/devicetree/bindings/power/domain-idle-state.yaml 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_cirequired: 1318c2ecf20Sopenharmony_ci - compatible 1328c2ecf20Sopenharmony_ci - method 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ciallOf: 1358c2ecf20Sopenharmony_ci - if: 1368c2ecf20Sopenharmony_ci properties: 1378c2ecf20Sopenharmony_ci compatible: 1388c2ecf20Sopenharmony_ci contains: 1398c2ecf20Sopenharmony_ci const: arm,psci 1408c2ecf20Sopenharmony_ci then: 1418c2ecf20Sopenharmony_ci required: 1428c2ecf20Sopenharmony_ci - cpu_off 1438c2ecf20Sopenharmony_ci - cpu_on 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ciadditionalProperties: false 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ciexamples: 1488c2ecf20Sopenharmony_ci - |+ 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci // Case 1: PSCI v0.1 only. 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci psci { 1538c2ecf20Sopenharmony_ci compatible = "arm,psci"; 1548c2ecf20Sopenharmony_ci method = "smc"; 1558c2ecf20Sopenharmony_ci cpu_suspend = <0x95c10000>; 1568c2ecf20Sopenharmony_ci cpu_off = <0x95c10001>; 1578c2ecf20Sopenharmony_ci cpu_on = <0x95c10002>; 1588c2ecf20Sopenharmony_ci migrate = <0x95c10003>; 1598c2ecf20Sopenharmony_ci }; 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci - |+ 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci // Case 2: PSCI v0.2 only 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ci psci { 1668c2ecf20Sopenharmony_ci compatible = "arm,psci-0.2"; 1678c2ecf20Sopenharmony_ci method = "smc"; 1688c2ecf20Sopenharmony_ci }; 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci - |+ 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ci // Case 3: PSCI v0.2 and PSCI v0.1. 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_ci /* 1768c2ecf20Sopenharmony_ci * A DTB may provide IDs for use by kernels without PSCI 0.2 support, 1778c2ecf20Sopenharmony_ci * enabling firmware and hypervisors to support existing and new kernels. 1788c2ecf20Sopenharmony_ci * These IDs will be ignored by kernels with PSCI 0.2 support, which will 1798c2ecf20Sopenharmony_ci * use the standard PSCI 0.2 IDs exclusively. 1808c2ecf20Sopenharmony_ci */ 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci psci { 1838c2ecf20Sopenharmony_ci compatible = "arm,psci-0.2", "arm,psci"; 1848c2ecf20Sopenharmony_ci method = "hvc"; 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci cpu_on = <0x95c10002>; 1878c2ecf20Sopenharmony_ci cpu_off = <0x95c10001>; 1888c2ecf20Sopenharmony_ci }; 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_ci - |+ 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci // Case 4: CPUs and CPU idle states described using the hierarchical model. 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_ci cpus { 1958c2ecf20Sopenharmony_ci #size-cells = <0>; 1968c2ecf20Sopenharmony_ci #address-cells = <1>; 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ci CPU0: cpu@0 { 1998c2ecf20Sopenharmony_ci device_type = "cpu"; 2008c2ecf20Sopenharmony_ci compatible = "arm,cortex-a53"; 2018c2ecf20Sopenharmony_ci reg = <0x0>; 2028c2ecf20Sopenharmony_ci enable-method = "psci"; 2038c2ecf20Sopenharmony_ci power-domains = <&CPU_PD0>; 2048c2ecf20Sopenharmony_ci power-domain-names = "psci"; 2058c2ecf20Sopenharmony_ci }; 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci CPU1: cpu@1 { 2088c2ecf20Sopenharmony_ci device_type = "cpu"; 2098c2ecf20Sopenharmony_ci compatible = "arm,cortex-a53"; 2108c2ecf20Sopenharmony_ci reg = <0x100>; 2118c2ecf20Sopenharmony_ci enable-method = "psci"; 2128c2ecf20Sopenharmony_ci power-domains = <&CPU_PD1>; 2138c2ecf20Sopenharmony_ci power-domain-names = "psci"; 2148c2ecf20Sopenharmony_ci }; 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ci idle-states { 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci CPU_PWRDN: cpu-power-down { 2198c2ecf20Sopenharmony_ci compatible = "arm,idle-state"; 2208c2ecf20Sopenharmony_ci arm,psci-suspend-param = <0x0000001>; 2218c2ecf20Sopenharmony_ci entry-latency-us = <10>; 2228c2ecf20Sopenharmony_ci exit-latency-us = <10>; 2238c2ecf20Sopenharmony_ci min-residency-us = <100>; 2248c2ecf20Sopenharmony_ci }; 2258c2ecf20Sopenharmony_ci }; 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_ci domain-idle-states { 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci CLUSTER_RET: cluster-retention { 2308c2ecf20Sopenharmony_ci compatible = "domain-idle-state"; 2318c2ecf20Sopenharmony_ci arm,psci-suspend-param = <0x1000011>; 2328c2ecf20Sopenharmony_ci entry-latency-us = <500>; 2338c2ecf20Sopenharmony_ci exit-latency-us = <500>; 2348c2ecf20Sopenharmony_ci min-residency-us = <2000>; 2358c2ecf20Sopenharmony_ci }; 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci CLUSTER_PWRDN: cluster-power-down { 2388c2ecf20Sopenharmony_ci compatible = "domain-idle-state"; 2398c2ecf20Sopenharmony_ci arm,psci-suspend-param = <0x1000031>; 2408c2ecf20Sopenharmony_ci entry-latency-us = <2000>; 2418c2ecf20Sopenharmony_ci exit-latency-us = <2000>; 2428c2ecf20Sopenharmony_ci min-residency-us = <6000>; 2438c2ecf20Sopenharmony_ci }; 2448c2ecf20Sopenharmony_ci }; 2458c2ecf20Sopenharmony_ci }; 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci psci { 2488c2ecf20Sopenharmony_ci compatible = "arm,psci-1.0"; 2498c2ecf20Sopenharmony_ci method = "smc"; 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci CPU_PD0: power-domain-cpu0 { 2528c2ecf20Sopenharmony_ci #power-domain-cells = <0>; 2538c2ecf20Sopenharmony_ci domain-idle-states = <&CPU_PWRDN>; 2548c2ecf20Sopenharmony_ci power-domains = <&CLUSTER_PD>; 2558c2ecf20Sopenharmony_ci }; 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci CPU_PD1: power-domain-cpu1 { 2588c2ecf20Sopenharmony_ci #power-domain-cells = <0>; 2598c2ecf20Sopenharmony_ci domain-idle-states = <&CPU_PWRDN>; 2608c2ecf20Sopenharmony_ci power-domains = <&CLUSTER_PD>; 2618c2ecf20Sopenharmony_ci }; 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci CLUSTER_PD: power-domain-cluster { 2648c2ecf20Sopenharmony_ci #power-domain-cells = <0>; 2658c2ecf20Sopenharmony_ci domain-idle-states = <&CLUSTER_RET>, <&CLUSTER_PWRDN>; 2668c2ecf20Sopenharmony_ci }; 2678c2ecf20Sopenharmony_ci }; 2688c2ecf20Sopenharmony_ci... 269