1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * Enter and leave deep sleep state on MPC83xx 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2006-2008 Freescale Semiconductor, Inc. 6*4882a593Smuzhiyun * Author: Scott Wood <scottwood@freescale.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun#include <asm/page.h> 10*4882a593Smuzhiyun#include <asm/ppc_asm.h> 11*4882a593Smuzhiyun#include <asm/reg.h> 12*4882a593Smuzhiyun#include <asm/asm-offsets.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun#define SS_MEMSAVE 0x00 /* First 8 bytes of RAM */ 15*4882a593Smuzhiyun#define SS_HID 0x08 /* 3 HIDs */ 16*4882a593Smuzhiyun#define SS_IABR 0x14 /* 2 IABRs */ 17*4882a593Smuzhiyun#define SS_IBCR 0x1c 18*4882a593Smuzhiyun#define SS_DABR 0x20 /* 2 DABRs */ 19*4882a593Smuzhiyun#define SS_DBCR 0x28 20*4882a593Smuzhiyun#define SS_SP 0x2c 21*4882a593Smuzhiyun#define SS_SR 0x30 /* 16 segment registers */ 22*4882a593Smuzhiyun#define SS_R2 0x70 23*4882a593Smuzhiyun#define SS_MSR 0x74 24*4882a593Smuzhiyun#define SS_SDR1 0x78 25*4882a593Smuzhiyun#define SS_LR 0x7c 26*4882a593Smuzhiyun#define SS_SPRG 0x80 /* 8 SPRGs */ 27*4882a593Smuzhiyun#define SS_DBAT 0xa0 /* 8 DBATs */ 28*4882a593Smuzhiyun#define SS_IBAT 0xe0 /* 8 IBATs */ 29*4882a593Smuzhiyun#define SS_TB 0x120 30*4882a593Smuzhiyun#define SS_CR 0x128 31*4882a593Smuzhiyun#define SS_GPREG 0x12c /* r12-r31 */ 32*4882a593Smuzhiyun#define STATE_SAVE_SIZE 0x17c 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun .section .data 35*4882a593Smuzhiyun .align 5 36*4882a593Smuzhiyun 37*4882a593Smuzhiyunmpc83xx_sleep_save_area: 38*4882a593Smuzhiyun .space STATE_SAVE_SIZE 39*4882a593Smuzhiyunimmrbase: 40*4882a593Smuzhiyun .long 0 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun .section .text 43*4882a593Smuzhiyun .align 5 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* r3 = physical address of IMMR */ 46*4882a593Smuzhiyun_GLOBAL(mpc83xx_enter_deep_sleep) 47*4882a593Smuzhiyun lis r4, immrbase@ha 48*4882a593Smuzhiyun stw r3, immrbase@l(r4) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* The first 2 words of memory are used to communicate with the 51*4882a593Smuzhiyun * bootloader, to tell it how to resume. 52*4882a593Smuzhiyun * 53*4882a593Smuzhiyun * The first word is the magic number 0xf5153ae5, and the second 54*4882a593Smuzhiyun * is the pointer to mpc83xx_deep_resume. 55*4882a593Smuzhiyun * 56*4882a593Smuzhiyun * The original content of these two words is saved in SS_MEMSAVE. 57*4882a593Smuzhiyun */ 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun lis r3, mpc83xx_sleep_save_area@h 60*4882a593Smuzhiyun ori r3, r3, mpc83xx_sleep_save_area@l 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun lis r4, KERNELBASE@h 63*4882a593Smuzhiyun lwz r5, 0(r4) 64*4882a593Smuzhiyun lwz r6, 4(r4) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun stw r5, SS_MEMSAVE+0(r3) 67*4882a593Smuzhiyun stw r6, SS_MEMSAVE+4(r3) 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun mfspr r5, SPRN_HID0 70*4882a593Smuzhiyun mfspr r6, SPRN_HID1 71*4882a593Smuzhiyun mfspr r7, SPRN_HID2 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun stw r5, SS_HID+0(r3) 74*4882a593Smuzhiyun stw r6, SS_HID+4(r3) 75*4882a593Smuzhiyun stw r7, SS_HID+8(r3) 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun mfspr r4, SPRN_IABR 78*4882a593Smuzhiyun mfspr r5, SPRN_IABR2 79*4882a593Smuzhiyun mfspr r6, SPRN_IBCR 80*4882a593Smuzhiyun mfspr r7, SPRN_DABR 81*4882a593Smuzhiyun mfspr r8, SPRN_DABR2 82*4882a593Smuzhiyun mfspr r9, SPRN_DBCR 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun stw r4, SS_IABR+0(r3) 85*4882a593Smuzhiyun stw r5, SS_IABR+4(r3) 86*4882a593Smuzhiyun stw r6, SS_IBCR(r3) 87*4882a593Smuzhiyun stw r7, SS_DABR+0(r3) 88*4882a593Smuzhiyun stw r8, SS_DABR+4(r3) 89*4882a593Smuzhiyun stw r9, SS_DBCR(r3) 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun mfspr r4, SPRN_SPRG0 92*4882a593Smuzhiyun mfspr r5, SPRN_SPRG1 93*4882a593Smuzhiyun mfspr r6, SPRN_SPRG2 94*4882a593Smuzhiyun mfspr r7, SPRN_SPRG3 95*4882a593Smuzhiyun mfsdr1 r8 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun stw r4, SS_SPRG+0(r3) 98*4882a593Smuzhiyun stw r5, SS_SPRG+4(r3) 99*4882a593Smuzhiyun stw r6, SS_SPRG+8(r3) 100*4882a593Smuzhiyun stw r7, SS_SPRG+12(r3) 101*4882a593Smuzhiyun stw r8, SS_SDR1(r3) 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun mfspr r4, SPRN_SPRG4 104*4882a593Smuzhiyun mfspr r5, SPRN_SPRG5 105*4882a593Smuzhiyun mfspr r6, SPRN_SPRG6 106*4882a593Smuzhiyun mfspr r7, SPRN_SPRG7 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun stw r4, SS_SPRG+16(r3) 109*4882a593Smuzhiyun stw r5, SS_SPRG+20(r3) 110*4882a593Smuzhiyun stw r6, SS_SPRG+24(r3) 111*4882a593Smuzhiyun stw r7, SS_SPRG+28(r3) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun mfspr r4, SPRN_DBAT0U 114*4882a593Smuzhiyun mfspr r5, SPRN_DBAT0L 115*4882a593Smuzhiyun mfspr r6, SPRN_DBAT1U 116*4882a593Smuzhiyun mfspr r7, SPRN_DBAT1L 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun stw r4, SS_DBAT+0x00(r3) 119*4882a593Smuzhiyun stw r5, SS_DBAT+0x04(r3) 120*4882a593Smuzhiyun stw r6, SS_DBAT+0x08(r3) 121*4882a593Smuzhiyun stw r7, SS_DBAT+0x0c(r3) 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun mfspr r4, SPRN_DBAT2U 124*4882a593Smuzhiyun mfspr r5, SPRN_DBAT2L 125*4882a593Smuzhiyun mfspr r6, SPRN_DBAT3U 126*4882a593Smuzhiyun mfspr r7, SPRN_DBAT3L 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun stw r4, SS_DBAT+0x10(r3) 129*4882a593Smuzhiyun stw r5, SS_DBAT+0x14(r3) 130*4882a593Smuzhiyun stw r6, SS_DBAT+0x18(r3) 131*4882a593Smuzhiyun stw r7, SS_DBAT+0x1c(r3) 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun mfspr r4, SPRN_DBAT4U 134*4882a593Smuzhiyun mfspr r5, SPRN_DBAT4L 135*4882a593Smuzhiyun mfspr r6, SPRN_DBAT5U 136*4882a593Smuzhiyun mfspr r7, SPRN_DBAT5L 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun stw r4, SS_DBAT+0x20(r3) 139*4882a593Smuzhiyun stw r5, SS_DBAT+0x24(r3) 140*4882a593Smuzhiyun stw r6, SS_DBAT+0x28(r3) 141*4882a593Smuzhiyun stw r7, SS_DBAT+0x2c(r3) 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun mfspr r4, SPRN_DBAT6U 144*4882a593Smuzhiyun mfspr r5, SPRN_DBAT6L 145*4882a593Smuzhiyun mfspr r6, SPRN_DBAT7U 146*4882a593Smuzhiyun mfspr r7, SPRN_DBAT7L 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun stw r4, SS_DBAT+0x30(r3) 149*4882a593Smuzhiyun stw r5, SS_DBAT+0x34(r3) 150*4882a593Smuzhiyun stw r6, SS_DBAT+0x38(r3) 151*4882a593Smuzhiyun stw r7, SS_DBAT+0x3c(r3) 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun mfspr r4, SPRN_IBAT0U 154*4882a593Smuzhiyun mfspr r5, SPRN_IBAT0L 155*4882a593Smuzhiyun mfspr r6, SPRN_IBAT1U 156*4882a593Smuzhiyun mfspr r7, SPRN_IBAT1L 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun stw r4, SS_IBAT+0x00(r3) 159*4882a593Smuzhiyun stw r5, SS_IBAT+0x04(r3) 160*4882a593Smuzhiyun stw r6, SS_IBAT+0x08(r3) 161*4882a593Smuzhiyun stw r7, SS_IBAT+0x0c(r3) 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun mfspr r4, SPRN_IBAT2U 164*4882a593Smuzhiyun mfspr r5, SPRN_IBAT2L 165*4882a593Smuzhiyun mfspr r6, SPRN_IBAT3U 166*4882a593Smuzhiyun mfspr r7, SPRN_IBAT3L 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun stw r4, SS_IBAT+0x10(r3) 169*4882a593Smuzhiyun stw r5, SS_IBAT+0x14(r3) 170*4882a593Smuzhiyun stw r6, SS_IBAT+0x18(r3) 171*4882a593Smuzhiyun stw r7, SS_IBAT+0x1c(r3) 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun mfspr r4, SPRN_IBAT4U 174*4882a593Smuzhiyun mfspr r5, SPRN_IBAT4L 175*4882a593Smuzhiyun mfspr r6, SPRN_IBAT5U 176*4882a593Smuzhiyun mfspr r7, SPRN_IBAT5L 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun stw r4, SS_IBAT+0x20(r3) 179*4882a593Smuzhiyun stw r5, SS_IBAT+0x24(r3) 180*4882a593Smuzhiyun stw r6, SS_IBAT+0x28(r3) 181*4882a593Smuzhiyun stw r7, SS_IBAT+0x2c(r3) 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun mfspr r4, SPRN_IBAT6U 184*4882a593Smuzhiyun mfspr r5, SPRN_IBAT6L 185*4882a593Smuzhiyun mfspr r6, SPRN_IBAT7U 186*4882a593Smuzhiyun mfspr r7, SPRN_IBAT7L 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun stw r4, SS_IBAT+0x30(r3) 189*4882a593Smuzhiyun stw r5, SS_IBAT+0x34(r3) 190*4882a593Smuzhiyun stw r6, SS_IBAT+0x38(r3) 191*4882a593Smuzhiyun stw r7, SS_IBAT+0x3c(r3) 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun mfmsr r4 194*4882a593Smuzhiyun mflr r5 195*4882a593Smuzhiyun mfcr r6 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun stw r4, SS_MSR(r3) 198*4882a593Smuzhiyun stw r5, SS_LR(r3) 199*4882a593Smuzhiyun stw r6, SS_CR(r3) 200*4882a593Smuzhiyun stw r1, SS_SP(r3) 201*4882a593Smuzhiyun stw r2, SS_R2(r3) 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun1: mftbu r4 204*4882a593Smuzhiyun mftb r5 205*4882a593Smuzhiyun mftbu r6 206*4882a593Smuzhiyun cmpw r4, r6 207*4882a593Smuzhiyun bne 1b 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun stw r4, SS_TB+0(r3) 210*4882a593Smuzhiyun stw r5, SS_TB+4(r3) 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun stmw r12, SS_GPREG(r3) 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun li r4, 0 215*4882a593Smuzhiyun addi r6, r3, SS_SR-4 216*4882a593Smuzhiyun1: mfsrin r5, r4 217*4882a593Smuzhiyun stwu r5, 4(r6) 218*4882a593Smuzhiyun addis r4, r4, 0x1000 219*4882a593Smuzhiyun cmpwi r4, 0 220*4882a593Smuzhiyun bne 1b 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun /* Disable machine checks and critical exceptions */ 223*4882a593Smuzhiyun mfmsr r4 224*4882a593Smuzhiyun rlwinm r4, r4, 0, ~MSR_CE 225*4882a593Smuzhiyun rlwinm r4, r4, 0, ~MSR_ME 226*4882a593Smuzhiyun mtmsr r4 227*4882a593Smuzhiyun isync 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun#define TMP_VIRT_IMMR 0xf0000000 230*4882a593Smuzhiyun#define DEFAULT_IMMR_VALUE 0xff400000 231*4882a593Smuzhiyun#define IMMRBAR_BASE 0x0000 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun lis r4, immrbase@ha 234*4882a593Smuzhiyun lwz r4, immrbase@l(r4) 235*4882a593Smuzhiyun 236*4882a593Smuzhiyun /* Use DBAT0 to address the current IMMR space */ 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun ori r4, r4, 0x002a 239*4882a593Smuzhiyun mtspr SPRN_DBAT0L, r4 240*4882a593Smuzhiyun lis r8, TMP_VIRT_IMMR@h 241*4882a593Smuzhiyun ori r4, r8, 0x001e /* 1 MByte accessible from Kernel Space only */ 242*4882a593Smuzhiyun mtspr SPRN_DBAT0U, r4 243*4882a593Smuzhiyun isync 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun /* Use DBAT1 to address the original IMMR space */ 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun lis r4, DEFAULT_IMMR_VALUE@h 248*4882a593Smuzhiyun ori r4, r4, 0x002a 249*4882a593Smuzhiyun mtspr SPRN_DBAT1L, r4 250*4882a593Smuzhiyun lis r9, (TMP_VIRT_IMMR + 0x01000000)@h 251*4882a593Smuzhiyun ori r4, r9, 0x001e /* 1 MByte accessible from Kernel Space only */ 252*4882a593Smuzhiyun mtspr SPRN_DBAT1U, r4 253*4882a593Smuzhiyun isync 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun /* Use DBAT2 to address the beginning of RAM. This isn't done 256*4882a593Smuzhiyun * using the normal virtual mapping, because with page debugging 257*4882a593Smuzhiyun * enabled it will be read-only. 258*4882a593Smuzhiyun */ 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun li r4, 0x0002 261*4882a593Smuzhiyun mtspr SPRN_DBAT2L, r4 262*4882a593Smuzhiyun lis r4, KERNELBASE@h 263*4882a593Smuzhiyun ori r4, r4, 0x001e /* 1 MByte accessible from Kernel Space only */ 264*4882a593Smuzhiyun mtspr SPRN_DBAT2U, r4 265*4882a593Smuzhiyun isync 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun /* Flush the cache with our BAT, as there will be TLB misses 268*4882a593Smuzhiyun * otherwise if page debugging is enabled, and these misses 269*4882a593Smuzhiyun * will disturb the PLRU algorithm. 270*4882a593Smuzhiyun */ 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun bl __flush_disable_L1 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun /* Keep the i-cache enabled, so the hack below for low-boot 275*4882a593Smuzhiyun * flash will work. 276*4882a593Smuzhiyun */ 277*4882a593Smuzhiyun mfspr r3, SPRN_HID0 278*4882a593Smuzhiyun ori r3, r3, HID0_ICE 279*4882a593Smuzhiyun mtspr SPRN_HID0, r3 280*4882a593Smuzhiyun isync 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun lis r6, 0xf515 283*4882a593Smuzhiyun ori r6, r6, 0x3ae5 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun lis r7, mpc83xx_deep_resume@h 286*4882a593Smuzhiyun ori r7, r7, mpc83xx_deep_resume@l 287*4882a593Smuzhiyun tophys(r7, r7) 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun lis r5, KERNELBASE@h 290*4882a593Smuzhiyun stw r6, 0(r5) 291*4882a593Smuzhiyun stw r7, 4(r5) 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun /* Reset BARs */ 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun li r4, 0 296*4882a593Smuzhiyun stw r4, 0x0024(r8) 297*4882a593Smuzhiyun stw r4, 0x002c(r8) 298*4882a593Smuzhiyun stw r4, 0x0034(r8) 299*4882a593Smuzhiyun stw r4, 0x003c(r8) 300*4882a593Smuzhiyun stw r4, 0x0064(r8) 301*4882a593Smuzhiyun stw r4, 0x006c(r8) 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun /* Rev 1 of the 8313 has problems with wakeup events that are 304*4882a593Smuzhiyun * pending during the transition to deep sleep state (such as if 305*4882a593Smuzhiyun * the PCI host sets the state to D3 and then D0 in rapid 306*4882a593Smuzhiyun * succession). This check shrinks the race window somewhat. 307*4882a593Smuzhiyun * 308*4882a593Smuzhiyun * See erratum PCI23, though the problem is not limited 309*4882a593Smuzhiyun * to PCI. 310*4882a593Smuzhiyun */ 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun lwz r3, 0x0b04(r8) 313*4882a593Smuzhiyun andi. r3, r3, 1 314*4882a593Smuzhiyun bne- mpc83xx_deep_resume 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun /* Move IMMR back to the default location, following the 317*4882a593Smuzhiyun * procedure specified in the MPC8313 manual. 318*4882a593Smuzhiyun */ 319*4882a593Smuzhiyun lwz r4, IMMRBAR_BASE(r8) 320*4882a593Smuzhiyun isync 321*4882a593Smuzhiyun lis r4, DEFAULT_IMMR_VALUE@h 322*4882a593Smuzhiyun stw r4, IMMRBAR_BASE(r8) 323*4882a593Smuzhiyun lis r4, KERNELBASE@h 324*4882a593Smuzhiyun lwz r4, 0(r4) 325*4882a593Smuzhiyun isync 326*4882a593Smuzhiyun lwz r4, IMMRBAR_BASE(r9) 327*4882a593Smuzhiyun mr r8, r9 328*4882a593Smuzhiyun isync 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun /* Check the Reset Configuration Word to see whether flash needs 331*4882a593Smuzhiyun * to be mapped at a low address or a high address. 332*4882a593Smuzhiyun */ 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun lwz r4, 0x0904(r8) 335*4882a593Smuzhiyun andis. r4, r4, 0x0400 336*4882a593Smuzhiyun li r4, 0 337*4882a593Smuzhiyun beq boot_low 338*4882a593Smuzhiyun lis r4, 0xff80 339*4882a593Smuzhiyunboot_low: 340*4882a593Smuzhiyun stw r4, 0x0020(r8) 341*4882a593Smuzhiyun lis r7, 0x8000 342*4882a593Smuzhiyun ori r7, r7, 0x0016 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun mfspr r5, SPRN_HID0 345*4882a593Smuzhiyun rlwinm r5, r5, 0, ~(HID0_DOZE | HID0_NAP) 346*4882a593Smuzhiyun oris r5, r5, HID0_SLEEP@h 347*4882a593Smuzhiyun mtspr SPRN_HID0, r5 348*4882a593Smuzhiyun isync 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun mfmsr r5 351*4882a593Smuzhiyun oris r5, r5, MSR_POW@h 352*4882a593Smuzhiyun 353*4882a593Smuzhiyun /* Enable the flash mapping at the appropriate address. This 354*4882a593Smuzhiyun * mapping will override the RAM mapping if booting low, so there's 355*4882a593Smuzhiyun * no need to disable the latter. This must be done inside the same 356*4882a593Smuzhiyun * cache line as setting MSR_POW, so that no instruction fetches 357*4882a593Smuzhiyun * from RAM happen after the flash mapping is turned on. 358*4882a593Smuzhiyun */ 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun .align 5 361*4882a593Smuzhiyun stw r7, 0x0024(r8) 362*4882a593Smuzhiyun sync 363*4882a593Smuzhiyun isync 364*4882a593Smuzhiyun mtmsr r5 365*4882a593Smuzhiyun isync 366*4882a593Smuzhiyun1: b 1b 367*4882a593Smuzhiyun 368*4882a593Smuzhiyunmpc83xx_deep_resume: 369*4882a593Smuzhiyun lis r4, 1f@h 370*4882a593Smuzhiyun ori r4, r4, 1f@l 371*4882a593Smuzhiyun tophys(r4, r4) 372*4882a593Smuzhiyun mtsrr0 r4 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun mfmsr r4 375*4882a593Smuzhiyun rlwinm r4, r4, 0, ~(MSR_IR | MSR_DR) 376*4882a593Smuzhiyun mtsrr1 r4 377*4882a593Smuzhiyun 378*4882a593Smuzhiyun rfi 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun1: tlbia 381*4882a593Smuzhiyun bl __inval_enable_L1 382*4882a593Smuzhiyun 383*4882a593Smuzhiyun lis r3, mpc83xx_sleep_save_area@h 384*4882a593Smuzhiyun ori r3, r3, mpc83xx_sleep_save_area@l 385*4882a593Smuzhiyun tophys(r3, r3) 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun lwz r5, SS_MEMSAVE+0(r3) 388*4882a593Smuzhiyun lwz r6, SS_MEMSAVE+4(r3) 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun stw r5, 0(0) 391*4882a593Smuzhiyun stw r6, 4(0) 392*4882a593Smuzhiyun 393*4882a593Smuzhiyun lwz r5, SS_HID+0(r3) 394*4882a593Smuzhiyun lwz r6, SS_HID+4(r3) 395*4882a593Smuzhiyun lwz r7, SS_HID+8(r3) 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun mtspr SPRN_HID0, r5 398*4882a593Smuzhiyun mtspr SPRN_HID1, r6 399*4882a593Smuzhiyun mtspr SPRN_HID2, r7 400*4882a593Smuzhiyun 401*4882a593Smuzhiyun lwz r4, SS_IABR+0(r3) 402*4882a593Smuzhiyun lwz r5, SS_IABR+4(r3) 403*4882a593Smuzhiyun lwz r6, SS_IBCR(r3) 404*4882a593Smuzhiyun lwz r7, SS_DABR+0(r3) 405*4882a593Smuzhiyun lwz r8, SS_DABR+4(r3) 406*4882a593Smuzhiyun lwz r9, SS_DBCR(r3) 407*4882a593Smuzhiyun 408*4882a593Smuzhiyun mtspr SPRN_IABR, r4 409*4882a593Smuzhiyun mtspr SPRN_IABR2, r5 410*4882a593Smuzhiyun mtspr SPRN_IBCR, r6 411*4882a593Smuzhiyun mtspr SPRN_DABR, r7 412*4882a593Smuzhiyun mtspr SPRN_DABR2, r8 413*4882a593Smuzhiyun mtspr SPRN_DBCR, r9 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun li r4, 0 416*4882a593Smuzhiyun addi r6, r3, SS_SR-4 417*4882a593Smuzhiyun1: lwzu r5, 4(r6) 418*4882a593Smuzhiyun mtsrin r5, r4 419*4882a593Smuzhiyun addis r4, r4, 0x1000 420*4882a593Smuzhiyun cmpwi r4, 0 421*4882a593Smuzhiyun bne 1b 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun lwz r4, SS_DBAT+0x00(r3) 424*4882a593Smuzhiyun lwz r5, SS_DBAT+0x04(r3) 425*4882a593Smuzhiyun lwz r6, SS_DBAT+0x08(r3) 426*4882a593Smuzhiyun lwz r7, SS_DBAT+0x0c(r3) 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun mtspr SPRN_DBAT0U, r4 429*4882a593Smuzhiyun mtspr SPRN_DBAT0L, r5 430*4882a593Smuzhiyun mtspr SPRN_DBAT1U, r6 431*4882a593Smuzhiyun mtspr SPRN_DBAT1L, r7 432*4882a593Smuzhiyun 433*4882a593Smuzhiyun lwz r4, SS_DBAT+0x10(r3) 434*4882a593Smuzhiyun lwz r5, SS_DBAT+0x14(r3) 435*4882a593Smuzhiyun lwz r6, SS_DBAT+0x18(r3) 436*4882a593Smuzhiyun lwz r7, SS_DBAT+0x1c(r3) 437*4882a593Smuzhiyun 438*4882a593Smuzhiyun mtspr SPRN_DBAT2U, r4 439*4882a593Smuzhiyun mtspr SPRN_DBAT2L, r5 440*4882a593Smuzhiyun mtspr SPRN_DBAT3U, r6 441*4882a593Smuzhiyun mtspr SPRN_DBAT3L, r7 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun lwz r4, SS_DBAT+0x20(r3) 444*4882a593Smuzhiyun lwz r5, SS_DBAT+0x24(r3) 445*4882a593Smuzhiyun lwz r6, SS_DBAT+0x28(r3) 446*4882a593Smuzhiyun lwz r7, SS_DBAT+0x2c(r3) 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun mtspr SPRN_DBAT4U, r4 449*4882a593Smuzhiyun mtspr SPRN_DBAT4L, r5 450*4882a593Smuzhiyun mtspr SPRN_DBAT5U, r6 451*4882a593Smuzhiyun mtspr SPRN_DBAT5L, r7 452*4882a593Smuzhiyun 453*4882a593Smuzhiyun lwz r4, SS_DBAT+0x30(r3) 454*4882a593Smuzhiyun lwz r5, SS_DBAT+0x34(r3) 455*4882a593Smuzhiyun lwz r6, SS_DBAT+0x38(r3) 456*4882a593Smuzhiyun lwz r7, SS_DBAT+0x3c(r3) 457*4882a593Smuzhiyun 458*4882a593Smuzhiyun mtspr SPRN_DBAT6U, r4 459*4882a593Smuzhiyun mtspr SPRN_DBAT6L, r5 460*4882a593Smuzhiyun mtspr SPRN_DBAT7U, r6 461*4882a593Smuzhiyun mtspr SPRN_DBAT7L, r7 462*4882a593Smuzhiyun 463*4882a593Smuzhiyun lwz r4, SS_IBAT+0x00(r3) 464*4882a593Smuzhiyun lwz r5, SS_IBAT+0x04(r3) 465*4882a593Smuzhiyun lwz r6, SS_IBAT+0x08(r3) 466*4882a593Smuzhiyun lwz r7, SS_IBAT+0x0c(r3) 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun mtspr SPRN_IBAT0U, r4 469*4882a593Smuzhiyun mtspr SPRN_IBAT0L, r5 470*4882a593Smuzhiyun mtspr SPRN_IBAT1U, r6 471*4882a593Smuzhiyun mtspr SPRN_IBAT1L, r7 472*4882a593Smuzhiyun 473*4882a593Smuzhiyun lwz r4, SS_IBAT+0x10(r3) 474*4882a593Smuzhiyun lwz r5, SS_IBAT+0x14(r3) 475*4882a593Smuzhiyun lwz r6, SS_IBAT+0x18(r3) 476*4882a593Smuzhiyun lwz r7, SS_IBAT+0x1c(r3) 477*4882a593Smuzhiyun 478*4882a593Smuzhiyun mtspr SPRN_IBAT2U, r4 479*4882a593Smuzhiyun mtspr SPRN_IBAT2L, r5 480*4882a593Smuzhiyun mtspr SPRN_IBAT3U, r6 481*4882a593Smuzhiyun mtspr SPRN_IBAT3L, r7 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun lwz r4, SS_IBAT+0x20(r3) 484*4882a593Smuzhiyun lwz r5, SS_IBAT+0x24(r3) 485*4882a593Smuzhiyun lwz r6, SS_IBAT+0x28(r3) 486*4882a593Smuzhiyun lwz r7, SS_IBAT+0x2c(r3) 487*4882a593Smuzhiyun 488*4882a593Smuzhiyun mtspr SPRN_IBAT4U, r4 489*4882a593Smuzhiyun mtspr SPRN_IBAT4L, r5 490*4882a593Smuzhiyun mtspr SPRN_IBAT5U, r6 491*4882a593Smuzhiyun mtspr SPRN_IBAT5L, r7 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun lwz r4, SS_IBAT+0x30(r3) 494*4882a593Smuzhiyun lwz r5, SS_IBAT+0x34(r3) 495*4882a593Smuzhiyun lwz r6, SS_IBAT+0x38(r3) 496*4882a593Smuzhiyun lwz r7, SS_IBAT+0x3c(r3) 497*4882a593Smuzhiyun 498*4882a593Smuzhiyun mtspr SPRN_IBAT6U, r4 499*4882a593Smuzhiyun mtspr SPRN_IBAT6L, r5 500*4882a593Smuzhiyun mtspr SPRN_IBAT7U, r6 501*4882a593Smuzhiyun mtspr SPRN_IBAT7L, r7 502*4882a593Smuzhiyun 503*4882a593Smuzhiyun lwz r4, SS_SPRG+16(r3) 504*4882a593Smuzhiyun lwz r5, SS_SPRG+20(r3) 505*4882a593Smuzhiyun lwz r6, SS_SPRG+24(r3) 506*4882a593Smuzhiyun lwz r7, SS_SPRG+28(r3) 507*4882a593Smuzhiyun 508*4882a593Smuzhiyun mtspr SPRN_SPRG4, r4 509*4882a593Smuzhiyun mtspr SPRN_SPRG5, r5 510*4882a593Smuzhiyun mtspr SPRN_SPRG6, r6 511*4882a593Smuzhiyun mtspr SPRN_SPRG7, r7 512*4882a593Smuzhiyun 513*4882a593Smuzhiyun lwz r4, SS_SPRG+0(r3) 514*4882a593Smuzhiyun lwz r5, SS_SPRG+4(r3) 515*4882a593Smuzhiyun lwz r6, SS_SPRG+8(r3) 516*4882a593Smuzhiyun lwz r7, SS_SPRG+12(r3) 517*4882a593Smuzhiyun lwz r8, SS_SDR1(r3) 518*4882a593Smuzhiyun 519*4882a593Smuzhiyun mtspr SPRN_SPRG0, r4 520*4882a593Smuzhiyun mtspr SPRN_SPRG1, r5 521*4882a593Smuzhiyun mtspr SPRN_SPRG2, r6 522*4882a593Smuzhiyun mtspr SPRN_SPRG3, r7 523*4882a593Smuzhiyun mtsdr1 r8 524*4882a593Smuzhiyun 525*4882a593Smuzhiyun lwz r4, SS_MSR(r3) 526*4882a593Smuzhiyun lwz r5, SS_LR(r3) 527*4882a593Smuzhiyun lwz r6, SS_CR(r3) 528*4882a593Smuzhiyun lwz r1, SS_SP(r3) 529*4882a593Smuzhiyun lwz r2, SS_R2(r3) 530*4882a593Smuzhiyun 531*4882a593Smuzhiyun mtsrr1 r4 532*4882a593Smuzhiyun mtsrr0 r5 533*4882a593Smuzhiyun mtcr r6 534*4882a593Smuzhiyun 535*4882a593Smuzhiyun li r4, 0 536*4882a593Smuzhiyun mtspr SPRN_TBWL, r4 537*4882a593Smuzhiyun 538*4882a593Smuzhiyun lwz r4, SS_TB+0(r3) 539*4882a593Smuzhiyun lwz r5, SS_TB+4(r3) 540*4882a593Smuzhiyun 541*4882a593Smuzhiyun mtspr SPRN_TBWU, r4 542*4882a593Smuzhiyun mtspr SPRN_TBWL, r5 543*4882a593Smuzhiyun 544*4882a593Smuzhiyun lmw r12, SS_GPREG(r3) 545*4882a593Smuzhiyun 546*4882a593Smuzhiyun /* Kick decrementer */ 547*4882a593Smuzhiyun li r0, 1 548*4882a593Smuzhiyun mtdec r0 549*4882a593Smuzhiyun 550*4882a593Smuzhiyun rfi 551*4882a593Smuzhiyun_ASM_NOKPROBE_SYMBOL(mpc83xx_deep_resume) 552