Re: [PATCH 1/2] powerpc/64s: remplement power4_idle code in C

2020-12-15 Thread Michael Ellerman
On Thu, 11 Jul 2019 12:24:03 +1000, Nicholas Piggin wrote:
> This implements the tricky tracing and soft irq handling bits in C,
> leaving the low level bit to asm.
> 
> A functional difference is that this redirects the interrupt exit to
> a return stub to execute blr, rather than the lr address itself. This
> is probably barely measurable on real hardware, but it keeps the link
> stack balanced.
> 
> [...]

Patch 2 applied to powerpc/next.

[2/2] powerpc/64s: Remove idle workaround code from restore_cpu_cpufeatures
  https://git.kernel.org/powerpc/c/02b02ee1b05ef225525835b2d45faf31b3420bdd

cheers


Re: [PATCH 1/2] powerpc/64s: remplement power4_idle code in C

2020-01-28 Thread Michael Ellerman
On Thu, 2019-07-11 at 02:24:03 UTC, Nicholas Piggin wrote:
> This implements the tricky tracing and soft irq handling bits in C,
> leaving the low level bit to asm.
> 
> A functional difference is that this redirects the interrupt exit to
> a return stub to execute blr, rather than the lr address itself. This
> is probably barely measurable on real hardware, but it keeps the link
> stack balanced.
> 
> Tested with QEMU.
> 
> Signed-off-by: Nicholas Piggin 

Applied to powerpc next, thanks.

https://git.kernel.org/powerpc/c/ed0bc98f8cbe4f8254759d333a47aedc816ff8c5

cheers


Re: [PATCH 1/2] powerpc/64s: remplement power4_idle code in C

2019-08-19 Thread Nicholas Piggin
Michael Ellerman's on August 18, 2019 1:49 pm:
> Nicholas Piggin  writes:
>> diff --git a/arch/powerpc/kernel/exceptions-64s.S 
>> b/arch/powerpc/kernel/exceptions-64s.S
>> index eee5bef736c8..64d5ffbb07d1 100644
>> --- a/arch/powerpc/kernel/exceptions-64s.S
>> +++ b/arch/powerpc/kernel/exceptions-64s.S
>> @@ -2286,15 +2286,6 @@ USE_FIXED_SECTION(virt_trampolines)
>>  __end_interrupts:
>>  DEFINE_FIXED_SYMBOL(__end_interrupts)
>>  
>> -#ifdef CONFIG_PPC_970_NAP
>> -EXC_COMMON_BEGIN(power4_fixup_nap)
>> -andcr9,r9,r10
>> -std r9,TI_LOCAL_FLAGS(r11)
>> -ld  r10,_LINK(r1)   /* make idle task do the */
>> -std r10,_NIP(r1)/* equivalent of a blr */
>> -blr
>> -#endif
> 
> This breaks ppc64_defconfig build with:
> 
> ERROR: start_text address is c0008100, should be c0008000
> 
> Due to:
> 
> c0008000 <001a.long_branch.power4_fixup_nap>:
> c0008000:   48 03 5a b4 b   c003dab4 
> 
> 
> 
> Moving power4_fixup_nap back into exceptions-64s.S seems to fix it.

Okay that should be fine if you can update it.

Thanks,
Nick


Re: [PATCH 1/2] powerpc/64s: remplement power4_idle code in C

2019-08-17 Thread Michael Ellerman
Nicholas Piggin  writes:
> diff --git a/arch/powerpc/kernel/exceptions-64s.S 
> b/arch/powerpc/kernel/exceptions-64s.S
> index eee5bef736c8..64d5ffbb07d1 100644
> --- a/arch/powerpc/kernel/exceptions-64s.S
> +++ b/arch/powerpc/kernel/exceptions-64s.S
> @@ -2286,15 +2286,6 @@ USE_FIXED_SECTION(virt_trampolines)
>  __end_interrupts:
>  DEFINE_FIXED_SYMBOL(__end_interrupts)
>  
> -#ifdef CONFIG_PPC_970_NAP
> -EXC_COMMON_BEGIN(power4_fixup_nap)
> - andcr9,r9,r10
> - std r9,TI_LOCAL_FLAGS(r11)
> - ld  r10,_LINK(r1)   /* make idle task do the */
> - std r10,_NIP(r1)/* equivalent of a blr */
> - blr
> -#endif

This breaks ppc64_defconfig build with:

ERROR: start_text address is c0008100, should be c0008000

Due to:

c0008000 <001a.long_branch.power4_fixup_nap>:
c0008000:   48 03 5a b4 b   c003dab4 



Moving power4_fixup_nap back into exceptions-64s.S seems to fix it.

cheers


[PATCH 1/2] powerpc/64s: remplement power4_idle code in C

2019-07-10 Thread Nicholas Piggin
This implements the tricky tracing and soft irq handling bits in C,
leaving the low level bit to asm.

A functional difference is that this redirects the interrupt exit to
a return stub to execute blr, rather than the lr address itself. This
is probably barely measurable on real hardware, but it keeps the link
stack balanced.

Tested with QEMU.

Signed-off-by: Nicholas Piggin 
---
 arch/powerpc/include/asm/processor.h |  3 +
 arch/powerpc/kernel/Makefile |  3 +-
 arch/powerpc/kernel/exceptions-64s.S |  9 ---
 arch/powerpc/kernel/idle.c   | 25 
 arch/powerpc/kernel/idle_book3s.S| 35 +++
 arch/powerpc/kernel/idle_power4.S| 87 
 arch/powerpc/platforms/Kconfig   |  4 ++
 7 files changed, 68 insertions(+), 98 deletions(-)
 delete mode 100644 arch/powerpc/kernel/idle_power4.S

