Skip to content

Commit c907ab5

Browse files
committed
Merge branches 'pm-powercap' and 'pm-tools'
Merge power capping changes and power management utilities updates for 6.9-rc1: - Address multiple issues in the TPMI RAPL driver and add support for new platforms (Lunar Lake-M, Arrow Lake) to Intel RAPL (Zhang Rui). - Fix freq_qos_add_request() return value check in dtpm_cpu (Daniel Lezcano). - Fix kernel-doc for dtpm_create_hierarchy() (Yang Li). - Fix file leak in get_pkg_num() in x86_energy_perf_policy (Samasth Norway Ananda). - Fix cpupower-frequency-info.1 man page typo (Jan Kratochvil). * pm-powercap: powercap: dtpm: Fix kernel-doc for dtpm_create_hierarchy() function powercap: dtpm_cpu: Fix error check against freq_qos_add_request() powercap: intel_rapl: Add support for Arrow Lake powercap: intel_rapl: Add support for Lunar Lake-M paltform powercap: intel_rapl_tpmi: Fix System Domain probing powercap: intel_rapl_tpmi: Fix a register bug powercap: intel_rapl: Fix locking in TPMI RAPL powercap: intel_rapl: Fix a NULL pointer dereference * pm-tools: Fix cpupower-frequency-info.1 man page typo tools/power x86_energy_perf_policy: Fix file leak in get_pkg_num()
3 parents 7a8d578 + 44c9cf9 + 3208a9a commit c907ab5

File tree

9 files changed

+66
-14
lines changed

9 files changed

+66
-14
lines changed

drivers/powercap/dtpm.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ static int dtpm_for_each_child(const struct dtpm_node *hierarchy,
522522

523523
/**
524524
* dtpm_create_hierarchy - Create the dtpm hierarchy
525-
* @hierarchy: An array of struct dtpm_node describing the hierarchy
525+
* @dtpm_match_table: Pointer to the array of device ID structures
526526
*
527527
* The function is called by the platform specific code with the
528528
* description of the different node in the hierarchy. It creates the

drivers/powercap/dtpm_cpu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ static int __dtpm_cpu_setup(int cpu, struct dtpm *parent)
219219
ret = freq_qos_add_request(&policy->constraints,
220220
&dtpm_cpu->qos_req, FREQ_QOS_MAX,
221221
pd->table[pd->nr_perf_states - 1].frequency);
222-
if (ret)
222+
if (ret < 0)
223223
goto out_dtpm_unregister;
224224

225225
cpufreq_cpu_put(policy);

drivers/powercap/intel_rapl_common.c

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
77

8+
#include <linux/cleanup.h>
89
#include <linux/kernel.h>
910
#include <linux/module.h>
1011
#include <linux/list.h>
@@ -759,6 +760,11 @@ static int rapl_config(struct rapl_package *rp)
759760
default:
760761
return -EINVAL;
761762
}
763+
764+
/* defaults_msr can be NULL on unsupported platforms */
765+
if (!rp->priv->defaults || !rp->priv->rpi)
766+
return -ENODEV;
767+
762768
return 0;
763769
}
764770

@@ -1256,6 +1262,8 @@ static const struct x86_cpu_id rapl_ids[] __initconst = {
12561262
X86_MATCH_INTEL_FAM6_MODEL(METEORLAKE_L, &rapl_defaults_core),
12571263
X86_MATCH_INTEL_FAM6_MODEL(SAPPHIRERAPIDS_X, &rapl_defaults_spr_server),
12581264
X86_MATCH_INTEL_FAM6_MODEL(EMERALDRAPIDS_X, &rapl_defaults_spr_server),
1265+
X86_MATCH_INTEL_FAM6_MODEL(LUNARLAKE_M, &rapl_defaults_core),
1266+
X86_MATCH_INTEL_FAM6_MODEL(ARROWLAKE, &rapl_defaults_core),
12591267
X86_MATCH_INTEL_FAM6_MODEL(LAKEFIELD, &rapl_defaults_core),
12601268

12611269
X86_MATCH_INTEL_FAM6_MODEL(ATOM_SILVERMONT, &rapl_defaults_byt),
@@ -1499,7 +1507,7 @@ static int rapl_detect_domains(struct rapl_package *rp)
14991507
}
15001508

15011509
/* called from CPU hotplug notifier, hotplug lock held */
1502-
void rapl_remove_package(struct rapl_package *rp)
1510+
void rapl_remove_package_cpuslocked(struct rapl_package *rp)
15031511
{
15041512
struct rapl_domain *rd, *rd_package = NULL;
15051513

@@ -1528,10 +1536,18 @@ void rapl_remove_package(struct rapl_package *rp)
15281536
list_del(&rp->plist);
15291537
kfree(rp);
15301538
}
1539+
EXPORT_SYMBOL_GPL(rapl_remove_package_cpuslocked);
1540+
1541+
void rapl_remove_package(struct rapl_package *rp)
1542+
{
1543+
guard(cpus_read_lock)();
1544+
rapl_remove_package_cpuslocked(rp);
1545+
}
15311546
EXPORT_SYMBOL_GPL(rapl_remove_package);
15321547

