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