Re: [PATCH V7 6/7] POWER/cpuidle: Enable powernv cpuidle support.

2013-11-06 Thread Daniel Lezcano

On 10/29/2013 12:01 PM, Deepthi Dharwar wrote:

The following patch extends the current power backend
idle driver to the powernv platform.

Signed-off-by: Deepthi Dharwar deep...@linux.vnet.ibm.com


Acked-by: Daniel Lezcano daniel.lezc...@linaro.org


---
  drivers/cpuidle/cpuidle-ibm-power.c |   39 ---
  1 file changed, 36 insertions(+), 3 deletions(-)

diff --git a/drivers/cpuidle/cpuidle-ibm-power.c 
b/drivers/cpuidle/cpuidle-ibm-power.c
index 5b92242..f790ea2 100644
--- a/drivers/cpuidle/cpuidle-ibm-power.c
+++ b/drivers/cpuidle/cpuidle-ibm-power.c
@@ -52,9 +52,10 @@ static int snooze_loop(struct cpuidle_device *dev,
struct cpuidle_driver *drv,
int index)
  {
-   unsigned long in_purr;
+   unsigned long in_purr = 0;

-   idle_loop_prolog(in_purr);
+   if (firmware_has_feature(FW_FEATURE_SPLPAR))
+   idle_loop_prolog(in_purr);
local_irq_enable();
set_thread_flag(TIF_POLLING_NRFLAG);

@@ -68,7 +69,8 @@ static int snooze_loop(struct cpuidle_device *dev,
clear_thread_flag(TIF_POLLING_NRFLAG);
smp_mb();

-   idle_loop_epilog(in_purr);
+   if (firmware_has_feature(FW_FEATURE_SPLPAR))
+   idle_loop_epilog(in_purr);

return index;
  }
@@ -132,6 +134,15 @@ static int shared_cede_loop(struct cpuidle_device *dev,
return index;
  }

+static int nap_loop(struct cpuidle_device *dev,
+   struct cpuidle_driver *drv,
+   int index)
+{
+   ppc64_runlatch_off();
+   power7_idle();
+   return index;
+}
+
  /*
   * States for dedicated partition case.
   */
@@ -165,6 +176,23 @@ static struct cpuidle_state shared_states[] = {
.enter = shared_cede_loop },
  };

+static struct cpuidle_state powernv_states[] = {
+   { /* Snooze */
+   .name = snooze,
+   .desc = snooze,
+   .flags = CPUIDLE_FLAG_TIME_VALID,
+   .exit_latency = 0,
+   .target_residency = 0,
+   .enter = snooze_loop },
+   { /* NAP */
+   .name = NAP,
+   .desc = NAP,
+   .flags = CPUIDLE_FLAG_TIME_VALID,
+   .exit_latency = 10,
+   .target_residency = 100,
+   .enter = nap_loop },
+};
+
  void update_smt_snooze_delay(int cpu, int residency)
  {
struct cpuidle_driver *drv = cpuidle_get_driver();
@@ -258,6 +286,11 @@ static int power_idle_probe(void)
cpuidle_state_table = dedicated_states;
max_idle_state = ARRAY_SIZE(dedicated_states);
}
+
+   } else if (firmware_has_feature(FW_FEATURE_OPALv3)) {
+   cpuidle_state_table = powernv_states;
+   max_idle_state = ARRAY_SIZE(powernv_states);
+
} else
return -ENODEV;





--
 http://www.linaro.org/ Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  http://www.facebook.com/pages/Linaro Facebook |
http://twitter.com/#!/linaroorg Twitter |
http://www.linaro.org/linaro-blog/ Blog

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

[PATCH V7 6/7] POWER/cpuidle: Enable powernv cpuidle support.

2013-10-29 Thread Deepthi Dharwar
The following patch extends the current power backend
idle driver to the powernv platform.

Signed-off-by: Deepthi Dharwar deep...@linux.vnet.ibm.com
---
 drivers/cpuidle/cpuidle-ibm-power.c |   39 ---
 1 file changed, 36 insertions(+), 3 deletions(-)

diff --git a/drivers/cpuidle/cpuidle-ibm-power.c 
b/drivers/cpuidle/cpuidle-ibm-power.c
index 5b92242..f790ea2 100644
--- a/drivers/cpuidle/cpuidle-ibm-power.c
+++ b/drivers/cpuidle/cpuidle-ibm-power.c
@@ -52,9 +52,10 @@ static int snooze_loop(struct cpuidle_device *dev,
struct cpuidle_driver *drv,
int index)
 {
-   unsigned long in_purr;
+   unsigned long in_purr = 0;
 
-   idle_loop_prolog(in_purr);
+   if (firmware_has_feature(FW_FEATURE_SPLPAR))
+   idle_loop_prolog(in_purr);
local_irq_enable();
set_thread_flag(TIF_POLLING_NRFLAG);
 
@@ -68,7 +69,8 @@ static int snooze_loop(struct cpuidle_device *dev,
clear_thread_flag(TIF_POLLING_NRFLAG);
smp_mb();
 
-   idle_loop_epilog(in_purr);
+   if (firmware_has_feature(FW_FEATURE_SPLPAR))
+   idle_loop_epilog(in_purr);
 
return index;
 }
@@ -132,6 +134,15 @@ static int shared_cede_loop(struct cpuidle_device *dev,
return index;
 }
 
+static int nap_loop(struct cpuidle_device *dev,
+   struct cpuidle_driver *drv,
+   int index)
+{
+   ppc64_runlatch_off();
+   power7_idle();
+   return index;
+}
+
 /*
  * States for dedicated partition case.
  */
@@ -165,6 +176,23 @@ static struct cpuidle_state shared_states[] = {
.enter = shared_cede_loop },
 };
 
+static struct cpuidle_state powernv_states[] = {
+   { /* Snooze */
+   .name = snooze,
+   .desc = snooze,
+   .flags = CPUIDLE_FLAG_TIME_VALID,
+   .exit_latency = 0,
+   .target_residency = 0,
+   .enter = snooze_loop },
+   { /* NAP */
+   .name = NAP,
+   .desc = NAP,
+   .flags = CPUIDLE_FLAG_TIME_VALID,
+   .exit_latency = 10,
+   .target_residency = 100,
+   .enter = nap_loop },
+};
+
 void update_smt_snooze_delay(int cpu, int residency)
 {
struct cpuidle_driver *drv = cpuidle_get_driver();
@@ -258,6 +286,11 @@ static int power_idle_probe(void)
cpuidle_state_table = dedicated_states;
max_idle_state = ARRAY_SIZE(dedicated_states);
}
+
+   } else if (firmware_has_feature(FW_FEATURE_OPALv3)) {
+   cpuidle_state_table = powernv_states;
+   max_idle_state = ARRAY_SIZE(powernv_states);
+
} else
return -ENODEV;
 

___
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev