mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 16:54:20 +08:00
2874c5fd28
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license as published by the free software foundation either version 2 of the license or at your option any later version extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 3029 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190527070032.746973796@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
84 lines
2.0 KiB
ArmAsm
84 lines
2.0 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* This file contains the power_save function for 970-family CPUs.
|
|
*/
|
|
|
|
#include <linux/threads.h>
|
|
#include <asm/processor.h>
|
|
#include <asm/page.h>
|
|
#include <asm/cputable.h>
|
|
#include <asm/thread_info.h>
|
|
#include <asm/ppc_asm.h>
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/irqflags.h>
|
|
#include <asm/hw_irq.h>
|
|
#include <asm/feature-fixups.h>
|
|
|
|
#undef DEBUG
|
|
|
|
.text
|
|
|
|
_GLOBAL(power4_idle)
|
|
BEGIN_FTR_SECTION
|
|
blr
|
|
END_FTR_SECTION_IFCLR(CPU_FTR_CAN_NAP)
|
|
/* Now check if user or arch enabled NAP mode */
|
|
LOAD_REG_ADDRBASE(r3,powersave_nap)
|
|
lwz r4,ADDROFF(powersave_nap)(r3)
|
|
cmpwi 0,r4,0
|
|
beqlr
|
|
|
|
/* This sequence is similar to prep_irq_for_idle() */
|
|
|
|
/* Hard disable interrupts */
|
|
mfmsr r7
|
|
rldicl r0,r7,48,1
|
|
rotldi r0,r0,16
|
|
mtmsrd r0,1
|
|
|
|
/* Check if something happened while soft-disabled */
|
|
lbz r0,PACAIRQHAPPENED(r13)
|
|
cmpwi cr0,r0,0
|
|
bne- 2f
|
|
|
|
/*
|
|
* Soft-enable interrupts. This will make power4_fixup_nap return
|
|
* to our caller with interrupts enabled (soft and hard). The caller
|
|
* can cope with either interrupts disabled or enabled upon return.
|
|
*/
|
|
#ifdef CONFIG_TRACE_IRQFLAGS
|
|
/* Tell the tracer interrupts are on, because idle responds to them. */
|
|
mflr r0
|
|
std r0,16(r1)
|
|
stdu r1,-128(r1)
|
|
bl trace_hardirqs_on
|
|
addi r1,r1,128
|
|
ld r0,16(r1)
|
|
mtlr r0
|
|
mfmsr r7
|
|
#endif /* CONFIG_TRACE_IRQFLAGS */
|
|
|
|
li r0,IRQS_ENABLED
|
|
stb r0,PACAIRQSOFTMASK(r13) /* we'll hard-enable shortly */
|
|
BEGIN_FTR_SECTION
|
|
DSSALL
|
|
sync
|
|
END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
|
ld r9, PACA_THREAD_INFO(r13)
|
|
ld r8,TI_LOCAL_FLAGS(r9) /* set napping bit */
|
|
ori r8,r8,_TLF_NAPPING /* so when we take an exception */
|
|
std r8,TI_LOCAL_FLAGS(r9) /* it will return to our caller */
|
|
ori r7,r7,MSR_EE
|
|
oris r7,r7,MSR_POW@h
|
|
1: sync
|
|
isync
|
|
mtmsrd r7
|
|
isync
|
|
b 1b
|
|
|
|
2: /* Return if an interrupt had happened while soft disabled */
|
|
/* Set the HARD_DIS flag because interrupts are now hard disabled */
|
|
ori r0,r0,PACA_IRQ_HARD_DIS
|
|
stb r0,PACAIRQHAPPENED(r13)
|
|
blr
|