Skip to content

Commit

Permalink
powerpc/powernv: Use deepest stop state when cpu is offlined
Browse files Browse the repository at this point in the history
If hardware supports stop state, use the deepest stop state when
the cpu is offlined.

Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
Signed-off-by: Shreyas B. Prabhu <shreyas@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
  • Loading branch information
Shreyas B. Prabhu authored and Michael Ellerman committed Jul 15, 2016
1 parent 3005c59 commit c0691f9
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 3 deletions.
15 changes: 13 additions & 2 deletions arch/powerpc/platforms/powernv/idle.c
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,11 @@ static void power9_idle(void)
*/
u64 pnv_first_deep_stop_state = MAX_STOP_STATE;

/*
* Deepest stop idle state. Used when a cpu is offlined
*/
u64 pnv_deepest_stop_state;

/*
* Power ISA 3.0 idle initialization.
*
Expand Down Expand Up @@ -314,8 +319,11 @@ static int __init pnv_arch300_idle_init(struct device_node *np, u32 *flags,
}

/*
* Set pnv_first_deep_stop_state to the first stop level
* to cause hypervisor state loss
* Set pnv_first_deep_stop_state and pnv_deepest_stop_state.
* pnv_first_deep_stop_state should be set to the first stop
* level to cause hypervisor state loss.
* pnv_deepest_stop_state should be set to the deepest stop
* stop state.
*/
pnv_first_deep_stop_state = MAX_STOP_STATE;
for (i = 0; i < dt_idle_states; i++) {
Expand All @@ -324,6 +332,9 @@ static int __init pnv_arch300_idle_init(struct device_node *np, u32 *flags,
if ((flags[i] & OPAL_PM_LOSE_FULL_CONTEXT) &&
(pnv_first_deep_stop_state > psscr_rl))
pnv_first_deep_stop_state = psscr_rl;

if (pnv_deepest_stop_state < psscr_rl)
pnv_deepest_stop_state = psscr_rl;
}

out:
Expand Down
1 change: 1 addition & 0 deletions arch/powerpc/platforms/powernv/powernv.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ static inline void pnv_pci_shutdown(void) { }
#endif

extern u32 pnv_get_supported_cpuidle_states(void);
extern u64 pnv_deepest_stop_state;

extern void pnv_lpc_init(void);

Expand Down
4 changes: 3 additions & 1 deletion arch/powerpc/platforms/powernv/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,9 @@ static void pnv_smp_cpu_kill_self(void)

ppc64_runlatch_off();

if (idle_states & OPAL_PM_WINKLE_ENABLED)
if (cpu_has_feature(CPU_FTR_ARCH_300))
srr1 = power9_idle_stop(pnv_deepest_stop_state);
else if (idle_states & OPAL_PM_WINKLE_ENABLED)
srr1 = power7_winkle();
else if ((idle_states & OPAL_PM_SLEEP_ENABLED) ||
(idle_states & OPAL_PM_SLEEP_ENABLED_ER1))
Expand Down

0 comments on commit c0691f9

Please sign in to comment.