diff --git a/arch/powerpc/include/asm/processor.h 
b/arch/powerpc/include/asm/processor.h
index 706ac5df546f..c0d870c57061 100644
--- a/arch/powerpc/include/asm/processor.h
+++ b/arch/powerpc/include/asm/processor.h
@@ -418,6 +418,9 @@ static inline unsigned long get_clean_sp(unsigned long sp, 
int is_32)
 extern unsigned long isa300_idle_stop_noloss(unsigned long psscr_val);
 extern unsigned long isa300_idle_stop_mayloss(unsigned long psscr_val);
 extern unsigned long isa206_idle_insn_mayloss(unsigned long type);
+#ifdef CONFIG_PPC_970_NAP
+extern void power4_idle_nap(void);
+#endif
 
 extern unsigned long cpuidle_disable;
 enum idle_boot_override {IDLE_NO_OVERRIDE = 0, IDLE_POWERSAVE_OFF};
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
index 56dfa7a2a6f2..04c6d8cc241b 100644
--- a/arch/powerpc/kernel/Makefile
+++ b/arch/powerpc/kernel/Makefile
@@ -64,8 +64,7 @@ obj-$(CONFIG_PPC_BOOK3E_64)   += exceptions-64e.o 
idle_book3e.o
 obj-$(CONFIG_PPC_BARRIER_NOSPEC) += security.o
 obj-$(CONFIG_PPC64)+= vdso64/
 obj-$(CONFIG_ALTIVEC)  += vecemu.o
-obj-$(CONFIG_PPC_970_NAP)  += idle_power4.o
-obj-$(CONFIG_PPC_P7_NAP)   += idle_book3s.o
+obj-$(CONFIG_PPC_BOOK3S_IDLE)  += idle_book3s.o
 procfs-y   := proc_powerpc.o
 obj-$(CONFIG_PROC_FS)  += $(procfs-y)
 rtaspci-$(CONFIG_PPC64)-$(CONFIG_PCI)  := rtas_pci.o
diff --git a/arch/powerpc/kernel/exceptions-64s.S 
b/arch/powerpc/kernel/exceptions-64s.S
index eee5bef736c8..64d5ffbb07d1 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -2286,15 +2286,6 @@ USE_FIXED_SECTION(virt_trampolines)
 __end_interrupts:
 DEFINE_FIXED_SYMBOL(__end_interrupts)
 
-#ifdef CONFIG_PPC_970_NAP
-EXC_COMMON_BEGIN(power4_fixup_nap)
-   andcr9,r9,r10
-   std r9,TI_LOCAL_FLAGS(r11)
-   ld  r10,_LINK(r1)   /* make idle task do the */
-   std r10,_NIP(r1)/* equivalent of a blr */
-   blr
-#endif
-
 CLOSE_FIXED_SECTION(real_vectors);
 CLOSE_FIXED_SECTION(real_trampolines);
 CLOSE_FIXED_SECTION(virt_vectors);
diff --git a/arch/powerpc/kernel/idle.c b/arch/powerpc/kernel/idle.c
index d7216c9abda1..605defde43b9 100644
--- a/arch/powerpc/kernel/idle.c
+++ b/arch/powerpc/kernel/idle.c
@@ -81,6 +81,31 @@ void arch_cpu_idle(void)
 
 int powersave_nap;
 
+#ifdef CONFIG_PPC_970_NAP
+void power4_idle(void)
+{
+   if (!cpu_has_feature(CPU_FTR_CAN_NAP))
+   return;
+
+   if (!powersave_nap)
+   return;
+
+   if (!prep_irq_for_idle())
+   return;
+
+   if (cpu_has_feature(CPU_FTR_ALTIVEC))
+   asm volatile("DSSALL ; sync" ::: "memory");
+
+   power4_idle_nap();
+
+   /*
+* power4_idle_nap returns with interrupts enabled (soft and hard).
+* to our caller with interrupts enabled (soft and hard). Our caller
+* can cope with either interrupts disabled or enabled upon return.
+*/
+}
+#endif
+
 #ifdef CONFIG_SYSCTL
 /*
  * Register the sysctl to set/clear powersave_nap.
diff --git a/arch/powerpc/kernel/idle_book3s.S 
b/arch/powerpc/kernel/idle_book3s.S
index 2dfbd5d5b932..5afac9177fec 100644
--- a/arch/powerpc/kernel/idle_book3s.S
+++ b/arch/powerpc/kernel/idle_book3s.S
@@ -19,7 +19,9 @@
 #include 
 #include 
 #include 
+#include  /* TLF_NAPPING */
 
+#ifdef CONFIG_PPC_P7_NAP
 /*
  * Desired PSSCR in r3
  *
@@ -185,4 +187,37 @@ _GLOBAL(isa206_idle_insn_mayloss)
bne 2f
IDLE_STATE_ENTER_SEQ_NORET(PPC_SLEEP)
 2: IDLE_STATE_ENTER_SEQ_NORET(PPC_WINKLE)
+#endif
 
+#ifdef CONFIG_PPC_970_NAP
+_GLOBAL(power4_idle_nap)
+   LOAD_REG_IMMEDIATE(r7, MSR_KERNEL|MSR_EE|MSR_POW)
+   ld  r9,PACA_THREAD_INFO(r13)
+   ld  r8,TI_LOCAL_FLAGS(r9)
+   ori r8,r8,_TLF_NAPPING
+   std r8,TI_LOCAL_FLAGS(r9)
+   /*
+* NAPPING bit is set, from this point onward power4_fixup_nap
+* will cause exceptions to return to power4_idle_nap_return.
+*/
+1: sync
+   isync
+   mtmsrd  r7
+   isync
+   b   1b