File Index
Files and directories
Sign in
FILE

cpuidle.c

File preview with syntax highlighting.

linux-6.19.14/drivers/acpi/arm64/cpuidle.c C
 1// SPDX-License-Identifier: GPL-2.0-only
 2/*
 3 * ARM64 CPU idle arch support
 4 *
 5 * Copyright (C) 2014 ARM Ltd.
 6 * Author: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
 7 */
 8
 9#include <linux/acpi.h>
10#include <linux/cpuidle.h>
11#include <linux/cpu_pm.h>
12#include <linux/psci.h>
13#include <acpi/processor.h>
14
15#define ARM64_LPI_IS_RETENTION_STATE(arch_flags) (!(arch_flags))
16
17static int psci_acpi_cpu_init_idle(unsigned int cpu)
18{
19	int i, count;
20	struct acpi_lpi_state *lpi;
21	struct acpi_processor *pr = per_cpu(processors, cpu);
22
23	if (unlikely(!pr || !pr->flags.has_lpi))
24		return -EINVAL;
25
26	/*
27	 * If the PSCI cpu_suspend function hook has not been initialized
28	 * idle states must not be enabled, so bail out
29	 */
30	if (!psci_ops.cpu_suspend)
31		return -EOPNOTSUPP;
32
33	count = pr->power.count - 1;
34	if (count <= 0)
35		return -ENODEV;
36
37	for (i = 0; i < count; i++) {
38		u32 state;
39
40		lpi = &pr->power.lpi_states[i + 1];
41		/*
42		 * Only bits[31:0] represent a PSCI power_state while
43		 * bits[63:32] must be 0x0 as per ARM ACPI FFH Specification
44		 */
45		state = lpi->address;
46		if (!psci_power_state_is_valid(state)) {
47			pr_warn("Invalid PSCI power state %#x\n", state);
48			return -EINVAL;
49		}
50	}
51
52	return 0;
53}
54
55int acpi_processor_ffh_lpi_probe(unsigned int cpu)
56{
57	return psci_acpi_cpu_init_idle(cpu);
58}
59
60__cpuidle int acpi_processor_ffh_lpi_enter(struct acpi_lpi_state *lpi)
61{
62	u32 state = lpi->address;
63
64	if (ARM64_LPI_IS_RETENTION_STATE(lpi->arch_flags))
65		return CPU_PM_CPU_IDLE_ENTER_RETENTION_PARAM_RCU(psci_cpu_suspend_enter,
66						lpi->index, state);
67	else
68		return CPU_PM_CPU_IDLE_ENTER_PARAM_RCU(psci_cpu_suspend_enter,
69					     lpi->index, state);
70}
~/ Read-only file preview.