Skip to content

Commit f4b9d3b

Browse files
committed
Merge tag 'pm-6.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull power management updates from Rafael Wysocki: "The majority of changes here are cpufreq updates which are dominated by amd-pstate driver changes, like in the previous cycle. Moreover, changes related to amd-pstate are also the majority of cpupower utility updates. Included are some pieces of new hardware support, like the addition of Clearwater Forest processors support to intel_idle, new cpufreq driver for Airoha SoCs, and Apple cpufreq driver extensions to support more SoCs. The intel_pstate driver is also extended to be able to support new platforms by using ACPI CPPC to compute scaling factors between HWP performance states and frequency. The rest is mostly fixes and cleanups in assorted pieces of power management code. Specifics: - Use str_enable_disable()-like helpers in cpufreq (Krzysztof Kozlowski) - Extend the Apple cpufreq driver to support more SoCs (Hector Martin, Nick Chan) - Add new cpufreq driver for Airoha SoCs (Christian Marangi) - Fix using cpufreq-dt as module (Andreas Kemnade) - Minor fixes for Sparc, SCMI, and Qcom cpufreq drivers (Ethan Carter Edwards, Sibi Sankar, Manivannan Sadhasivam) - Fix the maximum supported frequency computation in the ACPI cpufreq driver to avoid relying on unfounded assumptions (Gautham Shenoy) - Fix an amd-pstate driver regression with preferred core rankings not being used (Mario Limonciello) - Fix a precision issue with frequency calculation in the amd-pstate driver (Naresh Solanki) - Add ftrace event to the amd-pstate driver for active mode (Mario Limonciello) - Set default EPP policy on Ryzen processors in amd-pstate (Mario Limonciello) - Clean up the amd-pstate cpufreq driver and optimize it to increase code reuse (Mario Limonciello, Dhananjay Ugwekar) - Use CPPC to get scaling factors between HWP performance levels and frequency in the intel_pstate driver and make it stop using a built-in scaling factor for Arrow Lake processors (Rafael Wysocki) - Make intel_pstate initialize epp_policy to CPUFREQ_POLICY_UNKNOWN for consistency with CPU offline (Christian Loehle) - Fix superfluous updates caused by need_freq_update in the schedutil cpufreq governor (Sultan Alsawaf) - Allow configuring the system suspend-resume (DPM) watchdog to warn earlier than panic (Douglas Anderson) - Implement devm_device_init_wakeup() helper and introduce a device- managed variant of dev_pm_set_wake_irq() (Joe Hattori, Peng Fan) - Remove direct inclusions of 'pm_wakeup.h' which should be only included via 'device.h' (Wolfram Sang) - Clean up two comments in the core system-wide PM code (Rafael Wysocki, Randy Dunlap) - Add Clearwater Forest processor support to the intel_idle cpuidle driver (Artem Bityutskiy) - Clean up the Exynos devfreq driver and devfreq core (Markus Elfring, Jeongjun Park) - Minor cleanups and fixes for OPP (Dan Carpenter, Neil Armstrong, Joe Hattori) - Implement dev_pm_opp_get_bw() (Neil Armstrong) - Expose OPP reference counting helpers for Rust (Viresh Kumar) - Fix TSC MHz calculation in cpupower (He Rongguang) - Add install and uninstall options to bindings Makefile and add header changes for cpufreq.h to SWIG bindings in cpupower (John B. Wyatt IV) - Add missing residency header changes in cpuidle.h to SWIG bindings in cpupower (John B. Wyatt IV) - Add output files to .gitignore and clean them up in "make clean" in selftests/cpufreq (Li Zhijian) - Fix cross-compilation in cpupower Makefile (Peng Fan) - Revise the is_valid flag handling for idle_monitor in the cpupower utility (wangfushuai) - Extend and clean up AMD processors support in cpupower (Mario Limonciello)" * tag 'pm-6.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (67 commits) PM / OPP: Add reference counting helpers for Rust implementation PM: sleep: wakeirq: Introduce device-managed variant of dev_pm_set_wake_irq() cpufreq: Use str_enable_disable()-like helpers cpufreq: airoha: Add EN7581 CPUFreq SMCCC driver PM: sleep: Allow configuring the DPM watchdog to warn earlier than panic PM: sleep: convert comment from kernel-doc to plain comment cpufreq: ACPI: Fix max-frequency computation pm: cpupower: Add missing residency header changes in cpuidle.h to SWIG PM / devfreq: exynos: remove unused function parameter OPP: OF: Fix an OF node leak in _opp_add_static_v2() cpufreq/amd-pstate: Refactor max frequency calculation cpufreq/amd-pstate: Fix prefcore rankings pm: cpupower: Add header changes for cpufreq.h to SWIG bindings cpufreq: sparc: change kzalloc to kcalloc cpufreq: qcom: Implement clk_ops::determine_rate() for qcom_cpufreq* clocks cpufreq: qcom: Fix qcom_cpufreq_hw_recalc_rate() to query LUT if LMh IRQ is not available cpufreq: apple-soc: Add Apple A7-A8X SoC cpufreq support cpufreq: apple-soc: Set fallback transition latency to APPLE_DVFS_TRANSITION_TIMEOUT cpufreq: apple-soc: Increase cluster switch timeout to 400us cpufreq: apple-soc: Use 32-bit read for status register ...
2 parents df60eac + 1c91c99 commit f4b9d3b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+972
-413
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2+
%YAML 1.2
3+
---
4+
$id: http://devicetree.org/schemas/cpufreq/airoha,en7581-cpufreq.yaml#
5+
$schema: http://devicetree.org/meta-schemas/core.yaml#
6+
7+
title: Airoha EN7581 CPUFreq
8+
9+
maintainers:
10+
- Christian Marangi <[email protected]>
11+
12+
description: |
13+
On newer Airoha SoC, CPU Frequency is scaled indirectly with SMC commands
14+
to ATF.
15+
16+
A virtual clock is exposed. This virtual clock is a get-only clock and
17+
is used to expose the current global CPU clock. The frequency info comes
18+
by the output of the SMC command that reports the clock in MHz.
19+
20+
The SMC sets the CPU clock by providing an index, this is modelled as
21+
performance states in a power domain.
22+
23+
CPUs can't be individually scaled as the CPU frequency is shared across
24+
all CPUs and is global.
25+
26+
properties:
27+
compatible:
28+
const: airoha,en7581-cpufreq
29+
30+
'#clock-cells':
31+
const: 0
32+
33+
'#power-domain-cells':
34+
const: 0
35+
36+
operating-points-v2: true
37+
38+
required:
39+
- compatible
40+
- '#clock-cells'
41+
- '#power-domain-cells'
42+
- operating-points-v2
43+
44+
additionalProperties: false
45+
46+
examples:
47+
- |
48+
performance-domain {
49+
compatible = "airoha,en7581-cpufreq";
50+
51+
operating-points-v2 = <&cpu_smcc_opp_table>;
52+
53+
#power-domain-cells = <0>;
54+
#clock-cells = <0>;
55+
};

