Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'cpufreq/arm/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm

Pull ARM cpufreq updates for 5.18-rc1 fron Viresh Kumar:

"- Add per core DVFS support for QCom SoC (Bjorn Andersson), convert to yaml
binding (Manivannan Sadhasivam) and various other fixes to the QCom drivers
(Luca Weiss).

- Add OPP table for imx7s SoC (Denys Drozdov) and minor fixes (Stefan Agner).

- Fix CPPC driver's freq/performance conversions (Pierre Gondois).

- Minor generic cleanups (Yury Norov)."

* 'cpufreq/arm/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm:
dt-bindings: cpufreq: cpufreq-qcom-hw: Convert to YAML bindings
dt-bindings: dvfs: Use MediaTek CPUFREQ HW as an example
cpufreq: blocklist Qualcomm sc8280xp and sa8540p in cpufreq-dt-platdev
cpufreq: qcom-hw: Add support for per-core-dcvs
cpufreq: CPPC: Fix performance/frequency conversion
cpufreq: Add i.MX7S to cpufreq-dt-platdev blocklist
ARM: dts: imx7s: Define operating points table for cpufreq
cpufreq: qcom-cpufreq-nvmem: fix reading of PVS Valid fuse
cpufreq: replace cpumask_weight with cpumask_empty where appropriate

