162306a36Sopenharmony_ci# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
262306a36Sopenharmony_ci%YAML 1.2
362306a36Sopenharmony_ci---
462306a36Sopenharmony_ci$id: http://devicetree.org/schemas/opp/opp-v2-kryo-cpu.yaml#
562306a36Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml#
662306a36Sopenharmony_ci
762306a36Sopenharmony_cititle: Qualcomm Technologies, Inc. NVMEM OPP
862306a36Sopenharmony_ci
962306a36Sopenharmony_cimaintainers:
1062306a36Sopenharmony_ci  - Ilia Lin <ilia.lin@kernel.org>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciallOf:
1362306a36Sopenharmony_ci  - $ref: opp-v2-base.yaml#
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cidescription: |
1662306a36Sopenharmony_ci  In certain Qualcomm Technologies, Inc. SoCs like APQ8096 and MSM8996,
1762306a36Sopenharmony_ci  the CPU frequencies subset and voltage value of each OPP varies based on
1862306a36Sopenharmony_ci  the silicon variant in use.
1962306a36Sopenharmony_ci  Qualcomm Technologies, Inc. Process Voltage Scaling Tables
2062306a36Sopenharmony_ci  defines the voltage and frequency value based on the speedbin blown in
2162306a36Sopenharmony_ci  the efuse combination.
2262306a36Sopenharmony_ci  The qcom-cpufreq-nvmem driver reads the efuse value from the SoC to provide
2362306a36Sopenharmony_ci  the OPP framework with required information (existing HW bitmap).
2462306a36Sopenharmony_ci  This is used to determine the voltage and frequency value for each OPP of
2562306a36Sopenharmony_ci  operating-points-v2 table when it is parsed by the OPP framework.
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ciproperties:
2862306a36Sopenharmony_ci  compatible:
2962306a36Sopenharmony_ci    const: operating-points-v2-kryo-cpu
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci  nvmem-cells:
3262306a36Sopenharmony_ci    description: |
3362306a36Sopenharmony_ci      A phandle pointing to a nvmem-cells node representing the
3462306a36Sopenharmony_ci      efuse registers that has information about the
3562306a36Sopenharmony_ci      speedbin that is used to select the right frequency/voltage
3662306a36Sopenharmony_ci      value pair.
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci  opp-shared: true
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cipatternProperties:
4162306a36Sopenharmony_ci  '^opp-?[0-9]+$':
4262306a36Sopenharmony_ci    type: object
4362306a36Sopenharmony_ci    additionalProperties: false
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci    properties:
4662306a36Sopenharmony_ci      opp-hz: true
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci      opp-microvolt: true
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci      opp-supported-hw:
5162306a36Sopenharmony_ci        description: |
5262306a36Sopenharmony_ci          A single 32 bit bitmap value, representing compatible HW.
5362306a36Sopenharmony_ci          Bitmap for MSM8996 format:
5462306a36Sopenharmony_ci          0:  MSM8996, speedbin 0
5562306a36Sopenharmony_ci          1:  MSM8996, speedbin 1
5662306a36Sopenharmony_ci          2:  MSM8996, speedbin 2
5762306a36Sopenharmony_ci          3:  MSM8996, speedbin 3
5862306a36Sopenharmony_ci          4-31:  unused
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci          Bitmap for MSM8996SG format (speedbin shifted of 4 left):
6162306a36Sopenharmony_ci          0-3:  unused
6262306a36Sopenharmony_ci          4:  MSM8996SG, speedbin 0
6362306a36Sopenharmony_ci          5:  MSM8996SG, speedbin 1
6462306a36Sopenharmony_ci          6:  MSM8996SG, speedbin 2
6562306a36Sopenharmony_ci          7-31:  unused
6662306a36Sopenharmony_ci        enum: [0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
6762306a36Sopenharmony_ci               0x9, 0xd, 0xe, 0xf,
6862306a36Sopenharmony_ci               0x10, 0x20, 0x30, 0x70]
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci      clock-latency-ns: true
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci      required-opps: true
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci    required:
7562306a36Sopenharmony_ci      - opp-hz
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cirequired:
7862306a36Sopenharmony_ci  - compatible
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ciif:
8162306a36Sopenharmony_ci  required:
8262306a36Sopenharmony_ci    - nvmem-cells
8362306a36Sopenharmony_cithen:
8462306a36Sopenharmony_ci  patternProperties:
8562306a36Sopenharmony_ci    '^opp-?[0-9]+$':
8662306a36Sopenharmony_ci      required:
8762306a36Sopenharmony_ci        - opp-supported-hw
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ciadditionalProperties: false
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ciexamples:
9262306a36Sopenharmony_ci  - |
9362306a36Sopenharmony_ci    / {
9462306a36Sopenharmony_ci        model = "Qualcomm Technologies, Inc. DB820c";
9562306a36Sopenharmony_ci        compatible = "arrow,apq8096-db820c", "qcom,apq8096-sbc", "qcom,apq8096";
9662306a36Sopenharmony_ci        #address-cells = <2>;
9762306a36Sopenharmony_ci        #size-cells = <2>;
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci        cpus {
10062306a36Sopenharmony_ci            #address-cells = <2>;
10162306a36Sopenharmony_ci            #size-cells = <0>;
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci            CPU0: cpu@0 {
10462306a36Sopenharmony_ci                device_type = "cpu";
10562306a36Sopenharmony_ci                compatible = "qcom,kryo";
10662306a36Sopenharmony_ci                reg = <0x0 0x0>;
10762306a36Sopenharmony_ci                enable-method = "psci";
10862306a36Sopenharmony_ci                cpu-idle-states = <&CPU_SLEEP_0>;
10962306a36Sopenharmony_ci                capacity-dmips-mhz = <1024>;
11062306a36Sopenharmony_ci                clocks = <&kryocc 0>;
11162306a36Sopenharmony_ci                operating-points-v2 = <&cluster0_opp>;
11262306a36Sopenharmony_ci                power-domains = <&cpr>;
11362306a36Sopenharmony_ci                power-domain-names = "cpr";
11462306a36Sopenharmony_ci                #cooling-cells = <2>;
11562306a36Sopenharmony_ci                next-level-cache = <&L2_0>;
11662306a36Sopenharmony_ci                L2_0: l2-cache {
11762306a36Sopenharmony_ci                    compatible = "cache";
11862306a36Sopenharmony_ci                    cache-level = <2>;
11962306a36Sopenharmony_ci                    cache-unified;
12062306a36Sopenharmony_ci                };
12162306a36Sopenharmony_ci            };
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci            CPU1: cpu@1 {
12462306a36Sopenharmony_ci                device_type = "cpu";
12562306a36Sopenharmony_ci                compatible = "qcom,kryo";
12662306a36Sopenharmony_ci                reg = <0x0 0x1>;
12762306a36Sopenharmony_ci                enable-method = "psci";
12862306a36Sopenharmony_ci                cpu-idle-states = <&CPU_SLEEP_0>;
12962306a36Sopenharmony_ci                capacity-dmips-mhz = <1024>;
13062306a36Sopenharmony_ci                clocks = <&kryocc 0>;
13162306a36Sopenharmony_ci                operating-points-v2 = <&cluster0_opp>;
13262306a36Sopenharmony_ci                power-domains = <&cpr>;
13362306a36Sopenharmony_ci                power-domain-names = "cpr";
13462306a36Sopenharmony_ci                #cooling-cells = <2>;
13562306a36Sopenharmony_ci                next-level-cache = <&L2_0>;
13662306a36Sopenharmony_ci            };
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci            CPU2: cpu@100 {
13962306a36Sopenharmony_ci                device_type = "cpu";
14062306a36Sopenharmony_ci                compatible = "qcom,kryo";
14162306a36Sopenharmony_ci                reg = <0x0 0x100>;
14262306a36Sopenharmony_ci                enable-method = "psci";
14362306a36Sopenharmony_ci                cpu-idle-states = <&CPU_SLEEP_0>;
14462306a36Sopenharmony_ci                capacity-dmips-mhz = <1024>;
14562306a36Sopenharmony_ci                clocks = <&kryocc 1>;
14662306a36Sopenharmony_ci                operating-points-v2 = <&cluster1_opp>;
14762306a36Sopenharmony_ci                power-domains = <&cpr>;
14862306a36Sopenharmony_ci                power-domain-names = "cpr";
14962306a36Sopenharmony_ci                #cooling-cells = <2>;
15062306a36Sopenharmony_ci                next-level-cache = <&L2_1>;
15162306a36Sopenharmony_ci                L2_1: l2-cache {
15262306a36Sopenharmony_ci                    compatible = "cache";
15362306a36Sopenharmony_ci                    cache-level = <2>;
15462306a36Sopenharmony_ci                    cache-unified;
15562306a36Sopenharmony_ci                };
15662306a36Sopenharmony_ci            };
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci            CPU3: cpu@101 {
15962306a36Sopenharmony_ci                device_type = "cpu";
16062306a36Sopenharmony_ci                compatible = "qcom,kryo";
16162306a36Sopenharmony_ci                reg = <0x0 0x101>;
16262306a36Sopenharmony_ci                enable-method = "psci";
16362306a36Sopenharmony_ci                cpu-idle-states = <&CPU_SLEEP_0>;
16462306a36Sopenharmony_ci                capacity-dmips-mhz = <1024>;
16562306a36Sopenharmony_ci                clocks = <&kryocc 1>;
16662306a36Sopenharmony_ci                operating-points-v2 = <&cluster1_opp>;
16762306a36Sopenharmony_ci                power-domains = <&cpr>;
16862306a36Sopenharmony_ci                power-domain-names = "cpr";
16962306a36Sopenharmony_ci                #cooling-cells = <2>;
17062306a36Sopenharmony_ci                next-level-cache = <&L2_1>;
17162306a36Sopenharmony_ci            };
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci            cpu-map {
17462306a36Sopenharmony_ci                cluster0 {
17562306a36Sopenharmony_ci                    core0 {
17662306a36Sopenharmony_ci                        cpu = <&CPU0>;
17762306a36Sopenharmony_ci                    };
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci                    core1 {
18062306a36Sopenharmony_ci                        cpu = <&CPU1>;
18162306a36Sopenharmony_ci                    };
18262306a36Sopenharmony_ci                };
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci                cluster1 {
18562306a36Sopenharmony_ci                    core0 {
18662306a36Sopenharmony_ci                        cpu = <&CPU2>;
18762306a36Sopenharmony_ci                    };
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci                    core1 {
19062306a36Sopenharmony_ci                        cpu = <&CPU3>;
19162306a36Sopenharmony_ci                    };
19262306a36Sopenharmony_ci                };
19362306a36Sopenharmony_ci            };
19462306a36Sopenharmony_ci        };
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci        cluster0_opp: opp-table-0 {
19762306a36Sopenharmony_ci            compatible = "operating-points-v2-kryo-cpu";
19862306a36Sopenharmony_ci            nvmem-cells = <&speedbin_efuse>;
19962306a36Sopenharmony_ci            opp-shared;
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci            opp-307200000 {
20262306a36Sopenharmony_ci                opp-hz = /bits/ 64 <307200000>;
20362306a36Sopenharmony_ci                opp-microvolt = <905000 905000 1140000>;
20462306a36Sopenharmony_ci                opp-supported-hw = <0x7>;
20562306a36Sopenharmony_ci                clock-latency-ns = <200000>;
20662306a36Sopenharmony_ci                required-opps = <&cpr_opp1>;
20762306a36Sopenharmony_ci            };
20862306a36Sopenharmony_ci            opp-1401600000 {
20962306a36Sopenharmony_ci                opp-hz = /bits/ 64 <1401600000>;
21062306a36Sopenharmony_ci                opp-microvolt = <1140000 905000 1140000>;
21162306a36Sopenharmony_ci                opp-supported-hw = <0x5>;
21262306a36Sopenharmony_ci                clock-latency-ns = <200000>;
21362306a36Sopenharmony_ci                required-opps = <&cpr_opp2>;
21462306a36Sopenharmony_ci            };
21562306a36Sopenharmony_ci            opp-1593600000 {
21662306a36Sopenharmony_ci                opp-hz = /bits/ 64 <1593600000>;
21762306a36Sopenharmony_ci                opp-microvolt = <1140000 905000 1140000>;
21862306a36Sopenharmony_ci                opp-supported-hw = <0x1>;
21962306a36Sopenharmony_ci                clock-latency-ns = <200000>;
22062306a36Sopenharmony_ci                required-opps = <&cpr_opp3>;
22162306a36Sopenharmony_ci            };
22262306a36Sopenharmony_ci        };
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci        cluster1_opp: opp-table-1 {
22562306a36Sopenharmony_ci            compatible = "operating-points-v2-kryo-cpu";
22662306a36Sopenharmony_ci            nvmem-cells = <&speedbin_efuse>;
22762306a36Sopenharmony_ci            opp-shared;
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci            opp-307200000 {
23062306a36Sopenharmony_ci                opp-hz = /bits/ 64 <307200000>;
23162306a36Sopenharmony_ci                opp-microvolt = <905000 905000 1140000>;
23262306a36Sopenharmony_ci                opp-supported-hw = <0x7>;
23362306a36Sopenharmony_ci                clock-latency-ns = <200000>;
23462306a36Sopenharmony_ci                required-opps = <&cpr_opp1>;
23562306a36Sopenharmony_ci            };
23662306a36Sopenharmony_ci            opp-1804800000 {
23762306a36Sopenharmony_ci                opp-hz = /bits/ 64 <1804800000>;
23862306a36Sopenharmony_ci                opp-microvolt = <1140000 905000 1140000>;
23962306a36Sopenharmony_ci                opp-supported-hw = <0x6>;
24062306a36Sopenharmony_ci                clock-latency-ns = <200000>;
24162306a36Sopenharmony_ci                required-opps = <&cpr_opp4>;
24262306a36Sopenharmony_ci            };
24362306a36Sopenharmony_ci            opp-1900800000 {
24462306a36Sopenharmony_ci                opp-hz = /bits/ 64 <1900800000>;
24562306a36Sopenharmony_ci                opp-microvolt = <1140000 905000 1140000>;
24662306a36Sopenharmony_ci                opp-supported-hw = <0x4>;
24762306a36Sopenharmony_ci                clock-latency-ns = <200000>;
24862306a36Sopenharmony_ci                required-opps = <&cpr_opp5>;
24962306a36Sopenharmony_ci            };
25062306a36Sopenharmony_ci            opp-2150400000 {
25162306a36Sopenharmony_ci                opp-hz = /bits/ 64 <2150400000>;
25262306a36Sopenharmony_ci                opp-microvolt = <1140000 905000 1140000>;
25362306a36Sopenharmony_ci                opp-supported-hw = <0x1>;
25462306a36Sopenharmony_ci                clock-latency-ns = <200000>;
25562306a36Sopenharmony_ci                required-opps = <&cpr_opp6>;
25662306a36Sopenharmony_ci            };
25762306a36Sopenharmony_ci        };
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci        smem {
26062306a36Sopenharmony_ci            compatible = "qcom,smem";
26162306a36Sopenharmony_ci            memory-region = <&smem_mem>;
26262306a36Sopenharmony_ci            hwlocks = <&tcsr_mutex 3>;
26362306a36Sopenharmony_ci        };
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci        soc {
26662306a36Sopenharmony_ci            #address-cells = <1>;
26762306a36Sopenharmony_ci            #size-cells = <1>;
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci            qfprom: qfprom@74000 {
27062306a36Sopenharmony_ci                compatible = "qcom,msm8996-qfprom", "qcom,qfprom";
27162306a36Sopenharmony_ci                reg = <0x00074000 0x8ff>;
27262306a36Sopenharmony_ci                #address-cells = <1>;
27362306a36Sopenharmony_ci                #size-cells = <1>;
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci                speedbin_efuse: speedbin@133 {
27662306a36Sopenharmony_ci                    reg = <0x133 0x1>;
27762306a36Sopenharmony_ci                    bits = <5 3>;
27862306a36Sopenharmony_ci                };
27962306a36Sopenharmony_ci            };
28062306a36Sopenharmony_ci        };
28162306a36Sopenharmony_ci    };
282