linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Nicholas Piggin <npiggin@gmail.com>
To: linuxppc-dev@lists.ozlabs.org
Cc: Nicholas Piggin <npiggin@gmail.com>
Subject: [PATCH v6 39/39] powerpc/64s: power4 nap fixup in C
Date: Sat, 16 Jan 2021 02:50:12 +1000	[thread overview]
Message-ID: <20210115165012.1260253-40-npiggin@gmail.com> (raw)
In-Reply-To: <20210115165012.1260253-1-npiggin@gmail.com>

There is no need for this to be in asm, use the new intrrupt entry wrapper.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 arch/powerpc/include/asm/interrupt.h   | 15 +++++++++
 arch/powerpc/include/asm/processor.h   |  1 +
 arch/powerpc/include/asm/thread_info.h |  6 ++++
 arch/powerpc/kernel/exceptions-64s.S   | 45 --------------------------
 arch/powerpc/kernel/idle_book3s.S      |  4 +++
 5 files changed, 26 insertions(+), 45 deletions(-)

diff --git a/arch/powerpc/include/asm/interrupt.h b/arch/powerpc/include/asm/interrupt.h
index 5e3b290bf3ae..c48ded0df2bc 100644
--- a/arch/powerpc/include/asm/interrupt.h
+++ b/arch/powerpc/include/asm/interrupt.h
@@ -8,6 +8,16 @@
 #include <asm/ftrace.h>
 #include <asm/runlatch.h>
 
