162306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci%YAML 1.2 362306a36Sopenharmony_ci--- 462306a36Sopenharmony_ci$id: http://devicetree.org/schemas/soc/qcom/qcom,rpmh-rsc.yaml# 562306a36Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml# 662306a36Sopenharmony_ci 762306a36Sopenharmony_cititle: Qualcomm RPMH RSC 862306a36Sopenharmony_ci 962306a36Sopenharmony_cimaintainers: 1062306a36Sopenharmony_ci - Bjorn Andersson <bjorn.andersson@linaro.org> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cidescription: | 1362306a36Sopenharmony_ci Resource Power Manager Hardened (RPMH) is the mechanism for communicating 1462306a36Sopenharmony_ci with the hardened resource accelerators on Qualcomm SoCs. Requests to the 1562306a36Sopenharmony_ci resources can be written to the Trigger Command Set (TCS) registers and 1662306a36Sopenharmony_ci using a (addr, val) pair and triggered. Messages in the TCS are then sent in 1762306a36Sopenharmony_ci sequence over an internal bus. 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci The hardware block (Direct Resource Voter or DRV) is a part of the h/w entity 2062306a36Sopenharmony_ci (Resource State Coordinator a.k.a RSC) that can handle multiple sleep and 2162306a36Sopenharmony_ci active/wake resource requests. Multiple such DRVs can exist in a SoC and can 2262306a36Sopenharmony_ci be written to from Linux. The structure of each DRV follows the same template 2362306a36Sopenharmony_ci with a few variations that are captured by the properties here. 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci A TCS may be triggered from Linux or triggered by the F/W after all the CPUs 2662306a36Sopenharmony_ci have powered off to facilitate idle power saving. TCS could be classified as:: 2762306a36Sopenharmony_ci ACTIVE - Triggered by Linux 2862306a36Sopenharmony_ci SLEEP - Triggered by F/W 2962306a36Sopenharmony_ci WAKE - Triggered by F/W 3062306a36Sopenharmony_ci CONTROL - Triggered by F/W 3162306a36Sopenharmony_ci See also:: <dt-bindings/soc/qcom,rpmh-rsc.h> 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci The order in which they are described in the DT, should match the hardware 3462306a36Sopenharmony_ci configuration. 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci Requests can be made for the state of a resource, when the subsystem is 3762306a36Sopenharmony_ci active or idle. When all subsystems like Modem, GPU, CPU are idle, the 3862306a36Sopenharmony_ci resource state will be an aggregate of the sleep votes from each of those 3962306a36Sopenharmony_ci subsystems. Clients may request a sleep value for their shared resources in 4062306a36Sopenharmony_ci addition to the active mode requests. 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci Drivers that want to use the RSC to communicate with RPMH must specify their 4362306a36Sopenharmony_ci bindings as child nodes of the RSC controllers they wish to communicate with. 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ciproperties: 4662306a36Sopenharmony_ci compatible: 4762306a36Sopenharmony_ci const: qcom,rpmh-rsc 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci interrupts: 5062306a36Sopenharmony_ci minItems: 1 5162306a36Sopenharmony_ci maxItems: 4 5262306a36Sopenharmony_ci description: 5362306a36Sopenharmony_ci The interrupt that trips when a message complete/response is received for 5462306a36Sopenharmony_ci this DRV from the accelerators. 5562306a36Sopenharmony_ci Number of interrupts must match number of DRV blocks. 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci label: 5862306a36Sopenharmony_ci description: 5962306a36Sopenharmony_ci Name for the RSC. The name would be used in trace logs. 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci qcom,drv-id: 6262306a36Sopenharmony_ci $ref: /schemas/types.yaml#/definitions/uint32 6362306a36Sopenharmony_ci description: 6462306a36Sopenharmony_ci The ID of the DRV in the RSC block that will be used by this controller. 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci qcom,tcs-config: 6762306a36Sopenharmony_ci $ref: /schemas/types.yaml#/definitions/uint32-matrix 6862306a36Sopenharmony_ci minItems: 4 6962306a36Sopenharmony_ci maxItems: 4 7062306a36Sopenharmony_ci items: 7162306a36Sopenharmony_ci items: 7262306a36Sopenharmony_ci - description: | 7362306a36Sopenharmony_ci TCS type:: 7462306a36Sopenharmony_ci - ACTIVE_TCS 7562306a36Sopenharmony_ci - SLEEP_TCS 7662306a36Sopenharmony_ci - WAKE_TCS 7762306a36Sopenharmony_ci - CONTROL_TCS 7862306a36Sopenharmony_ci enum: [ 0, 1, 2, 3 ] 7962306a36Sopenharmony_ci - description: Number of TCS 8062306a36Sopenharmony_ci description: | 8162306a36Sopenharmony_ci The tuple defining the configuration of TCS. Must have two cells which 8262306a36Sopenharmony_ci describe each TCS type. The order of the TCS must match the hardware 8362306a36Sopenharmony_ci configuration. 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci qcom,tcs-offset: 8662306a36Sopenharmony_ci $ref: /schemas/types.yaml#/definitions/uint32 8762306a36Sopenharmony_ci description: 8862306a36Sopenharmony_ci The offset of the TCS blocks. 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci reg: 9162306a36Sopenharmony_ci minItems: 1 9262306a36Sopenharmony_ci maxItems: 4 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci reg-names: 9562306a36Sopenharmony_ci minItems: 1 9662306a36Sopenharmony_ci items: 9762306a36Sopenharmony_ci - const: drv-0 9862306a36Sopenharmony_ci - const: drv-1 9962306a36Sopenharmony_ci - const: drv-2 10062306a36Sopenharmony_ci - const: drv-3 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci power-domains: 10362306a36Sopenharmony_ci maxItems: 1 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci bcm-voter: 10662306a36Sopenharmony_ci $ref: /schemas/interconnect/qcom,bcm-voter.yaml# 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci clock-controller: 10962306a36Sopenharmony_ci $ref: /schemas/clock/qcom,rpmhcc.yaml# 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci power-controller: 11262306a36Sopenharmony_ci $ref: /schemas/power/qcom,rpmpd.yaml# 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_cipatternProperties: 11562306a36Sopenharmony_ci '^regulators(-[0-9])?$': 11662306a36Sopenharmony_ci $ref: /schemas/regulator/qcom,rpmh-regulator.yaml# 11762306a36Sopenharmony_ci unevaluatedProperties: false 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cirequired: 12062306a36Sopenharmony_ci - compatible 12162306a36Sopenharmony_ci - interrupts 12262306a36Sopenharmony_ci - qcom,drv-id 12362306a36Sopenharmony_ci - qcom,tcs-config 12462306a36Sopenharmony_ci - qcom,tcs-offset 12562306a36Sopenharmony_ci - reg 12662306a36Sopenharmony_ci - reg-names 12762306a36Sopenharmony_ci - power-domains 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ciadditionalProperties: false 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ciexamples: 13262306a36Sopenharmony_ci - | 13362306a36Sopenharmony_ci // For a TCS whose RSC base address is 0x179C0000 and is at a DRV id of 13462306a36Sopenharmony_ci // 2, the register offsets for DRV2 start at 0D00, the register 13562306a36Sopenharmony_ci // calculations are like this:: 13662306a36Sopenharmony_ci // DRV0: 0x179C0000 13762306a36Sopenharmony_ci // DRV2: 0x179C0000 + 0x10000 = 0x179D0000 13862306a36Sopenharmony_ci // DRV2: 0x179C0000 + 0x10000 * 2 = 0x179E0000 13962306a36Sopenharmony_ci // TCS-OFFSET: 0xD00 14062306a36Sopenharmony_ci #include <dt-bindings/interrupt-controller/arm-gic.h> 14162306a36Sopenharmony_ci #include <dt-bindings/soc/qcom,rpmh-rsc.h> 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci rsc@179c0000 { 14462306a36Sopenharmony_ci compatible = "qcom,rpmh-rsc"; 14562306a36Sopenharmony_ci reg = <0x179c0000 0x10000>, 14662306a36Sopenharmony_ci <0x179d0000 0x10000>, 14762306a36Sopenharmony_ci <0x179e0000 0x10000>; 14862306a36Sopenharmony_ci reg-names = "drv-0", "drv-1", "drv-2"; 14962306a36Sopenharmony_ci interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>, 15062306a36Sopenharmony_ci <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>, 15162306a36Sopenharmony_ci <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>; 15262306a36Sopenharmony_ci label = "apps_rsc"; 15362306a36Sopenharmony_ci qcom,tcs-offset = <0xd00>; 15462306a36Sopenharmony_ci qcom,drv-id = <2>; 15562306a36Sopenharmony_ci qcom,tcs-config = <ACTIVE_TCS 2>, 15662306a36Sopenharmony_ci <SLEEP_TCS 3>, 15762306a36Sopenharmony_ci <WAKE_TCS 3>, 15862306a36Sopenharmony_ci <CONTROL_TCS 1>; 15962306a36Sopenharmony_ci power-domains = <&CLUSTER_PD>; 16062306a36Sopenharmony_ci }; 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci - | 16362306a36Sopenharmony_ci // For a TCS whose RSC base address is 0xAF20000 and is at DRV id of 0, the 16462306a36Sopenharmony_ci // register offsets for DRV0 start at 01C00, the register calculations are 16562306a36Sopenharmony_ci // like this:: 16662306a36Sopenharmony_ci // DRV0: 0xAF20000 16762306a36Sopenharmony_ci // TCS-OFFSET: 0x1C00 16862306a36Sopenharmony_ci #include <dt-bindings/interrupt-controller/arm-gic.h> 16962306a36Sopenharmony_ci #include <dt-bindings/soc/qcom,rpmh-rsc.h> 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci rsc@af20000 { 17262306a36Sopenharmony_ci compatible = "qcom,rpmh-rsc"; 17362306a36Sopenharmony_ci reg = <0xaf20000 0x10000>; 17462306a36Sopenharmony_ci reg-names = "drv-0"; 17562306a36Sopenharmony_ci interrupts = <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>; 17662306a36Sopenharmony_ci label = "disp_rsc"; 17762306a36Sopenharmony_ci qcom,tcs-offset = <0x1c00>; 17862306a36Sopenharmony_ci qcom,drv-id = <0>; 17962306a36Sopenharmony_ci qcom,tcs-config = <ACTIVE_TCS 0>, 18062306a36Sopenharmony_ci <SLEEP_TCS 1>, 18162306a36Sopenharmony_ci <WAKE_TCS 1>, 18262306a36Sopenharmony_ci <CONTROL_TCS 0>; 18362306a36Sopenharmony_ci power-domains = <&CLUSTER_PD>; 18462306a36Sopenharmony_ci }; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci - | 18762306a36Sopenharmony_ci #include <dt-bindings/interrupt-controller/arm-gic.h> 18862306a36Sopenharmony_ci #include <dt-bindings/soc/qcom,rpmh-rsc.h> 18962306a36Sopenharmony_ci #include <dt-bindings/power/qcom-rpmpd.h> 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci rsc@18200000 { 19262306a36Sopenharmony_ci compatible = "qcom,rpmh-rsc"; 19362306a36Sopenharmony_ci reg = <0x18200000 0x10000>, 19462306a36Sopenharmony_ci <0x18210000 0x10000>, 19562306a36Sopenharmony_ci <0x18220000 0x10000>; 19662306a36Sopenharmony_ci reg-names = "drv-0", "drv-1", "drv-2"; 19762306a36Sopenharmony_ci interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>, 19862306a36Sopenharmony_ci <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>, 19962306a36Sopenharmony_ci <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>; 20062306a36Sopenharmony_ci label = "apps_rsc"; 20162306a36Sopenharmony_ci qcom,tcs-offset = <0xd00>; 20262306a36Sopenharmony_ci qcom,drv-id = <2>; 20362306a36Sopenharmony_ci qcom,tcs-config = <ACTIVE_TCS 2>, 20462306a36Sopenharmony_ci <SLEEP_TCS 3>, 20562306a36Sopenharmony_ci <WAKE_TCS 3>, 20662306a36Sopenharmony_ci <CONTROL_TCS 0>; 20762306a36Sopenharmony_ci power-domains = <&CLUSTER_PD>; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci clock-controller { 21062306a36Sopenharmony_ci compatible = "qcom,sm8350-rpmh-clk"; 21162306a36Sopenharmony_ci #clock-cells = <1>; 21262306a36Sopenharmony_ci clock-names = "xo"; 21362306a36Sopenharmony_ci clocks = <&xo_board>; 21462306a36Sopenharmony_ci }; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci power-controller { 21762306a36Sopenharmony_ci compatible = "qcom,sm8350-rpmhpd"; 21862306a36Sopenharmony_ci #power-domain-cells = <1>; 21962306a36Sopenharmony_ci operating-points-v2 = <&rpmhpd_opp_table>; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci rpmhpd_opp_table: opp-table { 22262306a36Sopenharmony_ci compatible = "operating-points-v2"; 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci rpmhpd_opp_ret: opp1 { 22562306a36Sopenharmony_ci opp-level = <RPMH_REGULATOR_LEVEL_RETENTION>; 22662306a36Sopenharmony_ci }; 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci rpmhpd_opp_min_svs: opp2 { 22962306a36Sopenharmony_ci opp-level = <RPMH_REGULATOR_LEVEL_MIN_SVS>; 23062306a36Sopenharmony_ci }; 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci rpmhpd_opp_low_svs: opp3 { 23362306a36Sopenharmony_ci opp-level = <RPMH_REGULATOR_LEVEL_LOW_SVS>; 23462306a36Sopenharmony_ci }; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci rpmhpd_opp_svs: opp4 { 23762306a36Sopenharmony_ci opp-level = <RPMH_REGULATOR_LEVEL_SVS>; 23862306a36Sopenharmony_ci }; 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci rpmhpd_opp_svs_l1: opp5 { 24162306a36Sopenharmony_ci opp-level = <RPMH_REGULATOR_LEVEL_SVS_L1>; 24262306a36Sopenharmony_ci }; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci rpmhpd_opp_nom: opp6 { 24562306a36Sopenharmony_ci opp-level = <RPMH_REGULATOR_LEVEL_NOM>; 24662306a36Sopenharmony_ci }; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci rpmhpd_opp_nom_l1: opp7 { 24962306a36Sopenharmony_ci opp-level = <RPMH_REGULATOR_LEVEL_NOM_L1>; 25062306a36Sopenharmony_ci }; 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci rpmhpd_opp_nom_l2: opp8 { 25362306a36Sopenharmony_ci opp-level = <RPMH_REGULATOR_LEVEL_NOM_L2>; 25462306a36Sopenharmony_ci }; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci rpmhpd_opp_turbo: opp9 { 25762306a36Sopenharmony_ci opp-level = <RPMH_REGULATOR_LEVEL_TURBO>; 25862306a36Sopenharmony_ci }; 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci rpmhpd_opp_turbo_l1: opp10 { 26162306a36Sopenharmony_ci opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L1>; 26262306a36Sopenharmony_ci }; 26362306a36Sopenharmony_ci }; 26462306a36Sopenharmony_ci }; 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci bcm-voter { 26762306a36Sopenharmony_ci compatible = "qcom,bcm-voter"; 26862306a36Sopenharmony_ci }; 26962306a36Sopenharmony_ci }; 270