From: josephl@nvidia.com (Joseph Lo)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH V2 6/6] ARM: tegra20: cpuidle: apply coupled cpuidle for powered-down mode
Date: Wed, 5 Dec 2012 18:01:53 +0800 [thread overview]
Message-ID: <1354701715-24150-7-git-send-email-josephl@nvidia.com> (raw)
In-Reply-To: <1354701715-24150-1-git-send-email-josephl@nvidia.com>
The "powered-down" cpuidle mode of Tegra20 needs the CPU0 be the last one
core to go into this mode before other core. The coupled cpuidle framework
can help to sync the MPCore to coupled state then go into "powered-down"
idle mode together. The driver can just assume the MPCore come into
"powered-down" mode at the same time. No need to take care if the CPU_0
goes into this mode along and only can put it into safe idle mode (WFI).
Signed-off-by: Joseph Lo <josephl@nvidia.com>
---
V2:
* handling the case of SGI pending before go into "powered-down" idle mode
---
arch/arm/mach-tegra/Kconfig | 1 +
arch/arm/mach-tegra/cpuidle-tegra20.c | 48 ++++++++++++++++++++------------
2 files changed, 31 insertions(+), 18 deletions(-)
diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig
index e426d1b..e07241a 100644
--- a/arch/arm/mach-tegra/Kconfig
+++ b/arch/arm/mach-tegra/Kconfig
@@ -4,6 +4,7 @@ comment "NVIDIA Tegra options"
config ARCH_TEGRA_2x_SOC
bool "Enable support for Tegra20 family"
+ select ARCH_NEEDS_CPU_IDLE_COUPLED
select ARCH_REQUIRE_GPIOLIB
select ARM_ERRATA_720789
select ARM_ERRATA_742230
diff --git a/arch/arm/mach-tegra/cpuidle-tegra20.c b/arch/arm/mach-tegra/cpuidle-tegra20.c
index a83a53b..13e3ae4 100644
--- a/arch/arm/mach-tegra/cpuidle-tegra20.c
+++ b/arch/arm/mach-tegra/cpuidle-tegra20.c
@@ -33,13 +33,16 @@
#include "pm.h"
#include "sleep.h"
#include "iomap.h"
+#include "irq.h"
#include "tegra_cpu_car.h"
#include "flowctrl.h"
#ifdef CONFIG_PM_SLEEP
-static int tegra20_idle_lp2(struct cpuidle_device *dev,
- struct cpuidle_driver *drv,
- int index);
+static atomic_t abort_flag;
+static atomic_t abort_barrier;
+static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev,
+ struct cpuidle_driver *drv,
+ int index);
#endif
static struct cpuidle_driver tegra_idle_driver = {
@@ -55,11 +58,12 @@ static struct cpuidle_driver tegra_idle_driver = {
[0] = ARM_CPUIDLE_WFI_STATE_PWR(600),
#ifdef CONFIG_PM_SLEEP
[1] = {
- .enter = tegra20_idle_lp2,
+ .enter = tegra20_idle_lp2_coupled,
.exit_latency = 5000,
.target_residency = 10000,
.power_usage = 0,
- .flags = CPUIDLE_FLAG_TIME_VALID,
+ .flags = CPUIDLE_FLAG_TIME_VALID |
+ CPUIDLE_FLAG_COUPLED,
.name = "powered-down",
.desc = "CPU power gated",
},
@@ -178,28 +182,33 @@ static inline bool tegra20_idle_enter_lp2_cpu_1(struct cpuidle_device *dev,
}
#endif
-static int __cpuinit tegra20_idle_lp2(struct cpuidle_device *dev,
- struct cpuidle_driver *drv,
- int index)
+static int __cpuinit tegra20_idle_lp2_coupled(struct cpuidle_device *dev,
+ struct cpuidle_driver *drv,
+ int index)
{
u32 cpu = is_smp() ? cpu_logical_map(dev->cpu) : dev->cpu;
bool entered_lp2 = false;
- bool last_cpu;
+
+ if (tegra_pending_sgi())
+ atomic_inc(&abort_flag);
+
+ cpuidle_coupled_parallel_barrier(dev, &abort_barrier);
+
+ if (atomic_read(&abort_flag) > 0) {
+ cpuidle_coupled_parallel_barrier(dev, &abort_barrier);
+ atomic_set(&abort_flag, 0); /* clean flag for next coming */
+ return -EINTR;
+ }
local_fiq_disable();
- last_cpu = tegra_set_cpu_in_lp2(cpu);
+ tegra_set_cpu_in_lp2(cpu);
cpu_pm_enter();
- if (cpu == 0) {
- if (last_cpu)
- entered_lp2 = tegra20_cpu_cluster_power_down(dev, drv,
- index);
- else
- cpu_do_idle();
- } else {
+ if (cpu == 0)
+ entered_lp2 = tegra20_cpu_cluster_power_down(dev, drv, index);
+ else
entered_lp2 = tegra20_idle_enter_lp2_cpu_1(dev, drv, index);
- }
cpu_pm_exit();
tegra_clear_cpu_in_lp2(cpu);
@@ -232,6 +241,9 @@ int __init tegra20_cpuidle_init(void)
for_each_possible_cpu(cpu) {
dev = &per_cpu(tegra_idle_device, cpu);
dev->cpu = cpu;
+#ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED
+ dev->coupled_cpus = *cpu_online_mask;
+#endif
dev->state_count = drv->state_count;
ret = cpuidle_register_device(dev);
--
1.7.0.4
next prev parent reply other threads:[~2012-12-05 10:01 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-05 10:01 [PATCH V2 0/6] ARM: tegra20: cpuidle: add power-down state Joseph Lo
2012-12-05 10:01 ` [PATCH V2 1/6] ARM: tegra: add pending SGI checking API Joseph Lo
2012-12-05 22:09 ` Stephen Warren
2012-12-06 7:04 ` Joseph Lo
2012-12-06 18:52 ` Stephen Warren
2012-12-05 10:01 ` [PATCH V2 2/6] ARM: tegra20: cpuidle: add powered-down state for secondary CPU Joseph Lo
2012-12-05 10:50 ` Lorenzo Pieralisi
2012-12-06 8:25 ` Joseph Lo
2012-12-06 18:56 ` Stephen Warren
2013-01-11 7:20 ` Joseph Lo
2013-01-11 12:24 ` Lorenzo Pieralisi
2013-01-15 3:00 ` Joseph Lo
2013-01-15 11:34 ` Lorenzo Pieralisi
2013-01-16 3:17 ` Joseph Lo
2013-01-12 17:33 ` Nicolas Pitre
2012-12-05 22:18 ` Stephen Warren
2012-12-06 7:22 ` Joseph Lo
2012-12-06 18:59 ` Stephen Warren
2012-12-05 10:01 ` [PATCH V2 3/6] ARM: tegra20: clocks: add CPU low-power function into tegra_cpu_car_ops Joseph Lo
2012-12-05 10:01 ` [PATCH V2 4/6] ARM: tegra20: flowctrl: add support for cpu_suspend_enter/exit Joseph Lo
2012-12-05 10:01 ` [PATCH V2 5/6] ARM: tegra20: cpuidle: add powered-down state for CPU0 Joseph Lo
2012-12-05 10:01 ` Joseph Lo [this message]
2012-12-05 10:01 ` [PATCH V2 6/6] ARM: tegra20: cpuidle: apply coupled cpuidle for powered-down mode Joseph Lo
2012-12-05 10:10 ` Joseph Lo
2012-12-06 11:03 ` Grant Likely
2012-12-05 10:01 ` Joseph Lo
2012-12-05 10:11 ` Joseph Lo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1354701715-24150-7-git-send-email-josephl@nvidia.com \
--to=josephl@nvidia.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).