[PATCH] OMAP3630 PM: Update C state latencies

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch has changes to update the C state latencies for OMAP3630
and removes the useless C-States, keeping only the optimized ones with 
their corresponding measured latencies.
Only 4 C-states are kept instead of 7 C-States:
  * 	C1 . MPU WFI clock gated + Core autogating
  *	C3 . MPU CSWR + Core inactive
  *	C5 . MPU CSWR + Core CSWR
  *	C7 . MPU OFF + Core OFF
 A new C-State C1 is created which is the same as the existing C1 but clocks 
 gated. It will be the default state. When calling the safe state, the clocks
 gating is denied as it was the case previously. With these changes, gain is 
 in power consumption is observed on some use cases.

Thanks to Nicole Chaloub<n-chalhoub@xxxxxx> and Vincent Bour <v-bour@xxxxxx>
for their investigation.

Tested on ZOOM3 board using latest pm branch.

Signed-off-by: Vishwanath BS <vishwanath.bs@xxxxxx>
Signed-off-by: Nicole Chalhoub <n-chalhoub@xxxxxx>
---
 arch/arm/mach-omap2/board-zoom3.c |   19 +++++++++++++++++++
 arch/arm/mach-omap2/cpuidle34xx.c |    9 ++++++---
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/arch/arm/mach-omap2/board-zoom3.c b/arch/arm/mach-omap2/board-zoom3.c
index 03411b2..c47b2a3 100644
--- a/arch/arm/mach-omap2/board-zoom3.c
+++ b/arch/arm/mach-omap2/board-zoom3.c
@@ -25,10 +25,28 @@
 #include "mux.h"
 #include "sdram-hynix-h8mbx00u0mer-0em.h"
 #include "smartreflex-class3.h"
+#include "pm.h"
 
 static struct omap_board_config_kernel zoom_config[] __initdata = {
 };
 
+static struct cpuidle_params omap3_cpuidle_params_table[] = {
+	/* C1 */
+	{1, 74, 78, 152},
+	/* C2 */
+	{0, 165, 90, 255},
+	/* C3 */
+	{1, 163, 180, 345},
+	/* C4 */
+	{0, 2852, 605, 3457},
+	/* C5 */
+	{1, 800, 366, 2120},
+	/* C6 */
+	{0, 4080, 801, 4881},
+	/* C7 */
+	{1, 4300, 8794, 159000},
+};
+
 static struct mtd_partition zoom_nand_partitions[] = {
 	/* All the partition sizes are listed in terms of NAND block size */
 	{
@@ -74,6 +92,7 @@ static void __init omap_zoom_init_irq(void)
 {
 	omap_board_config = zoom_config;
 	omap_board_config_size = ARRAY_SIZE(zoom_config);
+	omap3_pm_init_cpuidle(omap3_cpuidle_params_table);
 	omap2_init_common_hw(h8mbx00u0mer0em_sdrc_params,
 			h8mbx00u0mer0em_sdrc_params);
 	omap_init_irq();
diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c
index 3d3d035..2bbfc43 100644
--- a/arch/arm/mach-omap2/cpuidle34xx.c
+++ b/arch/arm/mach-omap2/cpuidle34xx.c
@@ -136,7 +136,8 @@ static int omap3_enter_idle(struct cpuidle_device *dev,
 	if (omap_irq_pending() || need_resched())
 		goto return_sleep_time;
 
-	if (cx->type == OMAP3_STATE_C1) {
+	/* deny idle only if we are entering safe state */
+	if (dev->last_state != state) {
 		pwrdm_for_each_clkdm(mpu_pd, _cpuidle_deny_idle);
 		pwrdm_for_each_clkdm(core_pd, _cpuidle_deny_idle);
 	}
@@ -144,7 +145,7 @@ static int omap3_enter_idle(struct cpuidle_device *dev,
 	/* Execute ARM wfi */
 	omap_sram_idle();
 
-	if (cx->type == OMAP3_STATE_C1) {
+	if (dev->last_state != state) {
 		pwrdm_for_each_clkdm(mpu_pd, _cpuidle_allow_idle);
 		pwrdm_for_each_clkdm(core_pd, _cpuidle_allow_idle);
 	}
@@ -233,14 +234,16 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev,
 			       struct cpuidle_state *state)
 {
 	struct cpuidle_state *new_state = next_valid_state(dev, state);
+	int t;
 
 	if ((state->flags & CPUIDLE_FLAG_CHECK_BM) && omap3_idle_bm_check()) {
 		BUG_ON(!dev->safe_state);
 		new_state = dev->safe_state;
 	}
 
+	t = omap3_enter_idle(dev, new_state);
 	dev->last_state = new_state;
-	return omap3_enter_idle(dev, new_state);
+	return t;
 }
 
 DEFINE_PER_CPU(struct cpuidle_device, omap3_idle_dev);
-- 
1.7.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux