powersave.S (1246B)
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Copyright (C) 2006-2007 PA Semi, Inc 4 * 5 * Maintained by: Olof Johansson <olof@lixom.net> 6 */ 7 8#include <asm/processor.h> 9#include <asm/page.h> 10#include <asm/ppc_asm.h> 11#include <asm/cputable.h> 12#include <asm/cache.h> 13#include <asm/thread_info.h> 14#include <asm/asm-offsets.h> 15 16/* Power savings opcodes since not all binutils have them at this time */ 17#define DOZE .long 0x4c000324 18#define NAP .long 0x4c000364 19#define SLEEP .long 0x4c0003a4 20#define RVW .long 0x4c0003e4 21 22/* Common sequence to do before going to any of the 23 * powersavings modes. 24 */ 25 26#define PRE_SLEEP_SEQUENCE \ 27 std r3,8(r1); \ 28 ptesync ; \ 29 ld r3,8(r1); \ 301: cmpd r3,r3; \ 31 bne 1b 32 33_doze: 34 PRE_SLEEP_SEQUENCE 35 DOZE 36 b . 37 38 39_GLOBAL(idle_spin) 40 blr 41 42_GLOBAL(idle_doze) 43 LOAD_REG_ADDR(r3, _doze) 44 b sleep_common 45 46/* Add more modes here later */ 47 48sleep_common: 49 mflr r0 50 std r0, 16(r1) 51 stdu r1,-64(r1) 52#ifdef CONFIG_PPC_PASEMI_CPUFREQ 53 std r3, 48(r1) 54 55 /* Only do power savings when in astate 0 */ 56 bl check_astate 57 cmpwi r3,0 58 bne 1f 59 60 ld r3, 48(r1) 61#endif 62 LOAD_REG_IMMEDIATE(r6,MSR_DR|MSR_IR|MSR_ME|MSR_EE) 63 mfmsr r4 64 andc r5,r4,r6 65 mtmsrd r5,0 66 67 mtctr r3 68 bctrl 69 70 mtmsrd r4,0 71 721: addi r1,r1,64 73 ld r0,16(r1) 74 mtlr r0 75 blr 76