+static inline void nap_adjust_return(struct pt_regs *regs)
+{
+#ifdef CONFIG_PPC_970_NAP
+	if (unlikely(test_thread_local_flags(_TLF_NAPPING))) {
+		clear_thread_local_flags(_TLF_NAPPING);
+		regs->nip = (unsigned long)power4_idle_nap_return;
+	}
+#endif
+}
+
 struct interrupt_state {
 #ifdef CONFIG_PPC_BOOK3E_64
 	enum ctx_state ctx_state;
@@ -98,6 +108,9 @@ static inline void interrupt_async_exit_prepare(struct pt_regs *regs, struct int
 {
 	irq_exit();
 	interrupt_exit_prepare(regs, state);
+
+	/* Adjust at exit so the main handler sees the true NIA */
+	nap_adjust_return(regs);
 }
 
 struct interrupt_nmi_state {
@@ -149,6 +162,8 @@ static inline void interrupt_nmi_exit_prepare(struct pt_regs *regs, struct inter
 			radix_enabled() || (mfmsr() & MSR_DR))
 		nmi_exit();
 
+	nap_adjust_return(regs);
+
 #ifdef CONFIG_PPC64
 	this_cpu_set_ftrace_enabled(state->ftrace_enabled);
 
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
index 8acc3590c971..eedc3c775141 100644
--- a/arch/powerpc/include/asm/processor.h
+++ b/arch/powerpc/include/asm/processor.h
@@ -393,6 +393,7 @@ 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);
+void power4_idle_nap_return(void);
 #endif
 
 extern unsigned long cpuidle_disable;
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h
index 386d576673a1..bf137151100b 100644
--- a/arch/powerpc/include/asm/thread_info.h
+++ b/arch/powerpc/include/asm/thread_info.h
@@ -152,6 +152,12 @@ void arch_setup_new_exec(void);
 
 #ifndef __ASSEMBLY__
 
+static inline void clear_thread_local_flags(unsigned int flags)
+{
+	struct thread_info *ti = current_thread_info();
+	ti->local_flags &= ~flags;
+}
+
 static inline bool test_thread_local_flags(unsigned int flags)
 {
 	struct thread_info *ti = current_thread_info();
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 27351276c54b..5478ffa85603 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -692,25 +692,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
 	ld	r1,GPR1(r1)
 .endm
 
-/*
- * When the idle code in power4_idle puts the CPU into NAP mode,
- * it has to do so in a loop, and relies on the external interrupt
- * and decrementer interrupt entry code to get it out of the loop.
- * It sets the _TLF_NAPPING bit in current_thread_info()->local_flags
- * to signal that it is in the loop and needs help to get out.
- */
-#ifdef CONFIG_PPC_970_NAP
-#define FINISH_NAP				\
-BEGIN_FTR_SECTION				\
-	ld	r11, PACA_THREAD_INFO(r13);	\
-	ld	r9,TI_LOCAL_FLAGS(r11);		\
-	andi.	r10,r9,_TLF_NAPPING;		\
-	bnel	power4_fixup_nap;		\
-END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP)
-#else
-#define FINISH_NAP
-#endif
-
 /*
  * There are a few constraints to be concerned with.
  * - Real mode exceptions code/data must be located at their physical location.
@@ -1248,7 +1229,6 @@ EXC_COMMON_BEGIN(machine_check_common)
 	 */
 	GEN_COMMON machine_check
 
-	FINISH_NAP
 	/* Enable MSR_RI when finished with PACA_EXMC */
 	li	r10,MSR_RI
 	mtmsrd 	r10,1
@@ -1576,7 +1556,6 @@ EXC_VIRT_BEGIN(hardware_interrupt, 0x4500, 0x100)
 EXC_VIRT_END(hardware_interrupt, 0x4500, 0x100)
 EXC_COMMON_BEGIN(hardware_interrupt_common)
 	GEN_COMMON hardware_interrupt
-	FINISH_NAP
 	addi	r3,r1,STACK_FRAME_OVERHEAD
 	bl	do_IRQ
 	b	interrupt_return
@@ -1761,7 +1740,6 @@ EXC_VIRT_BEGIN(decrementer, 0x4900, 0x80)
 EXC_VIRT_END(decrementer, 0x4900, 0x80)
 EXC_COMMON_BEGIN(decrementer_common)
 	GEN_COMMON decrementer
-	FINISH_NAP
 	addi	r3,r1,STACK_FRAME_OVERHEAD
 	bl	timer_interrupt
 	b	interrupt_return
@@ -1846,7 +1824,6 @@ EXC_VIRT_BEGIN(doorbell_super, 0x4a00, 0x100)
 EXC_VIRT_END(doorbell_super, 0x4a00, 0x100)
 EXC_COMMON_BEGIN(doorbell_super_common)
 	GEN_COMMON doorbell_super
-	FINISH_NAP
 	addi	r3,r1,STACK_FRAME_OVERHEAD
 #ifdef CONFIG_PPC_DOORBELL
 	bl	doorbell_exception
@@ -2200,7 +2177,6 @@ EXC_COMMON_BEGIN(hmi_exception_early_common)
 
 EXC_COMMON_BEGIN(hmi_exception_common)
 	GEN_COMMON hmi_exception
-	FINISH_NAP
 	addi	r3,r1,STACK_FRAME_OVERHEAD
 	bl	handle_hmi_exception
 	b	interrupt_return
@@ -2229,7 +2205,6 @@ EXC_VIRT_BEGIN(h_doorbell, 0x4e80, 0x20)
 EXC_VIRT_END(h_doorbell, 0x4e80, 0x20)
 EXC_COMMON_BEGIN(h_doorbell_common)
 	GEN_COMMON h_doorbell
-	FINISH_NAP
 	addi	r3,r1,STACK_FRAME_OVERHEAD
 #ifdef CONFIG_PPC_DOORBELL
 	bl	doorbell_exception
@@ -2262,7 +2237,6 @@ EXC_VIRT_BEGIN(h_virt_irq, 0x4ea0, 0x20)
 EXC_VIRT_END(h_virt_irq, 0x4ea0, 0x20)
 EXC_COMMON_BEGIN(h_virt_irq_common)
 	GEN_COMMON h_virt_irq
-	FINISH_NAP
 	addi	r3,r1,STACK_FRAME_OVERHEAD
 	bl	do_IRQ
 	b	interrupt_return
@@ -2308,7 +2282,6 @@ EXC_VIRT_BEGIN(performance_monitor, 0x4f00, 0x20)
 EXC_VIRT_END(performance_monitor, 0x4f00, 0x20)
 EXC_COMMON_BEGIN(performance_monitor_common)
 	GEN_COMMON performance_monitor
-	FINISH_NAP
 	addi	r3,r1,STACK_FRAME_OVERHEAD
 	bl	performance_monitor_exception
 	b	interrupt_return
@@ -3059,24 +3032,6 @@ USE_FIXED_SECTION(virt_trampolines)
 __end_interrupts:
 DEFINE_FIXED_SYMBOL(__end_interrupts)
 
-#ifdef CONFIG_PPC_970_NAP
-	/*
-	 * Called by exception entry code if _TLF_NAPPING was set, this clears
-	 * the NAPPING flag, and redirects the exception exit to
-	 * power4_fixup_nap_return.
-	 */
-	.globl power4_fixup_nap
-EXC_COMMON_BEGIN(power4_fixup_nap)
-	andc	r9,r9,r10
-	std	r9,TI_LOCAL_FLAGS(r11)
-	LOAD_REG_ADDR(r10, power4_idle_nap_return)
-	std	r10,_NIP(r1)
-	blr
-
-power4_idle_nap_return:
-	blr
-#endif
-
 CLOSE_FIXED_SECTION(real_vectors);
 CLOSE_FIXED_SECTION(real_trampolines);
 CLOSE_FIXED_SECTION(virt_vectors);
diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S
index 22f249b6f58d..27d2e6a72ec9 100644
--- a/arch/powerpc/kernel/idle_book3s.S
+++ b/arch/powerpc/kernel/idle_book3s.S
@@ -201,4 +201,8 @@ _GLOBAL(power4_idle_nap)
 	mtmsrd	r7
 	isync
 	b	1b
+
+	.globl power4_idle_nap_return
+power4_idle_nap_return:
+	blr
 #endif
-- 
2.23.0


      parent reply	other threads:[~2021-01-15 18:32 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-15 16:49 [PATCH v6 00/39] powerpc: interrupt wrappers Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 01/39] KVM: PPC: Book3S HV: Context tracking exit guest context before enabling irqs Nicholas Piggin
2021-01-16 10:38   ` Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 02/39] powerpc/32s: move DABR match out of handle_page_fault Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 03/39] powerpc/64s: " Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 04/39] powerpc/64s: move the hash fault handling logic to C Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 05/39] powerpc: remove arguments from fault handler functions Nicholas Piggin
2021-01-27  6:38   ` Christophe Leroy
2021-01-28  0:05     ` Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 06/39] powerpc: do_break get registers from regs Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 07/39] powerpc: bad_page_fault " Nicholas Piggin
2021-01-15 17:09   ` Christophe Leroy
2021-01-16  0:42     ` Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 08/39] powerpc: rearrange do_page_fault error case to be inside exception_enter Nicholas Piggin
2021-01-28  9:25   ` Christophe Leroy
2021-01-15 16:49 ` [PATCH v6 09/39] powerpc/64s: move bad_page_fault handling to C Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 10/39] powerpc/64s: split do_hash_fault Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 11/39] powerpc/mm: Remove stale do_page_fault comment referring to SLB faults Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 12/39] powerpc/64s: slb comment update Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 13/39] powerpc/traps: add NOKPROBE_SYMBOL for sreset and mce Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 14/39] powerpc/perf: move perf irq/nmi handling details into traps.c Nicholas Piggin
2021-01-19 10:24   ` Athira Rajeev
2021-01-20  3:09     ` Nicholas Piggin
2021-01-20  4:21       ` Nicholas Piggin
2021-01-27  5:49       ` Athira Rajeev
2021-01-15 16:49 ` [PATCH v6 15/39] powerpc/time: move timer_broadcast_interrupt prototype to asm/time.h Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 16/39] powerpc: add and use unknown_async_exception Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 17/39] powerpc/fsl_booke/32: CacheLockingException remove args Nicholas Piggin
2021-01-15 17:14   ` Christophe Leroy
2021-01-16  0:43     ` Nicholas Piggin
2021-01-16  7:38       ` Christophe Leroy
2021-01-16 10:34         ` Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 18/39] powerpc: DebugException " Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 19/39] powerpc/cell: tidy up pervasive declarations Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 20/39] powerpc: introduce die_mce Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 21/39] powerpc/mce: ensure machine check handler always tests RI Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 22/39] powerpc: improve handling of unrecoverable system reset Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 23/39] powerpc: interrupt handler wrapper functions Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 24/39] powerpc: add interrupt wrapper entry / exit stub functions Nicholas Piggin
2021-01-15 16:49 ` [PATCH v6 25/39] powerpc: convert interrupt handlers to use wrappers Nicholas Piggin
2021-01-20 10:48   ` kernel test robot
2021-01-20 11:45   ` kernel test robot
2021-01-15 16:49 ` [PATCH v6 26/39] powerpc: add interrupt_cond_local_irq_enable helper Nicholas Piggin
2021-01-15 16:50 ` [PATCH v6 27/39] powerpc/64: context tracking remove _TIF_NOHZ Nicholas Piggin
2021-01-15 16:50 ` [PATCH v6 28/39] powerpc/64s/hash: improve context tracking of hash faults Nicholas Piggin
2021-01-15 16:50 ` [PATCH v6 29/39] powerpc/64: context tracking move to interrupt wrappers Nicholas Piggin
2021-01-15 16:50 ` [PATCH v6 30/39] powerpc/64: add context tracking to asynchronous interrupts Nicholas Piggin
2021-01-15 16:50 ` [PATCH v6 31/39] powerpc: handle irq_enter/irq_exit in interrupt handler wrappers Nicholas Piggin
2021-01-15 16:50 ` [PATCH v6 32/39] powerpc/64s: move context tracking exit to interrupt exit path Nicholas Piggin
2021-01-15 16:50 ` [PATCH v6 33/39] powerpc/64s: reconcile interrupts in C Nicholas Piggin
2021-01-15 16:50 ` [PATCH v6 34/39] powerpc/64: move account_stolen_time into its own function Nicholas Piggin
2021-01-15 16:50 ` [PATCH v6 35/39] powerpc/64: entry cpu time accounting in C Nicholas Piggin
2021-01-15 16:50 ` [PATCH v6 36/39] powerpc: move NMI entry/exit code into wrapper Nicholas Piggin
2021-01-15 16:50 ` [PATCH v6 37/39] powerpc/64s: move NMI soft-mask handling to C Nicholas Piggin
2021-01-15 16:50 ` [PATCH v6 38/39] powerpc/64s: runlatch interrupt handling in C Nicholas Piggin
2021-01-15 16:50 ` Nicholas Piggin [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210115165012.1260253-40-npiggin@gmail.com \
    --to=npiggin@gmail.com \
    --cc=linuxppc-dev@lists.ozlabs.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).