15331548
/* caller to ensure CPU hotplug lock is held */
1534-
struct rapl_package *rapl_find_package_domain(int id, struct rapl_if_priv *priv, bool id_is_cpu)
1549+
struct rapl_package *rapl_find_package_domain_cpuslocked(int id, struct rapl_if_priv *priv,
1550+
bool id_is_cpu)
15351551
{
15361552
struct rapl_package *rp;
15371553
int uid;
@@ -1549,10 +1565,17 @@ struct rapl_package *rapl_find_package_domain(int id, struct rapl_if_priv *priv,
15491565

15501566
return NULL;
15511567
}
1568+
EXPORT_SYMBOL_GPL(rapl_find_package_domain_cpuslocked);
1569+
1570+
struct rapl_package *rapl_find_package_domain(int id, struct rapl_if_priv *priv, bool id_is_cpu)
1571+
{
1572+
guard(cpus_read_lock)();
1573+
return rapl_find_package_domain_cpuslocked(id, priv, id_is_cpu);
1574+
}
15521575
EXPORT_SYMBOL_GPL(rapl_find_package_domain);
15531576

15541577
/* called from CPU hotplug notifier, hotplug lock held */
1555-
struct rapl_package *rapl_add_package(int id, struct rapl_if_priv *priv, bool id_is_cpu)
1578+
struct rapl_package *rapl_add_package_cpuslocked(int id, struct rapl_if_priv *priv, bool id_is_cpu)
15561579
{
15571580
struct rapl_package *rp;
15581581
int ret;
@@ -1598,6 +1621,13 @@ struct rapl_package *rapl_add_package(int id, struct rapl_if_priv *priv, bool id
15981621
kfree(rp);
15991622
return ERR_PTR(ret);
16001623
}
1624+
EXPORT_SYMBOL_GPL(rapl_add_package_cpuslocked);
1625+
1626+
struct rapl_package *rapl_add_package(int id, struct rapl_if_priv *priv, bool id_is_cpu)
1627+
{
1628+
guard(cpus_read_lock)();
1629+
return rapl_add_package_cpuslocked(id, priv, id_is_cpu);
1630+
}
16011631
EXPORT_SYMBOL_GPL(rapl_add_package);
16021632

16031633
static void power_limit_state_save(void)

drivers/powercap/intel_rapl_msr.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ static int rapl_cpu_online(unsigned int cpu)
7373
{
7474
struct rapl_package *rp;
7575

76-
rp = rapl_find_package_domain(cpu, rapl_msr_priv, true);
76+
rp = rapl_find_package_domain_cpuslocked(cpu, rapl_msr_priv, true);
7777
if (!rp) {
78-
rp = rapl_add_package(cpu, rapl_msr_priv, true);
78+
rp = rapl_add_package_cpuslocked(cpu, rapl_msr_priv, true);
7979
if (IS_ERR(rp))
8080
return PTR_ERR(rp);
8181
}
@@ -88,14 +88,14 @@ static int rapl_cpu_down_prep(unsigned int cpu)
8888
struct rapl_package *rp;
8989
int lead_cpu;
9090

91-
rp = rapl_find_package_domain(cpu, rapl_msr_priv, true);
91+
rp = rapl_find_package_domain_cpuslocked(cpu, rapl_msr_priv, true);
9292
if (!rp)
9393
return 0;
9494

9595
cpumask_clear_cpu(cpu, &rp->cpumask);
9696
lead_cpu = cpumask_first(&rp->cpumask);
9797
if (lead_cpu >= nr_cpu_ids)
98-
rapl_remove_package(rp);
98+
rapl_remove_package_cpuslocked(rp);
9999
else if (rp->lead_cpu == cpu)
100100
rp->lead_cpu = lead_cpu;
101101
return 0;

drivers/powercap/intel_rapl_tpmi.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ enum tpmi_rapl_register {
4040
TPMI_RAPL_REG_ENERGY_STATUS,
4141
TPMI_RAPL_REG_PERF_STATUS,
4242
TPMI_RAPL_REG_POWER_INFO,
43+
TPMI_RAPL_REG_DOMAIN_INFO,
4344
TPMI_RAPL_REG_INTERRUPT,
4445
TPMI_RAPL_REG_MAX = 15,
4546
};
@@ -130,6 +131,12 @@ static void trp_release(struct tpmi_rapl_package *trp)
130131
mutex_unlock(&tpmi_rapl_lock);
131132
}
132133

134+
/*
135+
* Bit 0 of TPMI_RAPL_REG_DOMAIN_INFO indicates if the current package is a domain
136+
* root or not. Only domain root packages can enumerate System (Psys) Domain.
137+
*/
138+
#define TPMI_RAPL_DOMAIN_ROOT BIT(0)
139+
133140
static int parse_one_domain(struct tpmi_rapl_package *trp, u32 offset)
134141
{
135142
u8 tpmi_domain_version;
@@ -139,6 +146,7 @@ static int parse_one_domain(struct tpmi_rapl_package *trp, u32 offset)
139146
enum rapl_domain_reg_id reg_id;
140147
int tpmi_domain_size, tpmi_domain_flags;
141148
u64 tpmi_domain_header = readq(trp->base + offset);
149+
u64 tpmi_domain_info;
142150

143151
/* Domain Parent bits are ignored for now */
144152
tpmi_domain_version = tpmi_domain_header & 0xff;
@@ -169,6 +177,13 @@ static int parse_one_domain(struct tpmi_rapl_package *trp, u32 offset)
169177
domain_type = RAPL_DOMAIN_PACKAGE;
170178
break;
171179
case TPMI_RAPL_DOMAIN_SYSTEM:
180+
if (!(tpmi_domain_flags & BIT(TPMI_RAPL_REG_DOMAIN_INFO))) {
181+
pr_warn(FW_BUG "System domain must support Domain Info register\n");
182+
return -ENODEV;
183+
}
184+
tpmi_domain_info = readq(trp->base + offset + TPMI_RAPL_REG_DOMAIN_INFO);
185+
if (!(tpmi_domain_info & TPMI_RAPL_DOMAIN_ROOT))
186+
return 0;
172187
domain_type = RAPL_DOMAIN_PLATFORM;
173188
break;
174189
case TPMI_RAPL_DOMAIN_MEMORY:

drivers/thermal/intel/int340x_thermal/processor_thermal_rapl.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ static int rapl_mmio_cpu_online(unsigned int cpu)
2727
if (topology_physical_package_id(cpu))
2828
return 0;
2929

30-
rp = rapl_find_package_domain(cpu, &rapl_mmio_priv, true);
30+
rp = rapl_find_package_domain_cpuslocked(cpu, &rapl_mmio_priv, true);
3131
if (!rp) {
32-
rp = rapl_add_package(cpu, &rapl_mmio_priv, true);
32+
rp = rapl_add_package_cpuslocked(cpu, &rapl_mmio_priv, true);
3333
if (IS_ERR(rp))
3434
return PTR_ERR(rp);
3535
}
@@ -42,14 +42,14 @@ static int rapl_mmio_cpu_down_prep(unsigned int cpu)
4242
struct rapl_package *rp;
4343
int lead_cpu;
4444

45-
rp = rapl_find_package_domain(cpu, &rapl_mmio_priv, true);
45+
rp = rapl_find_package_domain_cpuslocked(cpu, &rapl_mmio_priv, true);
4646
if (!rp)
4747
return 0;
4848

4949
cpumask_clear_cpu(cpu, &rp->cpumask);
5050
lead_cpu = cpumask_first(&rp->cpumask);
5151
if (lead_cpu >= nr_cpu_ids)
52-
rapl_remove_package(rp);
52+
rapl_remove_package_cpuslocked(rp);
5353
else if (rp->lead_cpu == cpu)
5454
rp->lead_cpu = lead_cpu;
5555
return 0;

include/linux/intel_rapl.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,12 @@ struct rapl_package {
178178
struct rapl_if_priv *priv;
179179
};
180180

181+
struct rapl_package *rapl_find_package_domain_cpuslocked(int id, struct rapl_if_priv *priv,
182+
bool id_is_cpu);
183+
struct rapl_package *rapl_add_package_cpuslocked(int id, struct rapl_if_priv *priv,
184+
bool id_is_cpu);
185+
void rapl_remove_package_cpuslocked(struct rapl_package *rp);
186+
181187
struct rapl_package *rapl_find_package_domain(int id, struct rapl_if_priv *priv, bool id_is_cpu);
182188
struct rapl_package *rapl_add_package(int id, struct rapl_if_priv *priv, bool id_is_cpu);
183189
void rapl_remove_package(struct rapl_package *rp);

tools/power/cpupower/man/cpupower-frequency-info.1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ Gets the currently used cpufreq policy.
3232
\fB\-g\fR \fB\-\-governors\fR
3333
Determines available cpufreq governors.
3434
.TP
35-
\fB\-a\fR \fB\-\-related\-cpus\fR
35+
\fB\-r\fR \fB\-\-related\-cpus\fR
3636
Determines which CPUs run at the same hardware frequency.
3737
.TP
3838
\fB\-a\fR \fB\-\-affected\-cpus\fR

tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,6 +1241,7 @@ unsigned int get_pkg_num(int cpu)
12411241
retval = fscanf(fp, "%d\n", &pkg);
12421242
if (retval != 1)
12431243
errx(1, "%s: failed to parse", pathname);
1244+
fclose(fp);
12441245
return pkg;
12451246
}
12461247

0 commit comments

Comments
 (0)