Skip to content

Commit 5786ef8

Browse files
committed
Merge tag 'cpufreq-arm-fixes-6.15-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm
Merge ARM cpufreq fixes for 6.15-rc from Viresh Kumar: "- Fix possible out-of-bound / null-ptr-deref in drivers (Andre Przywara and Henry Martin). - Fix Kconfig issues with compile-test (Johan Hovold and Krzysztof Kozlowski). - Fix invalid return value in .get() (Marc Zyngier). - Add SM8650 to cpufreq-dt-platdev blocklist (Pengyu Luo)." * tag 'cpufreq-arm-fixes-6.15-rc' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm: cpufreq: fix compile-test defaults cpufreq: cppc: Fix invalid return value in .get() callback cpufreq: scpi: Fix null-ptr-deref in scpi_cpufreq_get_rate() cpufreq: scmi: Fix null-ptr-deref in scmi_cpufreq_get_rate() cpufreq: apple-soc: Fix null-ptr-deref in apple_soc_cpufreq_get_rate() cpufreq: Do not enable by default during compile testing cpufreq: Add SM8650 to cpufreq-dt-platdev blocklist cpufreq: sun50i: prevent out-of-bounds access
2 parents 9d7a057 + a374f28 commit 5786ef8

File tree

7 files changed

+50
-24
lines changed

7 files changed

+50
-24
lines changed

drivers/cpufreq/Kconfig.arm

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ config ARM_VEXPRESS_SPC_CPUFREQ
7676
config ARM_BRCMSTB_AVS_CPUFREQ
7777
tristate "Broadcom STB AVS CPUfreq driver"
7878
depends on (ARCH_BRCMSTB && !ARM_SCMI_CPUFREQ) || COMPILE_TEST
79-
default y
79+
default y if ARCH_BRCMSTB && !ARM_SCMI_CPUFREQ
8080
help
8181
Some Broadcom STB SoCs use a co-processor running proprietary firmware
8282
("AVS") to handle voltage and frequency scaling. This driver provides
@@ -88,7 +88,7 @@ config ARM_HIGHBANK_CPUFREQ
8888
tristate "Calxeda Highbank-based"
8989
depends on ARCH_HIGHBANK || COMPILE_TEST
9090
depends on CPUFREQ_DT && REGULATOR && PL320_MBOX
91-
default m
91+
default m if ARCH_HIGHBANK
9292
help
9393
This adds the CPUFreq driver for Calxeda Highbank SoC
9494
based boards.
@@ -133,7 +133,7 @@ config ARM_MEDIATEK_CPUFREQ
133133
config ARM_MEDIATEK_CPUFREQ_HW
134134
tristate "MediaTek CPUFreq HW driver"
135135
depends on ARCH_MEDIATEK || COMPILE_TEST
136-
default m
136+
default m if ARCH_MEDIATEK
137137
help
138138
Support for the CPUFreq HW driver.
139139
Some MediaTek chipsets have a HW engine to offload the steps
@@ -181,7 +181,7 @@ config ARM_RASPBERRYPI_CPUFREQ
181181
config ARM_S3C64XX_CPUFREQ
182182
bool "Samsung S3C64XX"
183183
depends on CPU_S3C6410 || COMPILE_TEST
184-
default y
184+
default CPU_S3C6410
185185
help
186186
This adds the CPUFreq driver for Samsung S3C6410 SoC.
187187

@@ -190,7 +190,7 @@ config ARM_S3C64XX_CPUFREQ
190190
config ARM_S5PV210_CPUFREQ
191191
bool "Samsung S5PV210 and S5PC110"
192192
depends on CPU_S5PV210 || COMPILE_TEST
193-
default y
193+
default CPU_S5PV210
194194
help
195195
This adds the CPUFreq driver for Samsung S5PV210 and
196196
S5PC110 SoCs.
@@ -214,7 +214,7 @@ config ARM_SCMI_CPUFREQ
214214
config ARM_SPEAR_CPUFREQ
215215
bool "SPEAr CPUFreq support"
216216
depends on PLAT_SPEAR || COMPILE_TEST
217-
default y
217+
default PLAT_SPEAR
218218
help
219219
This adds the CPUFreq driver support for SPEAr SOCs.
220220

@@ -233,15 +233,15 @@ config ARM_TEGRA20_CPUFREQ
233233
tristate "Tegra20/30 CPUFreq support"
234234
depends on ARCH_TEGRA || COMPILE_TEST
235235
depends on CPUFREQ_DT
236-
default y
236+
default ARCH_TEGRA
237237
help
238238
This adds the CPUFreq driver support for Tegra20/30 SOCs.
239239

240240
config ARM_TEGRA124_CPUFREQ
241241
bool "Tegra124 CPUFreq support"
242242
depends on ARCH_TEGRA || COMPILE_TEST
243243
depends on CPUFREQ_DT
244-
default y
244+
default ARCH_TEGRA
245245
help
246246
This adds the CPUFreq driver support for Tegra124 SOCs.
247247

@@ -256,14 +256,14 @@ config ARM_TEGRA194_CPUFREQ
256256
tristate "Tegra194 CPUFreq support"
257257
depends on ARCH_TEGRA_194_SOC || ARCH_TEGRA_234_SOC || (64BIT && COMPILE_TEST)
258258
depends on TEGRA_BPMP
259-
default y
259+
default ARCH_TEGRA_194_SOC || ARCH_TEGRA_234_SOC
260260
help
261261
This adds CPU frequency driver support for Tegra194 SOCs.
262262