Documentation/devicetree/bindings/cpufreq/apple,cluster-cpufreq.yaml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,17 @@ properties:
2424
- apple,t8112-cluster-cpufreq
2525
- const: apple,cluster-cpufreq
2626
- items:
27-
- const: apple,t6000-cluster-cpufreq
27+
- enum:
28+
- apple,s8000-cluster-cpufreq
29+
- apple,t8010-cluster-cpufreq
30+
- apple,t8015-cluster-cpufreq
31+
- apple,t6000-cluster-cpufreq
2832
- const: apple,t8103-cluster-cpufreq
2933
- const: apple,cluster-cpufreq
34+
- items:
35+
- const: apple,t7000-cluster-cpufreq
36+
- const: apple,s5l8960x-cluster-cpufreq
37+
- const: apple,s5l8960x-cluster-cpufreq
3038

3139
reg:
3240
maxItems: 1

drivers/base/power/main.c

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,7 @@ struct dpm_watchdog {
496496
struct device *dev;
497497
struct task_struct *tsk;
498498
struct timer_list timer;
499+
bool fatal;
499500
};
500501

501502
#define DECLARE_DPM_WATCHDOG_ON_STACK(wd) \
@@ -512,11 +513,23 @@ struct dpm_watchdog {
512513
static void dpm_watchdog_handler(struct timer_list *t)
513514
{
514515
struct dpm_watchdog *wd = from_timer(wd, t, timer);
516+
struct timer_list *timer = &wd->timer;
517+
unsigned int time_left;
518+
519+
if (wd->fatal) {
520+
dev_emerg(wd->dev, "**** DPM device timeout ****\n");
521+
show_stack(wd->tsk, NULL, KERN_EMERG);
522+
panic("%s %s: unrecoverable failure\n",
523+
dev_driver_string(wd->dev), dev_name(wd->dev));
524+
}
525+
526+
time_left = CONFIG_DPM_WATCHDOG_TIMEOUT - CONFIG_DPM_WATCHDOG_WARNING_TIMEOUT;
527+
dev_warn(wd->dev, "**** DPM device timeout after %u seconds; %u seconds until panic ****\n",
528+
CONFIG_DPM_WATCHDOG_WARNING_TIMEOUT, time_left);
529+
show_stack(wd->tsk, NULL, KERN_WARNING);
515530

516-
dev_emerg(wd->dev, "**** DPM device timeout ****\n");
517-
show_stack(wd->tsk, NULL, KERN_EMERG);
518-
panic("%s %s: unrecoverable failure\n",
519-
dev_driver_string(wd->dev), dev_name(wd->dev));
531+
wd->fatal = true;
532+
mod_timer(timer, jiffies + HZ * time_left);
520533
}
521534

522535
/**
@@ -530,10 +543,11 @@ static void dpm_watchdog_set(struct dpm_watchdog *wd, struct device *dev)
530543

531544
wd->dev = dev;
532545
wd->tsk = current;
546+
wd->fatal = CONFIG_DPM_WATCHDOG_TIMEOUT == CONFIG_DPM_WATCHDOG_WARNING_TIMEOUT;
533547

534548
timer_setup_on_stack(timer, dpm_watchdog_handler, 0);
535549
/* use same timeout value for both suspend and resume */
536-
timer->expires = jiffies + HZ * CONFIG_DPM_WATCHDOG_TIMEOUT;
550+
timer->expires = jiffies + HZ * CONFIG_DPM_WATCHDOG_WARNING_TIMEOUT;
537551
add_timer(timer);
538552
}
539553

