Merge branches 'pm-cpuidle' and 'pm-powercap'

Merge cpuidle and power capping updates for 7.4:

 - Prevent cpuidle governors menu and teo from returning idle state 0
   after it has been disabled (Xueqin Luo)

 - Replace min_t() with the better alternatives in the intel_idle driver
   and make it use 2-argument strscpy() (Andy Shevchenko)

 - Fix two repeated phrase instances in cpuidle (Hemanth Selam, Syazwina
   Fazrul)

 - Add rugged Panther Lake support to the intel_rapl power capping
   driver and make it use %pe for printing error pointers (Srinivas
   Pandruvada and Sumeet Pawnikar)

* pm-cpuidle:
  Documentation: power/cpuidle: Fix repeating phrase
  cpuidle: tegra: fix repeated word 'that' in comment
  cpuidle: teo: Do not return a disabled idle state
  cpuidle: menu: Do not return a disabled idle state
  intel_idle: Use 2-argument strscpy()
  intel_idle: Replace min_t() with the better alternatives

* pm-powercap:
  powercap: intel_rapl: Use %pe to print error pointers symbolically
  powercap: intel_rapl: Add rugged Panther Lake support
This commit is contained in:
Rafael J. Wysocki 2026-10-19 14:43:43 +02:00
commit 2f0ba6f43a
6 changed files with 25 additions and 15 deletions

View File

@ -316,7 +316,7 @@ interval" value.
Now, the governor is ready to walk the list of idle states and choose one of
them. For this purpose, it compares the target residency of each state with
the predicted idle duration and the exit latency of it with the with the latency
the predicted idle duration and the exit latency of it with the latency
limit coming from the power management quality of service, or `PM QoS <cpu-pm-qos_>`_,
framework. It selects the state with the target residency closest to the predicted
idle duration, but still below it, and exit latency that does not exceed the

View File

@ -281,7 +281,7 @@ static int tegra114_enter_s2idle(struct cpuidle_device *dev,
* LP2 | C7 (CPU core power gating)
* LP2 | CC6 (CPU cluster power gating)
*
* Note that that the older CPUIDLE driver versions didn't explicitly
* Note that the older CPUIDLE driver versions didn't explicitly
* differentiate the LP2 states because these states either used the same
* code path or because CC6 wasn't supported.
*/

View File

@ -284,10 +284,10 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
data->bucket = BUCKETS - 1;
}
if (latency_req == 0 ||
((data->next_timer_ns < drv->states[1].target_residency_ns ||
latency_req < drv->states[1].exit_latency_ns) &&
!dev->states_usage[0].disable)) {
if (!dev->states_usage[0].disable &&
(latency_req == 0 ||
data->next_timer_ns < drv->states[1].target_residency_ns ||
latency_req < drv->states[1].exit_latency_ns)) {
/*
* In this case state[0] will be used no matter what, so return
* it right away and keep the tick running if state[0] is a

View File

@ -426,6 +426,17 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
}
}
/*
* If the latency constraint does not allow any of the enabled idle
* states to be used, the candidate state index will be capped to 0
* by the check below, but state 0 may be disabled. To prevent the
* selection of a disabled state in that case, ensure that
* constraint_idx is at least equal to the index of the first
* enabled idle state.
*/
if (constraint_idx < idx0)
constraint_idx = idx0;
/*
* If there is a latency constraint, it may be necessary to select an
* idle state shallower than the current candidate one.

View File

@ -1792,9 +1792,7 @@ static bool __init intel_idle_cst_usable(void)
{
int cstate, limit;
limit = min_t(int, min_t(int, CPUIDLE_STATE_MAX, max_cstate + 1),
acpi_state_table.count);
limit = min3(CPUIDLE_STATE_MAX, max_cstate + 1, acpi_state_table.count);
for (cstate = 1; cstate < limit; cstate++) {
struct acpi_processor_cx *cx = &acpi_state_table.states[cstate];
@ -1906,7 +1904,7 @@ static void __init intel_idle_init_cstates_acpi_lpi(struct cpuidle_driver *drv)
state = &drv->states[drv->state_count++];
scnprintf(state->name, CPUIDLE_NAME_LEN, "C%d_LPI", index + 1);
strscpy(state->desc, lpi_state->desc, CPUIDLE_DESC_LEN);
strscpy(state->desc, lpi_state->desc);
state->exit_latency = lpi_state->wake_latency;
state->target_residency = lpi_state->min_residency;
state->flags = MWAIT2flg(lpi_state->address);
@ -1938,7 +1936,7 @@ static void __init intel_idle_init_cstates_acpi_lpi(struct cpuidle_driver *drv)
static void __init intel_idle_init_cstates_acpi_cst(struct cpuidle_driver *drv)
{
int cstate, limit = min_t(int, CPUIDLE_STATE_MAX, acpi_state_table.count);
int cstate, limit = min(CPUIDLE_STATE_MAX, acpi_state_table.count);
/*
* If limit > 0, intel_idle_cst_usable() has returned 'true', so all of
@ -1956,7 +1954,7 @@ static void __init intel_idle_init_cstates_acpi_cst(struct cpuidle_driver *drv)
state = &drv->states[drv->state_count++];
snprintf(state->name, CPUIDLE_NAME_LEN, "C%d_ACPI", cstate);
strscpy(state->desc, cx->desc, CPUIDLE_DESC_LEN);
strscpy(state->desc, cx->desc);
state->exit_latency = cx->latency;
/*
* For C1-type C-states use the same number for both the exit
@ -2018,7 +2016,7 @@ static bool __init intel_idle_off_by_default_lpi(unsigned int flags, u32 mwait_h
static bool __init intel_idle_off_by_default_cst(unsigned int flags, u32 mwait_hint)
{
int cstate, limit = min_t(int, CPUIDLE_STATE_MAX, acpi_state_table.count);
int cstate, limit = min(CPUIDLE_STATE_MAX, acpi_state_table.count);
/*
* If limit > 0, intel_idle_cst_usable() has returned 'true', so all of

View File

@ -456,6 +456,7 @@ static const struct x86_cpu_id rapl_ids[] = {
X86_MATCH_VFM(INTEL_EMERALDRAPIDS_X, &rapl_defaults_spr_server),
X86_MATCH_VFM(INTEL_LUNARLAKE_M, &rapl_defaults_core),
X86_MATCH_VFM(INTEL_PANTHERLAKE_L, &rapl_defaults_core_pl4_pmu),
X86_MATCH_VFM(INTEL_PANTHERLAKE_R, &rapl_defaults_core_pl4_pmu),
X86_MATCH_VFM(INTEL_WILDCATLAKE_L, &rapl_defaults_core_pl4_pmu),
X86_MATCH_VFM(INTEL_NOVALAKE, &rapl_defaults_core_pl4),
X86_MATCH_VFM(INTEL_NOVALAKE_L, &rapl_defaults_core_pl4),
@ -582,8 +583,8 @@ static int intel_rapl_msr_init(void)
rapl_msr_platdev = platform_device_register_data(NULL, "intel_rapl_msr", 0, def,
sizeof(*def));
if (IS_ERR(rapl_msr_platdev))
pr_debug("intel_rapl_msr device register failed, ret:%ld\n",
PTR_ERR(rapl_msr_platdev));
pr_debug("intel_rapl_msr device register failed, ret:%pe\n",
rapl_msr_platdev);
return 0;
}