+272 -201
-172
Documentation/devicetree/bindings/cpufreq/cpufreq-qcom-hw.txt
··· 1 - Qualcomm Technologies, Inc. CPUFREQ Bindings 2 - 3 - CPUFREQ HW is a hardware engine used by some Qualcomm Technologies, Inc. (QTI) 4 - SoCs to manage frequency in hardware. It is capable of controlling frequency 5 - for multiple clusters. 6 - 7 - Properties: 8 - - compatible 9 - Usage: required 10 - Value type: <string> 11 - Definition: must be "qcom,cpufreq-hw" or "qcom,cpufreq-epss". 12 - 13 - - clocks 14 - Usage: required 15 - Value type: <phandle> From common clock binding. 16 - Definition: clock handle for XO clock and GPLL0 clock. 17 - 18 - - clock-names 19 - Usage: required 20 - Value type: <string> From common clock binding. 21 - Definition: must be "xo", "alternate". 22 - 23 - - reg 24 - Usage: required 25 - Value type: <prop-encoded-array> 26 - Definition: Addresses and sizes for the memory of the HW bases in 27 - each frequency domain. 28 - - reg-names 29 - Usage: Optional 30 - Value type: <string> 31 - Definition: Frequency domain name i.e. 32 - "freq-domain0", "freq-domain1". 33 - 34 - - #freq-domain-cells: 35 - Usage: required. 36 - Definition: Number of cells in a freqency domain specifier. 37 - 38 - * Property qcom,freq-domain 39 - Devices supporting freq-domain must set their "qcom,freq-domain" property with 40 - phandle to a cpufreq_hw followed by the Domain ID(0/1) in the CPU DT node. 41 - 42 - 43 - Example: 44 - 45 - Example 1: Dual-cluster, Quad-core per cluster. CPUs within a cluster switch 46 - DCVS state together. 47 - 48 - / { 49 - cpus { 50 - #address-cells = <2>; 51 - #size-cells = <0>; 52 - 53 - CPU0: cpu@0 { 54 - device_type = "cpu"; 55 - compatible = "qcom,kryo385"; 56 - reg = <0x0 0x0>; 57 - enable-method = "psci"; 58 - next-level-cache = <&L2_0>; 59 - qcom,freq-domain = <&cpufreq_hw 0>; 60 - L2_0: l2-cache { 61 - compatible = "cache"; 62 - next-level-cache = <&L3_0>; 63 - L3_0: l3-cache { 64 - compatible = "cache"; 65 - }; 66 - }; 67 - }; 68 - 69 - CPU1: cpu@100 { 70 - device_type = "cpu"; 71 - compatible = "qcom,kryo385"; 72 - reg = <0x0 0x100>; 73 - enable-method = "psci"; 74 - next-level-cache = <&L2_100>; 75 - qcom,freq-domain = <&cpufreq_hw 0>; 76 - L2_100: l2-cache { 77 - compatible = "cache"; 78 - next-level-cache = <&L3_0>; 79 - }; 80 - }; 81 - 82 - CPU2: cpu@200 { 83 - device_type = "cpu"; 84 - compatible = "qcom,kryo385"; 85 - reg = <0x0 0x200>; 86 - enable-method = "psci"; 87 - next-level-cache = <&L2_200>; 88 - qcom,freq-domain = <&cpufreq_hw 0>; 89 - L2_200: l2-cache { 90 - compatible = "cache"; 91 - next-level-cache = <&L3_0>; 92 - }; 93 - }; 94 - 95 - CPU3: cpu@300 { 96 - device_type = "cpu"; 97 - compatible = "qcom,kryo385"; 98 - reg = <0x0 0x300>; 99 - enable-method = "psci"; 100 - next-level-cache = <&L2_300>; 101 - qcom,freq-domain = <&cpufreq_hw 0>; 102 - L2_300: l2-cache { 103 - compatible = "cache"; 104 - next-level-cache = <&L3_0>; 105 - }; 106 - }; 107 - 108 - CPU4: cpu@400 { 109 - device_type = "cpu"; 110 - compatible = "qcom,kryo385"; 111 - reg = <0x0 0x400>; 112 - enable-method = "psci"; 113 - next-level-cache = <&L2_400>; 114 - qcom,freq-domain = <&cpufreq_hw 1>; 115 - L2_400: l2-cache { 116 - compatible = "cache"; 117 - next-level-cache = <&L3_0>; 118 - }; 119 - }; 120 - 121 - CPU5: cpu@500 { 122 - device_type = "cpu"; 123 - compatible = "qcom,kryo385"; 124 - reg = <0x0 0x500>; 125 - enable-method = "psci"; 126 - next-level-cache = <&L2_500>; 127 - qcom,freq-domain = <&cpufreq_hw 1>; 128 - L2_500: l2-cache { 129 - compatible = "cache"; 130 - next-level-cache = <&L3_0>; 131 - }; 132 - }; 133 - 134 - CPU6: cpu@600 { 135 - device_type = "cpu"; 136 - compatible = "qcom,kryo385"; 137 - reg = <0x0 0x600>; 138 - enable-method = "psci"; 139 - next-level-cache = <&L2_600>; 140 - qcom,freq-domain = <&cpufreq_hw 1>; 141 - L2_600: l2-cache { 142 - compatible = "cache"; 143 - next-level-cache = <&L3_0>; 144 - }; 145 - }; 146 - 147 - CPU7: cpu@700 { 148 - device_type = "cpu"; 149 - compatible = "qcom,kryo385"; 150 - reg = <0x0 0x700>; 151 - enable-method = "psci"; 152 - next-level-cache = <&L2_700>; 153 - qcom,freq-domain = <&cpufreq_hw 1>; 154 - L2_700: l2-cache { 155 - compatible = "cache"; 156 - next-level-cache = <&L3_0>; 157 - }; 158 - }; 159 - }; 160 - 161 - soc { 162 - cpufreq_hw: cpufreq@17d43000 { 163 - compatible = "qcom,cpufreq-hw"; 164 - reg = <0x17d43000 0x1400>, <0x17d45800 0x1400>; 165 - reg-names = "freq-domain0", "freq-domain1"; 166 - 167 - clocks = <&rpmhcc RPMH_CXO_CLK>, <&gcc GPLL0>; 168 - clock-names = "xo", "alternate"; 169 - 170 - #freq-domain-cells = <1>; 171 - }; 172 - }
+201
Documentation/devicetree/bindings/cpufreq/cpufreq-qcom-hw.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/cpufreq/cpufreq-qcom-hw.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Technologies, Inc. CPUFREQ 8 + 9 + maintainers: 10 + - Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> 11 + 12 + description: | 13 + 14 + CPUFREQ HW is a hardware engine used by some Qualcomm Technologies, Inc. (QTI) 15 + SoCs to manage frequency in hardware. It is capable of controlling frequency 16 + for multiple clusters. 17 + 18 + properties: 19 + compatible: 20 + oneOf: 21 + - description: v1 of CPUFREQ HW 22 + items: 23 + - const: qcom,cpufreq-hw 24 + 25 + - description: v2 of CPUFREQ HW (EPSS) 26 + items: 27 + - enum: 28 + - qcom,sm8250-cpufreq-epss 29 + - const: qcom,cpufreq-epss 30 + 31 + reg: 32 + minItems: 2 33 + items: 34 + - description: Frequency domain 0 register region 35 + - description: Frequency domain 1 register region 36 + - description: Frequency domain 2 register region 37 + 38 + reg-names: 39 + minItems: 2 40 + items: 41 + - const: freq-domain0 42 + - const: freq-domain1 43 + - const: freq-domain2 44 + 45 + clocks: 46 + items: 47 + - description: XO Clock 48 + - description: GPLL0 Clock 49 + 50 + clock-names: 51 + items: 52 + - const: xo 53 + - const: alternate 54 + 55 + '#freq-domain-cells': 56 + const: 1 57 + 58 + required: 59 + - compatible 60 + - reg 61 + - clocks 62 + - clock-names 63 + - '#freq-domain-cells' 64 + 65 + additionalProperties: false 66 + 67 + examples: 68 + - | 69 + #include <dt-bindings/clock/qcom,gcc-sdm845.h> 70 + #include <dt-bindings/clock/qcom,rpmh.h> 71 + 72 + // Example 1: Dual-cluster, Quad-core per cluster. CPUs within a cluster 73 + // switch DCVS state together. 74 + cpus { 75 + #address-cells = <2>; 76 + #size-cells = <0>; 77 + 78 + CPU0: cpu@0 { 79 + device_type = "cpu"; 80 + compatible = "qcom,kryo385"; 81 + reg = <0x0 0x0>; 82 + enable-method = "psci"; 83 + next-level-cache = <&L2_0>; 84 + qcom,freq-domain = <&cpufreq_hw 0>; 85 + L2_0: l2-cache { 86 + compatible = "cache"; 87 + next-level-cache = <&L3_0>; 88 + L3_0: l3-cache { 89 + compatible = "cache"; 90 + }; 91 + }; 92 + }; 93 + 94 + CPU1: cpu@100 { 95 + device_type = "cpu"; 96 + compatible = "qcom,kryo385"; 97 + reg = <0x0 0x100>; 98 + enable-method = "psci"; 99 + next-level-cache = <&L2_100>; 100 + qcom,freq-domain = <&cpufreq_hw 0>; 101 + L2_100: l2-cache { 102 + compatible = "cache"; 103 + next-level-cache = <&L3_0>; 104 + }; 105 + }; 106 + 107 + CPU2: cpu@200 { 108 + device_type = "cpu"; 109 + compatible = "qcom,kryo385"; 110 + reg = <0x0 0x200>; 111 + enable-method = "psci"; 112 + next-level-cache = <&L2_200>; 113 + qcom,freq-domain = <&cpufreq_hw 0>; 114 + L2_200: l2-cache { 115 + compatible = "cache"; 116 + next-level-cache = <&L3_0>; 117 + }; 118 + }; 119 + 120 + CPU3: cpu@300 { 121 + device_type = "cpu"; 122 + compatible = "qcom,kryo385"; 123 + reg = <0x0 0x300>; 124 + enable-method = "psci"; 125 + next-level-cache = <&L2_300>; 126 + qcom,freq-domain = <&cpufreq_hw 0>; 127 + L2_300: l2-cache { 128 + compatible = "cache"; 129 + next-level-cache = <&L3_0>; 130 + }; 131 + }; 132 + 133 + CPU4: cpu@400 { 134 + device_type = "cpu"; 135 + compatible = "qcom,kryo385"; 136 + reg = <0x0 0x400>; 137 + enable-method = "psci"; 138 + next-level-cache = <&L2_400>; 139 + qcom,freq-domain = <&cpufreq_hw 1>; 140 + L2_400: l2-cache { 141 + compatible = "cache"; 142 + next-level-cache = <&L3_0>; 143 + }; 144 + }; 145 + 146 + CPU5: cpu@500 { 147 + device_type = "cpu"; 148 + compatible = "qcom,kryo385"; 149 + reg = <0x0 0x500>; 150 + enable-method = "psci"; 151 + next-level-cache = <&L2_500>; 152 + qcom,freq-domain = <&cpufreq_hw 1>; 153 + L2_500: l2-cache { 154 + compatible = "cache"; 155 + next-level-cache = <&L3_0>; 156 + }; 157 + }; 158 + 159 + CPU6: cpu@600 { 160 + device_type = "cpu"; 161 + compatible = "qcom,kryo385"; 162 + reg = <0x0 0x600>; 163 + enable-method = "psci"; 164 + next-level-cache = <&L2_600>; 165 + qcom,freq-domain = <&cpufreq_hw 1>; 166 + L2_600: l2-cache { 167 + compatible = "cache"; 168 + next-level-cache = <&L3_0>; 169 + }; 170 + }; 171 + 172 + CPU7: cpu@700 { 173 + device_type = "cpu"; 174 + compatible = "qcom,kryo385"; 175 + reg = <0x0 0x700>; 176 + enable-method = "psci"; 177 + next-level-cache = <&L2_700>; 178 + qcom,freq-domain = <&cpufreq_hw 1>; 179 + L2_700: l2-cache { 180 + compatible = "cache"; 181 + next-level-cache = <&L3_0>; 182 + }; 183 + }; 184 + }; 185 + 186 + soc { 187 + #address-cells = <1>; 188 + #size-cells = <1>; 189 + 190 + cpufreq@17d43000 { 191 + compatible = "qcom,cpufreq-hw"; 192 + reg = <0x17d43000 0x1400>, <0x17d45800 0x1400>; 193 + reg-names = "freq-domain0", "freq-domain1"; 194 + 195 + clocks = <&rpmhcc RPMH_CXO_CLK>, <&gcc GPLL0>; 196 + clock-names = "xo", "alternate"; 197 + 198 + #freq-domain-cells = <1>; 199 + }; 200 + }; 201 + ...
+10 -4
Documentation/devicetree/bindings/dvfs/performance-domain.yaml
··· 52 52 53 53 examples: 54 54 - | 55 - performance: performance-controller@12340000 { 56 - compatible = "qcom,cpufreq-hw"; 57 - reg = <0x12340000 0x1000>; 58 - #performance-domain-cells = <1>; 55 + soc { 56 + #address-cells = <2>; 57 + #size-cells = <2>; 58 + 59 + performance: performance-controller@11bc00 { 60 + compatible = "mediatek,cpufreq-hw"; 61 + reg = <0 0x0011bc10 0 0x120>, <0 0x0011bd30 0 0x120>; 62 + 63 + #performance-domain-cells = <1>; 64 + }; 59 65 }; 60 66 61 67 // The node above defines a performance controller that is a performance
+16
arch/arm/boot/dts/imx7s.dtsi
··· 76 76 clock-latency = <61036>; /* two CLK32 periods */ 77 77 clocks = <&clks IMX7D_CLK_ARM>; 78 78 cpu-idle-states = <&cpu_sleep_wait>; 79 + operating-points-v2 = <&cpu0_opp_table>; 80 + #cooling-cells = <2>; 81 + nvmem-cells = <&fuse_grade>; 82 + nvmem-cell-names = "speed_grade"; 83 + }; 84 + }; 85 + 86 + cpu0_opp_table: opp-table { 87 + compatible = "operating-points-v2"; 88 + opp-shared; 89 + 90 + opp-792000000 { 91 + opp-hz = /bits/ 64 <792000000>; 92 + opp-microvolt = <1000000>; 93 + clock-latency-ns = <150000>; 94 + opp-supported-hw = <0xf>, <0xf>; 79 95 }; 80 96 }; 81 97
+21 -22
drivers/cpufreq/cppc_cpufreq.c
··· 303 303 304 304 /* 305 305 * If CPPC lowest_freq and nominal_freq registers are exposed then we can 306 - * use them to convert perf to freq and vice versa 307 - * 308 - * If the perf/freq point lies between Nominal and Lowest, we can treat 309 - * (Low perf, Low freq) and (Nom Perf, Nom freq) as 2D co-ordinates of a line 310 - * and extrapolate the rest 311 - * For perf/freq > Nominal, we use the ratio perf:freq at Nominal for conversion 306 + * use them to convert perf to freq and vice versa. The conversion is 307 + * extrapolated as an affine function passing by the 2 points: 308 + * - (Low perf, Low freq) 309 + * - (Nominal perf, Nominal perf) 312 310 */ 313 311 static unsigned int cppc_cpufreq_perf_to_khz(struct cppc_cpudata *cpu_data, 314 312 unsigned int perf) 315 313 { 316 314 struct cppc_perf_caps *caps = &cpu_data->perf_caps; 315 + s64 retval, offset = 0; 317 316 static u64 max_khz; 318 317 u64 mul, div; 319 318 320 319 if (caps->lowest_freq && caps->nominal_freq) { 321 - if (perf >= caps->nominal_perf) { 322 - mul = caps->nominal_freq; 323 - div = caps->nominal_perf; 324 - } else { 325 - mul = caps->nominal_freq - caps->lowest_freq; 326 - div = caps->nominal_perf - caps->lowest_perf; 327 - } 320 + mul = caps->nominal_freq - caps->lowest_freq; 321 + div = caps->nominal_perf - caps->lowest_perf; 322 + offset = caps->nominal_freq - div64_u64(caps->nominal_perf * mul, div); 328 323 } else { 329 324 if (!max_khz) 330 325 max_khz = cppc_get_dmi_max_khz(); 331 326 mul = max_khz; 332 327 div = caps->highest_perf; 333 328 } 334 - return (u64)perf * mul / div; 329 + 330 + retval = offset + div64_u64(perf * mul, div); 331 + if (retval >= 0) 332 + return retval; 333 + return 0; 335 334 } 336 335 337 336 static unsigned int cppc_cpufreq_khz_to_perf(struct cppc_cpudata *cpu_data, 338 337 unsigned int freq) 339 338 { 340 339 struct cppc_perf_caps *caps = &cpu_data->perf_caps; 340 + s64 retval, offset = 0; 341 341 static u64 max_khz; 342 342 u64 mul, div; 343 343 344 344 if (caps->lowest_freq && caps->nominal_freq) { 345 - if (freq >= caps->nominal_freq) { 346 - mul = caps->nominal_perf; 347 - div = caps->nominal_freq; 348 - } else { 349 - mul = caps->lowest_perf; 350 - div = caps->lowest_freq; 351 - } 345 + mul = caps->nominal_perf - caps->lowest_perf; 346 + div = caps->nominal_freq - caps->lowest_freq; 347 + offset = caps->nominal_perf - div64_u64(caps->nominal_freq * mul, div); 352 348 } else { 353 349 if (!max_khz) 354 350 max_khz = cppc_get_dmi_max_khz(); ··· 352 356 div = max_khz; 353 357 } 354 358 355 - return (u64)freq * mul / div; 359 + retval = offset + div64_u64(freq * mul, div); 360 + if (retval >= 0) 361 + return retval; 362 + return 0; 356 363 } 357 364 358 365 static int cppc_cpufreq_set_target(struct cpufreq_policy *policy,
+3
drivers/cpufreq/cpufreq-dt-platdev.c
··· 110 110 111 111 { .compatible = "fsl,imx7ulp", }, 112 112 { .compatible = "fsl,imx7d", }, 113 + { .compatible = "fsl,imx7s", }, 113 114 { .compatible = "fsl,imx8mq", }, 114 115 { .compatible = "fsl,imx8mm", }, 115 116 { .compatible = "fsl,imx8mn", }, ··· 139 138 { .compatible = "qcom,msm8996", }, 140 139 { .compatible = "qcom,qcs404", }, 141 140 { .compatible = "qcom,sa8155p" }, 141 + { .compatible = "qcom,sa8540p" }, 142 142 { .compatible = "qcom,sc7180", }, 143 143 { .compatible = "qcom,sc7280", }, 144 144 { .compatible = "qcom,sc8180x", }, 145 + { .compatible = "qcom,sc8280xp", }, 145 146 { .compatible = "qcom,sdm845", }, 146 147 { .compatible = "qcom,sm6350", }, 147 148 { .compatible = "qcom,sm8150", },
+19 -1
drivers/cpufreq/qcom-cpufreq-hw.c
··· 28 28 29 29 struct qcom_cpufreq_soc_data { 30 30 u32 reg_enable; 31 + u32 reg_dcvs_ctrl; 31 32 u32 reg_freq_lut; 32 33 u32 reg_volt_lut; 33 34 u32 reg_current_vote; ··· 51 50 bool cancel_throttle; 52 51 struct delayed_work throttle_work; 53 52 struct cpufreq_policy *policy; 53 + 54 + bool per_core_dcvs; 54 55 }; 55 56 56 57 static unsigned long cpu_hw_rate, xo_rate; ··· 105 102 struct qcom_cpufreq_data *data = policy->driver_data; 106 103 const struct qcom_cpufreq_soc_data *soc_data = data->soc_data; 107 104 unsigned long freq = policy->freq_table[index].frequency; 105 + unsigned int i; 108 106 109 107 writel_relaxed(index, data->base + soc_data->reg_perf_state); 108 + 109 + if (data->per_core_dcvs) 110 + for (i = 1; i < cpumask_weight(policy->related_cpus); i++) 111 + writel_relaxed(index, data->base + soc_data->reg_perf_state + i * 4); 110 112 111 113 if (icc_scaling_enabled) 112 114 qcom_cpufreq_set_bw(policy, freq); ··· 145 137 struct qcom_cpufreq_data *data = policy->driver_data; 146 138 const struct qcom_cpufreq_soc_data *soc_data = data->soc_data; 147 139 unsigned int index; 140 + unsigned int i; 148 141 149 142 index = policy->cached_resolved_idx; 150 143 writel_relaxed(index, data->base + soc_data->reg_perf_state); 144 + 145 + if (data->per_core_dcvs) 146 + for (i = 1; i < cpumask_weight(policy->related_cpus); i++) 147 + writel_relaxed(index, data->base + soc_data->reg_perf_state + i * 4); 151 148 152 149 return policy->freq_table[index].frequency; 153 150 } ··· 355 342 356 343 static const struct qcom_cpufreq_soc_data qcom_soc_data = { 357 344 .reg_enable = 0x0, 345 + .reg_dcvs_ctrl = 0xbc, 358 346 .reg_freq_lut = 0x110, 359 347 .reg_volt_lut = 0x114, 360 348 .reg_current_vote = 0x704, ··· 365 351 366 352 static const struct qcom_cpufreq_soc_data epss_soc_data = { 367 353 .reg_enable = 0x0, 354 + .reg_dcvs_ctrl = 0xb0, 368 355 .reg_freq_lut = 0x100, 369 356 .reg_volt_lut = 0x200, 370 357 .reg_perf_state = 0x320, ··· 496 481 goto error; 497 482 } 498 483 484 + if (readl_relaxed(base + data->soc_data->reg_dcvs_ctrl) & 0x1) 485 + data->per_core_dcvs = true; 486 + 499 487 qcom_get_related_cpus(index, policy->cpus); 500 - if (!cpumask_weight(policy->cpus)) { 488 + if (cpumask_empty(policy->cpus)) { 501 489 dev_err(dev, "Domain-%d failed to get related CPUs\n", index); 502 490 ret = -ENOENT; 503 491 goto error;
+1 -1
drivers/cpufreq/qcom-cpufreq-nvmem.c
··· 130 130 } 131 131 132 132 /* Check PVS_BLOW_STATUS */ 133 - pte_efuse = *(((u32 *)buf) + 4); 133 + pte_efuse = *(((u32 *)buf) + 1); 134 134 pte_efuse &= BIT(21); 135 135 if (pte_efuse) { 136 136 dev_dbg(cpu_dev, "PVS bin: %d\n", *pvs);
+1 -1
drivers/cpufreq/scmi-cpufreq.c
··· 154 154 * table and opp-shared. 155 155 */ 156 156 ret = dev_pm_opp_of_get_sharing_cpus(cpu_dev, priv->opp_shared_cpus); 157 - if (ret || !cpumask_weight(priv->opp_shared_cpus)) { 157 + if (ret || cpumask_empty(priv->opp_shared_cpus)) { 158 158 /* 159 159 * Either opp-table is not set or no opp-shared was found. 160 160 * Use the CPU mask from SCMI to designate CPUs sharing an OPP