@@ -914,7 +928,7 @@ static void device_resume(struct device *dev, pm_message_t state, bool async)
914928
goto Complete;
915929

916930
if (dev->power.direct_complete) {
917-
/* Match the pm_runtime_disable() in __device_suspend(). */
931+
/* Match the pm_runtime_disable() in device_suspend(). */
918932
pm_runtime_enable(dev);
919933
goto Complete;
920934
}

drivers/base/power/sysfs.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
#include <linux/export.h>
77
#include <linux/pm_qos.h>
88
#include <linux/pm_runtime.h>
9-
#include <linux/pm_wakeup.h>
109
#include <linux/atomic.h>
1110
#include <linux/jiffies.h>
1211
#include "power.h"

drivers/base/power/wakeirq.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,32 @@ void dev_pm_clear_wake_irq(struct device *dev)
103103
}
104104
EXPORT_SYMBOL_GPL(dev_pm_clear_wake_irq);
105105

106+
static void devm_pm_clear_wake_irq(void *dev)
107+
{
108+
dev_pm_clear_wake_irq(dev);
109+
}
110+
111+
/**
112+
* devm_pm_set_wake_irq - device-managed variant of dev_pm_set_wake_irq
113+
* @dev: Device entry
114+
* @irq: Device IO interrupt
115+
*
116+
*
117+
* Attach a device IO interrupt as a wake IRQ, same with dev_pm_set_wake_irq,
118+
* but the device will be auto clear wake capability on driver detach.
119+
*/
120+
int devm_pm_set_wake_irq(struct device *dev, int irq)
121+
{
122+
int ret;
123+
124+
ret = dev_pm_set_wake_irq(dev, irq);
125+
if (ret)
126+
return ret;
127+
128+
return devm_add_action_or_reset(dev, devm_pm_clear_wake_irq, dev);
129+
}
130+
EXPORT_SYMBOL_GPL(devm_pm_set_wake_irq);
131+
106132
/**
107133
* handle_threaded_wake_irq - Handler for dedicated wake-up interrupts
108134
* @irq: Device specific dedicated wake-up interrupt

drivers/cpufreq/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ config CPUFREQ_VIRT
232232
If in doubt, say N.
233233

234234
config CPUFREQ_DT_PLATDEV
235-
tristate "Generic DT based cpufreq platdev driver"
235+
bool "Generic DT based cpufreq platdev driver"
236236
depends on OF
237237
help
238238
This adds a generic DT based cpufreq platdev driver for frequency

drivers/cpufreq/Kconfig.arm

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@ config ARM_ALLWINNER_SUN50I_CPUFREQ_NVMEM
1515
To compile this driver as a module, choose M here: the
1616
module will be called sun50i-cpufreq-nvmem.
1717

18+
config ARM_AIROHA_SOC_CPUFREQ
19+
tristate "Airoha EN7581 SoC CPUFreq support"
20+
depends on ARCH_AIROHA || COMPILE_TEST
21+
select PM_OPP
22+
default ARCH_AIROHA
23+
help
24+
This adds the CPUFreq driver for Airoha EN7581 SoCs.
25+
1826
config ARM_APPLE_SOC_CPUFREQ
1927
tristate "Apple Silicon SoC CPUFreq support"
2028
depends on ARCH_APPLE || (COMPILE_TEST && 64BIT)

drivers/cpufreq/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ obj-$(CONFIG_X86_AMD_FREQ_SENSITIVITY) += amd_freq_sensitivity.o
5353

5454
##################################################################################
5555
# ARM SoC drivers
56+
obj-$(CONFIG_ARM_AIROHA_SOC_CPUFREQ) += airoha-cpufreq.o
5657
obj-$(CONFIG_ARM_APPLE_SOC_CPUFREQ) += apple-soc-cpufreq.o
5758
obj-$(CONFIG_ARM_ARMADA_37XX_CPUFREQ) += armada-37xx-cpufreq.o
5859
obj-$(CONFIG_ARM_ARMADA_8K_CPUFREQ) += armada-8k-cpufreq.o

drivers/cpufreq/acpi-cpufreq.c

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,14 @@ static int acpi_cpufreq_blacklist(struct cpuinfo_x86 *c)
623623
#endif
624624

625625
#ifdef CONFIG_ACPI_CPPC_LIB
626-
static u64 get_max_boost_ratio(unsigned int cpu)
626+
/*
627+
* get_max_boost_ratio: Computes the max_boost_ratio as the ratio
628+
* between the highest_perf and the nominal_perf.
629+
*
630+
* Returns the max_boost_ratio for @cpu. Returns the CPPC nominal
631+
* frequency via @nominal_freq if it is non-NULL pointer.
632+
*/
633+
static u64 get_max_boost_ratio(unsigned int cpu, u64 *nominal_freq)
627634
{
628635
struct cppc_perf_caps perf_caps;
629636
u64 highest_perf, nominal_perf;
@@ -652,6 +659,9 @@ static u64 get_max_boost_ratio(unsigned int cpu)
652659

653660
nominal_perf = perf_caps.nominal_perf;
654661

662+
if (nominal_freq)
663+
*nominal_freq = perf_caps.nominal_freq;
664+
655665
if (!highest_perf || !nominal_perf) {
656666
pr_debug("CPU%d: highest or nominal performance missing\n", cpu);
657667
return 0;
@@ -664,8 +674,12 @@ static u64 get_max_boost_ratio(unsigned int cpu)
664674

665675
return div_u64(highest_perf << SCHED_CAPACITY_SHIFT, nominal_perf);
666676
}
677+
667678
#else
668-
static inline u64 get_max_boost_ratio(unsigned int cpu) { return 0; }
679+
static inline u64 get_max_boost_ratio(unsigned int cpu, u64 *nominal_freq)
680+
{
681+
return 0;
682+
}
669683
#endif
670684

671685
static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
@@ -675,9 +689,9 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
675689
struct acpi_cpufreq_data *data;
676690
unsigned int cpu = policy->cpu;
677691
struct cpuinfo_x86 *c = &cpu_data(cpu);
692+
u64 max_boost_ratio, nominal_freq = 0;
678693
unsigned int valid_states = 0;
679694
unsigned int result = 0;
680-
u64 max_boost_ratio;
681695
unsigned int i;
682696
#ifdef CONFIG_SMP
683697
static int blacklisted;
@@ -827,16 +841,20 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
827841
}
828842
freq_table[valid_states].frequency = CPUFREQ_TABLE_END;
829843

830-
max_boost_ratio = get_max_boost_ratio(cpu);
844+
max_boost_ratio = get_max_boost_ratio(cpu, &nominal_freq);
831845
if (max_boost_ratio) {
832-
unsigned int freq = freq_table[0].frequency;
846+
unsigned int freq = nominal_freq;
833847

834848
/*
835-
* Because the loop above sorts the freq_table entries in the
836-
* descending order, freq is the maximum frequency in the table.
837-
* Assume that it corresponds to the CPPC nominal frequency and
838-
* use it to set cpuinfo.max_freq.
849+
* The loop above sorts the freq_table entries in the
850+
* descending order. If ACPI CPPC has not advertised
851+
* the nominal frequency (this is possible in CPPC
852+
* revisions prior to 3), then use the first entry in
853+
* the pstate table as a proxy for nominal frequency.
839854
*/
855+
if (!freq)
856+
freq = freq_table[0].frequency;
857+
840858
policy->cpuinfo.max_freq = freq * max_boost_ratio >> SCHED_CAPACITY_SHIFT;
841859
} else {
842860
/*

0 commit comments

Comments
 (0)