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