powerpc/irq: Rework helpers that manipulate MSR[EE/RI]
In preparation of porting PPC32 to C syscall entry/exit, rewrite the following helpers as static inline functions and add support for PPC32 in them: __hard_irq_enable() __hard_irq_disable() __hard_EE_RI_disable() __hard_RI_enable() Then use them in PPC32 version of arch_local_irq_disable() and arch_local_irq_enable() to avoid code duplication. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Reviewed-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/0e290372a0e7dc2ae657b4a01aec85f8de7fdf77.1612796617.git.christophe.leroy@csgroup.eu
This commit is contained in:
parent
fb5608fd11
commit
08353779f2
@ -50,6 +50,55 @@
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
static inline void __hard_irq_enable(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_BOOKE) || IS_ENABLED(CONFIG_40x))
|
||||
wrtee(MSR_EE);
|
||||
else if (IS_ENABLED(CONFIG_PPC_8xx))
|
||||
wrtspr(SPRN_EIE);
|
||||
else if (IS_ENABLED(CONFIG_PPC_BOOK3S_64))
|
||||
__mtmsrd(MSR_EE | MSR_RI, 1);
|
||||
else
|
||||
mtmsr(mfmsr() | MSR_EE);
|
||||
}
|
||||
|
||||
static inline void __hard_irq_disable(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_BOOKE) || IS_ENABLED(CONFIG_40x))
|
||||
wrtee(0);
|
||||
else if (IS_ENABLED(CONFIG_PPC_8xx))
|
||||
wrtspr(SPRN_EID);
|
||||
else if (IS_ENABLED(CONFIG_PPC_BOOK3S_64))
|
||||
__mtmsrd(MSR_RI, 1);
|
||||
else
|
||||
mtmsr(mfmsr() & ~MSR_EE);
|
||||
}
|
||||
|
||||
static inline void __hard_EE_RI_disable(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_BOOKE) || IS_ENABLED(CONFIG_40x))
|
||||
wrtee(0);
|
||||
else if (IS_ENABLED(CONFIG_PPC_8xx))
|
||||
wrtspr(SPRN_NRI);
|
||||
else if (IS_ENABLED(CONFIG_PPC_BOOK3S_64))
|
||||
__mtmsrd(0, 1);
|
||||
else
|
||||
mtmsr(mfmsr() & ~(MSR_EE | MSR_RI));
|
||||
}
|
||||
|
||||
static inline void __hard_RI_enable(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_BOOKE) || IS_ENABLED(CONFIG_40x))
|
||||
return;
|
||||
|
||||
if (IS_ENABLED(CONFIG_PPC_8xx))
|
||||
wrtspr(SPRN_EID);
|
||||
else if (IS_ENABLED(CONFIG_PPC_BOOK3S_64))
|
||||
__mtmsrd(MSR_RI, 1);
|
||||
else
|
||||
mtmsr(mfmsr() | MSR_RI);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
#include <asm/paca.h>
|
||||
|
||||
@ -212,18 +261,6 @@ static inline bool arch_irqs_disabled(void)
|
||||
|
||||
#endif /* CONFIG_PPC_BOOK3S */
|
||||
|
||||
#ifdef CONFIG_PPC_BOOK3E
|
||||
#define __hard_irq_enable() wrtee(MSR_EE)
|
||||
#define __hard_irq_disable() wrtee(0)
|
||||
#define __hard_EE_RI_disable() wrtee(0)
|
||||
#define __hard_RI_enable() do { } while (0)
|
||||
#else
|
||||
#define __hard_irq_enable() __mtmsrd(MSR_EE|MSR_RI, 1)
|
||||
#define __hard_irq_disable() __mtmsrd(MSR_RI, 1)
|
||||
#define __hard_EE_RI_disable() __mtmsrd(0, 1)
|
||||
#define __hard_RI_enable() __mtmsrd(MSR_RI, 1)
|
||||
#endif
|
||||
|
||||
#define hard_irq_disable() do { \
|
||||
unsigned long flags; \
|
||||
__hard_irq_disable(); \
|
||||
@ -322,22 +359,12 @@ static inline unsigned long arch_local_irq_save(void)
|
||||
|
||||
static inline void arch_local_irq_disable(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_BOOKE))
|
||||
wrtee(0);
|
||||
else if (IS_ENABLED(CONFIG_PPC_8xx))
|
||||
wrtspr(SPRN_EID);
|
||||
else
|
||||
mtmsr(mfmsr() & ~MSR_EE);
|
||||
__hard_irq_disable();
|
||||
}
|
||||
|
||||
static inline void arch_local_irq_enable(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_BOOKE))
|
||||
wrtee(MSR_EE);
|
||||
else if (IS_ENABLED(CONFIG_PPC_8xx))
|
||||
wrtspr(SPRN_EIE);
|
||||
else
|
||||
mtmsr(mfmsr() | MSR_EE);
|
||||
__hard_irq_enable();
|
||||
}
|
||||
|
||||
static inline bool arch_irqs_disabled_flags(unsigned long flags)
|
||||
|
@ -1375,6 +1375,7 @@
|
||||
#define mtmsr(v) asm volatile("mtmsr %0" : \
|
||||
: "r" ((unsigned long)(v)) \
|
||||
: "memory")
|
||||
#define __mtmsrd(v, l) BUILD_BUG()
|
||||
#define __MTMSR "mtmsr"
|
||||
#endif
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user