Skip to content

Commit 4785aa8

Browse files
Oza Pawandeepwilldeacon
authored andcommitted
cpuidle, ACPI: Evaluate LPI arch_flags for broadcast timer
Arm® Functional Fixed Hardware Specification defines LPI states, which provide an architectural context loss flags field that can be used to describe the context that might be lost when an LPI state is entered. - Core context Lost - General purpose registers. - Floating point and SIMD registers. - System registers, include the System register based - generic timer for the core. - Debug register in the core power domain. - PMU registers in the core power domain. - Trace register in the core power domain. - Trace context loss - GICR - GICD Qualcomm's custom CPUs preserves the architectural state, including keeping the power domain for local timers active. when core is power gated, the local timers are sufficient to wake the core up without needing broadcast timer. The patch fixes the evaluation of cpuidle arch_flags, and moves only to broadcast timer if core context lost is defined in ACPI LPI. Fixes: a36a7fe ("ACPI / processor_idle: Add support for Low Power Idle(LPI) states") Reviewed-by: Sudeep Holla <sudeep.holla@arm.com> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Signed-off-by: Oza Pawandeep <quic_poza@quicinc.com> Link: https://lore.kernel.org/r/20231003173333.2865323-1-quic_poza@quicinc.com Signed-off-by: Will Deacon <will@kernel.org>
1 parent 471470b commit 4785aa8

File tree

3 files changed

+29
-2
lines changed

3 files changed

+29
-2
lines changed

arch/arm64/include/asm/acpi.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#ifndef _ASM_ACPI_H
1010
#define _ASM_ACPI_H
1111

12+
#include <linux/cpuidle.h>
1213
#include <linux/efi.h>
1314
#include <linux/memblock.h>
1415
#include <linux/psci.h>
@@ -44,6 +45,24 @@
4445

4546
#define ACPI_MADT_GICC_TRBE (offsetof(struct acpi_madt_generic_interrupt, \
4647
trbe_interrupt) + sizeof(u16))
48+
/*
49+
* Arm® Functional Fixed Hardware Specification Version 1.2.
50+
* Table 2: Arm Architecture context loss flags
51+
*/
52+
#define CPUIDLE_CORE_CTXT BIT(0) /* Core context Lost */
53+
54+
static inline unsigned int arch_get_idle_state_flags(u32 arch_flags)
55+
{
56+
if (arch_flags & CPUIDLE_CORE_CTXT)
57+
return CPUIDLE_FLAG_TIMER_STOP;
58+
59+
return 0;
60+
}
61+
#define arch_get_idle_state_flags arch_get_idle_state_flags
62+
63+
#define CPUIDLE_TRACE_CTXT BIT(1) /* Trace context loss */
64+
#define CPUIDLE_GICR_CTXT BIT(2) /* GICR */
65+
#define CPUIDLE_GICD_CTXT BIT(3) /* GICD */
4766

4867
/* Basic configuration for ACPI */
4968
#ifdef CONFIG_ACPI

drivers/acpi/processor_idle.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,8 +1217,7 @@ static int acpi_processor_setup_lpi_states(struct acpi_processor *pr)
12171217
strscpy(state->desc, lpi->desc, CPUIDLE_DESC_LEN);
12181218
state->exit_latency = lpi->wake_latency;
12191219
state->target_residency = lpi->min_residency;
1220-
if (lpi->arch_flags)
1221-
state->flags |= CPUIDLE_FLAG_TIMER_STOP;
1220+
state->flags |= arch_get_idle_state_flags(lpi->arch_flags);
12221221
if (i != 0 && lpi->entry_method == ACPI_CSTATE_FFH)
12231222
state->flags |= CPUIDLE_FLAG_RCU_IDLE;
12241223
state->enter = acpi_idle_lpi_enter;

include/linux/acpi.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,6 +1480,15 @@ static inline int lpit_read_residency_count_address(u64 *address)
14801480
}
14811481
#endif
14821482

1483+
#ifdef CONFIG_ACPI_PROCESSOR_IDLE
1484+
#ifndef arch_get_idle_state_flags
1485+
static inline unsigned int arch_get_idle_state_flags(u32 arch_flags)
1486+
{
1487+
return 0;
1488+
}
1489+
#endif
1490+
#endif /* CONFIG_ACPI_PROCESSOR_IDLE */
1491+
14831492
#ifdef CONFIG_ACPI_PPTT
14841493
int acpi_pptt_cpu_is_thread(unsigned int cpu);
14851494
int find_acpi_cpu_topology(unsigned int cpu, int level);

0 commit comments

Comments
 (0)