263263
config ARM_TI_CPUFREQ
264264
bool "Texas Instruments CPUFreq support"
265265
depends on ARCH_OMAP2PLUS || ARCH_K3 || COMPILE_TEST
266-
default y
266+
default ARCH_OMAP2PLUS || ARCH_K3
267267
help
268268
This driver enables valid OPPs on the running platform based on
269269
values contained within the SoC in use. Enable this in order to

drivers/cpufreq/apple-soc-cpufreq.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,17 @@ static const struct of_device_id apple_soc_cpufreq_of_match[] __maybe_unused = {
134134

135135
static unsigned int apple_soc_cpufreq_get_rate(unsigned int cpu)
136136
{
137-
struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu);
138-
struct apple_cpu_priv *priv = policy->driver_data;
137+
struct cpufreq_policy *policy;
138+
struct apple_cpu_priv *priv;
139139
struct cpufreq_frequency_table *p;
140140
unsigned int pstate;
141141

142+
policy = cpufreq_cpu_get_raw(cpu);
143+
if (unlikely(!policy))
144+
return 0;
145+
146+
priv = policy->driver_data;
147+
142148
if (priv->info->cur_pstate_mask) {
143149
u32 reg = readl_relaxed(priv->reg_base + APPLE_DVFS_STATUS);
144150

drivers/cpufreq/cppc_cpufreq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -747,7 +747,7 @@ static unsigned int cppc_cpufreq_get_rate(unsigned int cpu)
747747
int ret;
748748

749749
if (!policy)
750-
return -ENODEV;
750+
return 0;
751751

752752
cpu_data = policy->driver_data;
753753

drivers/cpufreq/cpufreq-dt-platdev.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ static const struct of_device_id blocklist[] __initconst = {
175175
{ .compatible = "qcom,sm8350", },
176176
{ .compatible = "qcom,sm8450", },
177177
{ .compatible = "qcom,sm8550", },
178+
{ .compatible = "qcom,sm8650", },
178179

179180
{ .compatible = "st,stih407", },
180181
{ .compatible = "st,stih410", },

drivers/cpufreq/scmi-cpufreq.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,17 @@ static struct cpufreq_driver scmi_cpufreq_driver;
3737

3838
static unsigned int scmi_cpufreq_get_rate(unsigned int cpu)
3939
{
40-
struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu);
41-
struct scmi_data *priv = policy->driver_data;
40+
struct cpufreq_policy *policy;
41+
struct scmi_data *priv;
4242
unsigned long rate;
4343
int ret;
4444

45+
policy = cpufreq_cpu_get_raw(cpu);
46+
if (unlikely(!policy))
47+
return 0;
48+
49+
priv = policy->driver_data;
50+
4551
ret = perf_ops->freq_get(ph, priv->domain_id, &rate, false);
4652
if (ret)
4753
return 0;

drivers/cpufreq/scpi-cpufreq.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,16 @@ static struct scpi_ops *scpi_ops;
2929

3030
static unsigned int scpi_cpufreq_get_rate(unsigned int cpu)
3131
{
32-
struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu);
33-
struct scpi_data *priv = policy->driver_data;
34-
unsigned long rate = clk_get_rate(priv->clk);
32+
struct cpufreq_policy *policy;
33+
struct scpi_data *priv;
34+
unsigned long rate;
35+
36+
policy = cpufreq_cpu_get_raw(cpu);
37+
if (unlikely(!policy))
38+
return 0;
39+
40+
priv = policy->driver_data;
41+
rate = clk_get_rate(priv->clk);
3542

3643
return rate / 1000;
3744
}

drivers/cpufreq/sun50i-cpufreq-nvmem.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,9 @@ static int sun50i_cpufreq_get_efuse(void)
194194
struct nvmem_cell *speedbin_nvmem;
195195
const struct of_device_id *match;
196196
struct device *cpu_dev;
197-
u32 *speedbin;
197+
void *speedbin_ptr;
198+
u32 speedbin = 0;
199+
size_t len;
198200
int ret;
199201

200202
cpu_dev = get_cpu_device(0);
@@ -217,14 +219,18 @@ static int sun50i_cpufreq_get_efuse(void)
217219
return dev_err_probe(cpu_dev, PTR_ERR(speedbin_nvmem),
218220
"Could not get nvmem cell\n");
219221

220-
speedbin = nvmem_cell_read(speedbin_nvmem, NULL);
222+
speedbin_ptr = nvmem_cell_read(speedbin_nvmem, &len);
221223
nvmem_cell_put(speedbin_nvmem);
222-
if (IS_ERR(speedbin))
223-
return PTR_ERR(speedbin);
224+
if (IS_ERR(speedbin_ptr))
225+
return PTR_ERR(speedbin_ptr);
224226

225-
ret = opp_data->efuse_xlate(*speedbin);
227+
if (len <= 4)
228+
memcpy(&speedbin, speedbin_ptr, len);
229+
speedbin = le32_to_cpu(speedbin);
226230

227-
kfree(speedbin);
231+
ret = opp_data->efuse_xlate(speedbin);
232+
233+
kfree(speedbin_ptr);
228234

229235
return ret;
230236
};

0 commit comments

Comments
 (0)