Hi Nick,

On Tue, Mar 14, 2017 at 07:23:46PM +1000, Nicholas Piggin wrote:
> POWER9 does not use this field, so it should be moved into the POWER8
> code. Update the documentation in the paca struct too.
> 
> Signed-off-by: Nicholas Piggin <npig...@gmail.com>
> ---
>  arch/powerpc/include/asm/paca.h   | 12 ++++++++++--
>  arch/powerpc/kernel/idle_book3s.S | 13 +++++++------
>  2 files changed, 17 insertions(+), 8 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h
> index 708c3e592eeb..bbb59e226a9f 100644
> --- a/arch/powerpc/include/asm/paca.h
> +++ b/arch/powerpc/include/asm/paca.h
> @@ -165,11 +165,19 @@ struct paca_struct {
>  #endif
> 
>  #ifdef CONFIG_PPC_POWERNV
> -     /* Per-core mask tracking idle threads and a lock bit-[L][TTTTTTTT] */
> +     /* CPU idle fields */
> +
> +     /*
> +      * Per-core word used to synchronize between threads. See
> +      * asm/cpuidle.h, PNV_CORE_IDLE_*
> +      */
>       u32 *core_idle_state_ptr;
> -     u8 thread_idle_state;           /* PNV_THREAD_RUNNING/NAP/SLEEP */
>       /* Mask to indicate thread id in core */
>       u8 thread_mask;
> +
> +     /* POWER8 specific fields */
> +     /* PNV_THREAD_RUNNING/NAP/SLEEP */
> +     u8 thread_idle_state;

I am planning to use this in POWER9 DD1 to distinguish between a
SRESET received when the thread was running vs when it was in stop.
Unfortunately the SRR1[46:47] are not cleared in the former case. So
we need a way in software to distinguish between the two.

>       /* Mask to denote subcore sibling threads */
>       u8 subcore_sibling_mask;
>  #endif
> diff --git a/arch/powerpc/kernel/idle_book3s.S 
> b/arch/powerpc/kernel/idle_book3s.S
> index 9284ea0762b1..9bdfba75a5e7 100644
> --- a/arch/powerpc/kernel/idle_book3s.S
> +++ b/arch/powerpc/kernel/idle_book3s.S
> @@ -389,9 +389,6 @@ FTR_SECTION_ELSE
>       bl      pnv_restore_hyp_resource_arch207
>  ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_300)
> 
> -     li      r0,PNV_THREAD_RUNNING
> -     stb     r0,PACA_THREAD_IDLE_STATE(r13)  /* Clear thread state */
> -
>  #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
>       li      r0,KVM_HWTHREAD_IN_KERNEL
>       stb     r0,HSTATE_HWTHREAD_STATE(r13)
> @@ -445,9 +442,13 @@ pnv_restore_hyp_resource_arch207:
>       ld      r2,PACATOC(r13);
> 
>       lbz     r0,PACA_THREAD_IDLE_STATE(r13)
> -     cmpwi   cr2,r0,PNV_THREAD_NAP
> -     cmpwi   cr4,r0,PNV_THREAD_WINKLE
> -     bgt     cr2,pnv_wakeup_tb_loss  /* Either sleep or Winkle */
> +     cmpwi   cr2,r0,PNV_THREAD_NAP
> +     cmpwi   cr4,r0,PNV_THREAD_WINKLE
> +     li      r0,PNV_THREAD_RUNNING
> +     stb     r0,PACA_THREAD_IDLE_STATE(r13)  /* Clear thread state */
> +
> +     bgt     cr2,pnv_wakeup_tb_loss  /* Either sleep or Winkle */
> +
> 
>       /*
>        * We fall through here if PACA_THREAD_IDLE_STATE shows we are waking
> -- 
> 2.11.0
> 

Reply via email to