ARM cpufreq updates for 6.9

- zero initialize a cpumask (Marek Szyprowski).
 - Boost support for scmi cpufreq driver (Sibi Sankar).
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEx73Crsp7f6M6scA70rkcPK6BEhwFAmXz4jQACgkQ0rkcPK6B
 EhyudA//TXts7AyJcdrxe0YqT02LnD1KApRgvdZZGd1/LE16STjyKzpyLZ5RgTQa
 4lvrRrd/zKmxHFJU+WKh15zGiXNT3QvPXT2dZHM3ZzXxKKxvkzLIhpv81Q9d5y9b
 kEt8x9QQxCGBe5iXL0Dy1t0d4wJ3H/OqSxQmQluT6ge6ZPfb+C9NaxnR7rLaJlQf
 Yphvc9I4MBQdnnlYuYDfRzkmUSxi+oKudXbfKsVu2Qnirv/gi25ARmYlpvbA9Os5
 EP+A47O6+nf9PGJGqB/R67Mzb2l21Mo2WvyshIEDMmBZ3dBVMvL1ZNcputie3gxx
 qNfyOyE61dGp+lCj7QYpUMLvSAROnJSlucEIa5kanGUTbIsrn/Xx+5BJjbzQT/0W
 O9wjgaskTP4CgUh79mqHm4DFWNp4RWxMpeRMDn9fPx3r4PrX9klWWNgFAch4NLWf
 BssbnzoP8PF1m8780ZmCk811/SpvTBT8AbGlH8faNmhLewLDRCrnXsxCg5KEh5P6
 qfWDZihG0S6MuNgsSqS+Y5FsuYyLtrmiu1O7jviiN3FD0/3p3jVMRin9EOsVQY5i
 4WVI9Rf/K3YrZvka6zqBU+di8l32HncoEtRJhCreL+N1dBfKU974yl+rw4Oxv3Qp
 wZJz5tjCdWQWntfpMmU6mP0to607yvmGIE7ajAAE3g8i3mDsSu4=
 =miRv
 -----END PGP SIGNATURE-----

Merge tag 'cpufreq-arm-updates-6.9-2' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm

Merge more ARM cpufreq updates for 6.9 from Viresh Kumar:

"- zero initialize a cpumask (Marek Szyprowski).
 - Boost support for scmi cpufreq driver (Sibi Sankar)."

* tag 'cpufreq-arm-updates-6.9-2' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm:
  cpufreq: scmi: Enable boost support
  firmware: arm_scmi: Add support for marking certain frequencies as turbo
  cpufreq: dt: always allocate zeroed cpumask
This commit is contained in:
Rafael J. Wysocki 2024-03-15 13:12:26 +01:00
commit 11703c7611
3 changed files with 23 additions and 2 deletions

View file

@ -208,7 +208,7 @@ static int dt_cpufreq_early_init(struct device *dev, int cpu)
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;
if (!alloc_cpumask_var(&priv->cpus, GFP_KERNEL)) if (!zalloc_cpumask_var(&priv->cpus, GFP_KERNEL))
return -ENOMEM; return -ENOMEM;
cpumask_set_cpu(cpu, priv->cpus); cpumask_set_cpu(cpu, priv->cpus);

View file

@ -30,6 +30,7 @@ struct scmi_data {
static struct scmi_protocol_handle *ph; static struct scmi_protocol_handle *ph;
static const struct scmi_perf_proto_ops *perf_ops; static const struct scmi_perf_proto_ops *perf_ops;
static struct cpufreq_driver scmi_cpufreq_driver;
static unsigned int scmi_cpufreq_get_rate(unsigned int cpu) static unsigned int scmi_cpufreq_get_rate(unsigned int cpu)
{ {
@ -167,6 +168,12 @@ scmi_get_rate_limit(u32 domain, bool has_fast_switch)
return rate_limit; return rate_limit;
} }
static struct freq_attr *scmi_cpufreq_hw_attr[] = {
&cpufreq_freq_attr_scaling_available_freqs,
NULL,
NULL,
};
static int scmi_cpufreq_init(struct cpufreq_policy *policy) static int scmi_cpufreq_init(struct cpufreq_policy *policy)
{ {
int ret, nr_opp, domain; int ret, nr_opp, domain;
@ -276,6 +283,17 @@ static int scmi_cpufreq_init(struct cpufreq_policy *policy)
policy->transition_delay_us = policy->transition_delay_us =
scmi_get_rate_limit(domain, policy->fast_switch_possible); scmi_get_rate_limit(domain, policy->fast_switch_possible);
if (policy_has_boost_freq(policy)) {
ret = cpufreq_enable_boost_support();
if (ret) {
dev_warn(cpu_dev, "failed to enable boost: %d\n", ret);
goto out_free_opp;
} else {
scmi_cpufreq_hw_attr[1] = &cpufreq_freq_attr_scaling_boost_freqs;
scmi_cpufreq_driver.boost_enabled = true;
}
}
return 0; return 0;
out_free_opp: out_free_opp:
@ -334,7 +352,7 @@ static struct cpufreq_driver scmi_cpufreq_driver = {
CPUFREQ_NEED_INITIAL_FREQ_CHECK | CPUFREQ_NEED_INITIAL_FREQ_CHECK |
CPUFREQ_IS_COOLING_DEV, CPUFREQ_IS_COOLING_DEV,
.verify = cpufreq_generic_frequency_table_verify, .verify = cpufreq_generic_frequency_table_verify,
.attr = cpufreq_generic_attr, .attr = scmi_cpufreq_hw_attr,
.target_index = scmi_cpufreq_set_target, .target_index = scmi_cpufreq_set_target,
.fast_switch = scmi_cpufreq_fast_switch, .fast_switch = scmi_cpufreq_fast_switch,
.get = scmi_cpufreq_get_rate, .get = scmi_cpufreq_get_rate,

View file

@ -871,6 +871,9 @@ static int scmi_dvfs_device_opps_add(const struct scmi_protocol_handle *ph,
else else
freq = dom->opp[idx].indicative_freq * dom->mult_factor; freq = dom->opp[idx].indicative_freq * dom->mult_factor;
/* All OPPs above the sustained frequency are treated as turbo */
data.turbo = freq > dom->sustained_freq_khz * 1000;
data.level = dom->opp[idx].perf; data.level = dom->opp[idx].perf;
data.freq = freq; data.freq = freq;