Thread (4 messages) 4 messages, 2 authors, 2012-05-03
DORMANTno replies

[PATCH] arm: omap: Use only valid power domain states

From: Jean Pihet <hidden>
Date: 2012-05-03 07:01:46
Also in: linux-omap

Hi Mark,

On Thu, May 3, 2012 at 12:04 AM, Mark A. Greer [off-list ref] wrote:
On Tue, May 01, 2012 at 10:47:35AM +0200, Jean Pihet wrote:
quoted
Hi Mark,
Hi Jean. ?Thanks for the review.
quoted
On Mon, Apr 30, 2012 at 11:25 PM, Mark A. Greer [off-list ref] wrote:
quoted
From: "Mark A. Greer" <mgreer@animalcreek.com>
quoted
quoted
diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c
index 5358664..2c91711 100644
--- a/arch/arm/mach-omap2/cpuidle34xx.c
+++ b/arch/arm/mach-omap2/cpuidle34xx.c
@@ -175,19 +175,25 @@ static int next_valid_state(struct cpuidle_device *dev,
? ? ? ?struct cpuidle_state_usage *curr_usage = &dev->states_usage[index];
? ? ? ?struct cpuidle_state *curr = &drv->states[index];
? ? ? ?struct omap3_idle_statedata *cx = cpuidle_get_statedata(curr_usage);
- ? ? ? u32 mpu_deepest_state = PWRDM_POWER_RET;
- ? ? ? u32 core_deepest_state = PWRDM_POWER_RET;
+ ? ? ? u32 mpu_deepest_state, mpu_deepest_possible;
+ ? ? ? u32 core_deepest_state, core_deepest_possible;
? ? ? ?int next_index = -1;

+ ? ? ? mpu_deepest_possible = pwrdm_get_deepest_state(mpu_pd);
+ ? ? ? mpu_deepest_state = max_t(u32, mpu_deepest_possible, PWRDM_POWER_RET);
I do not think you need to change the pwrdm API and the cpuidle code for that.
Instead you should use the pwrst* fields in the power domains data
files, which allow to specify the allowed states.
After reading the rest of your patches it seems you are addressing the
issue in a subsequent patch 'arm: omap3: am35x: Set proper powerdomain
states'.
That patch sets the allowable power domain states for the am35x; the intent
of this patch was to make the code respect what is set in the pwrst* fields.
quoted
quoted
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c
index 96ad3dbe..9c80c19 100644
--- a/arch/arm/mach-omap2/powerdomain.c
+++ b/arch/arm/mach-omap2/powerdomain.c
@@ -1078,3 +1078,28 @@ bool pwrdm_can_ever_lose_context(struct powerdomain *pwrdm)
? ? ? ?return 0;
?}
+
+/**
+ * pwrdm_get_deepest_state - Get deepest valid state domain can enter
+ * @pwrdm: struct powerdomain *
+ *
+ * Find and return the deepest valid state a power domain can be in.
+ * Returns the deepest state that @pwrdm can enter.
+ */
+u32 pwrdm_get_deepest_state(struct powerdomain *pwrdm)
+{
+ ? ? ? u32 valid_states, deepest_state;
+
+ ? ? ? valid_states = pwrdm->pwrsts;
+
+ ? ? ? if (valid_states & PWRSTS_OFF)
+ ? ? ? ? ? ? ? deepest_state = PWRDM_POWER_OFF;
+ ? ? ? else if (valid_states & PWRSTS_RET)
+ ? ? ? ? ? ? ? deepest_state = PWRDM_POWER_RET;
+ ? ? ? else if (valid_states & PWRSTS_INACTIVE)
+ ? ? ? ? ? ? ? deepest_state = PWRDM_POWER_INACTIVE;
+ ? ? ? else
+ ? ? ? ? ? ? ? deepest_state = PWRDM_POWER_ON;
+
+ ? ? ? return deepest_state;
+}
The pwrdm API already performs those checks on pwrst*, cf.
pwrdm_set_next_pwrst for example.
Well, sort of. ?pwrdm_set_next_pwrst() fails if its an invalid state
returning -EINVAL. ?Very few of the callers actually check to see if
it failed so they don't try the "next-one-up" power state. ?The net
result is that the next state doesn't change even though it could
move to a lower state (just not the one that was asked for).

Is that acceptable?
No that is not acceptable. In fact the next power state should only be
set using omap_set_pwrdm_state, which falls back to the next valid
power state. Note: my latest patches about the functional power states
is using omap_set_pwrdm_state as the only function to set the power,
logic states.
Another sort of strange one is omap3_pm_off_mode_enable(). ?If its
called with 'enable' set and PWRDM_POWER_OFF isn't a valid state,
omap_set_pwrdm_state() will return 0 and leave the next state alone.
When omap3_pm_off_mode_enable() is called again with 'enable' set,
omap_set_pwrdm_state() will find the lowest valid state >= RET.
So, if you had a device where OFF wasn't valid but RET was and
its currently ON, when the user enables OFF mode, it stays ON
and when they disable OFF mode, it moves to RET.

Is that acceptable?
No. omap_set_pwrdm_state should be fixed in that case.
In fact the enable_off_mode flag is scheduled for removal in favor of
the PM QoS constraints.
If the things above are acceptable, then I think you're right, we can
forget this patch. ?FYI, the am35x appears to work okay and no invalid
states are entered (according to /sys/kernel/debug/pm_debug/count)
without this patch.
I think we should fix the existing code if it has problems, not add
more specific code.

Kevin, what is your take on this?
Mark
Regards,
Jean
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help