162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Enter and leave deep sleep state on MPC83xx 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2006-2008 Freescale Semiconductor, Inc. 662306a36Sopenharmony_ci * Author: Scott Wood <scottwood@freescale.com> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <asm/page.h> 1062306a36Sopenharmony_ci#include <asm/ppc_asm.h> 1162306a36Sopenharmony_ci#include <asm/reg.h> 1262306a36Sopenharmony_ci#include <asm/asm-offsets.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define SS_MEMSAVE 0x00 /* First 8 bytes of RAM */ 1562306a36Sopenharmony_ci#define SS_HID 0x08 /* 3 HIDs */ 1662306a36Sopenharmony_ci#define SS_IABR 0x14 /* 2 IABRs */ 1762306a36Sopenharmony_ci#define SS_IBCR 0x1c 1862306a36Sopenharmony_ci#define SS_DABR 0x20 /* 2 DABRs */ 1962306a36Sopenharmony_ci#define SS_DBCR 0x28 2062306a36Sopenharmony_ci#define SS_SP 0x2c 2162306a36Sopenharmony_ci#define SS_SR 0x30 /* 16 segment registers */ 2262306a36Sopenharmony_ci#define SS_R2 0x70 2362306a36Sopenharmony_ci#define SS_MSR 0x74 2462306a36Sopenharmony_ci#define SS_SDR1 0x78 2562306a36Sopenharmony_ci#define SS_LR 0x7c 2662306a36Sopenharmony_ci#define SS_SPRG 0x80 /* 8 SPRGs */ 2762306a36Sopenharmony_ci#define SS_DBAT 0xa0 /* 8 DBATs */ 2862306a36Sopenharmony_ci#define SS_IBAT 0xe0 /* 8 IBATs */ 2962306a36Sopenharmony_ci#define SS_TB 0x120 3062306a36Sopenharmony_ci#define SS_CR 0x128 3162306a36Sopenharmony_ci#define SS_GPREG 0x12c /* r12-r31 */ 3262306a36Sopenharmony_ci#define STATE_SAVE_SIZE 0x17c 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci .section .data 3562306a36Sopenharmony_ci .align 5 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cimpc83xx_sleep_save_area: 3862306a36Sopenharmony_ci .space STATE_SAVE_SIZE 3962306a36Sopenharmony_ciimmrbase: 4062306a36Sopenharmony_ci .long 0 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci .section .text 4362306a36Sopenharmony_ci .align 5 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci /* r3 = physical address of IMMR */ 4662306a36Sopenharmony_ci_GLOBAL(mpc83xx_enter_deep_sleep) 4762306a36Sopenharmony_ci lis r4, immrbase@ha 4862306a36Sopenharmony_ci stw r3, immrbase@l(r4) 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci /* The first 2 words of memory are used to communicate with the 5162306a36Sopenharmony_ci * bootloader, to tell it how to resume. 5262306a36Sopenharmony_ci * 5362306a36Sopenharmony_ci * The first word is the magic number 0xf5153ae5, and the second 5462306a36Sopenharmony_ci * is the pointer to mpc83xx_deep_resume. 5562306a36Sopenharmony_ci * 5662306a36Sopenharmony_ci * The original content of these two words is saved in SS_MEMSAVE. 5762306a36Sopenharmony_ci */ 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci lis r3, mpc83xx_sleep_save_area@h 6062306a36Sopenharmony_ci ori r3, r3, mpc83xx_sleep_save_area@l 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci lis r4, KERNELBASE@h 6362306a36Sopenharmony_ci lwz r5, 0(r4) 6462306a36Sopenharmony_ci lwz r6, 4(r4) 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci stw r5, SS_MEMSAVE+0(r3) 6762306a36Sopenharmony_ci stw r6, SS_MEMSAVE+4(r3) 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci mfspr r5, SPRN_HID0 7062306a36Sopenharmony_ci mfspr r6, SPRN_HID1 7162306a36Sopenharmony_ci mfspr r7, SPRN_HID2 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci stw r5, SS_HID+0(r3) 7462306a36Sopenharmony_ci stw r6, SS_HID+4(r3) 7562306a36Sopenharmony_ci stw r7, SS_HID+8(r3) 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci mfspr r4, SPRN_IABR 7862306a36Sopenharmony_ci mfspr r5, SPRN_IABR2 7962306a36Sopenharmony_ci mfspr r6, SPRN_IBCR 8062306a36Sopenharmony_ci mfspr r7, SPRN_DABR 8162306a36Sopenharmony_ci mfspr r8, SPRN_DABR2 8262306a36Sopenharmony_ci mfspr r9, SPRN_DBCR 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci stw r4, SS_IABR+0(r3) 8562306a36Sopenharmony_ci stw r5, SS_IABR+4(r3) 8662306a36Sopenharmony_ci stw r6, SS_IBCR(r3) 8762306a36Sopenharmony_ci stw r7, SS_DABR+0(r3) 8862306a36Sopenharmony_ci stw r8, SS_DABR+4(r3) 8962306a36Sopenharmony_ci stw r9, SS_DBCR(r3) 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci mfspr r4, SPRN_SPRG0 9262306a36Sopenharmony_ci mfspr r5, SPRN_SPRG1 9362306a36Sopenharmony_ci mfspr r6, SPRN_SPRG2 9462306a36Sopenharmony_ci mfspr r7, SPRN_SPRG3 9562306a36Sopenharmony_ci mfsdr1 r8 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci stw r4, SS_SPRG+0(r3) 9862306a36Sopenharmony_ci stw r5, SS_SPRG+4(r3) 9962306a36Sopenharmony_ci stw r6, SS_SPRG+8(r3) 10062306a36Sopenharmony_ci stw r7, SS_SPRG+12(r3) 10162306a36Sopenharmony_ci stw r8, SS_SDR1(r3) 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci mfspr r4, SPRN_SPRG4 10462306a36Sopenharmony_ci mfspr r5, SPRN_SPRG5 10562306a36Sopenharmony_ci mfspr r6, SPRN_SPRG6 10662306a36Sopenharmony_ci mfspr r7, SPRN_SPRG7 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci stw r4, SS_SPRG+16(r3) 10962306a36Sopenharmony_ci stw r5, SS_SPRG+20(r3) 11062306a36Sopenharmony_ci stw r6, SS_SPRG+24(r3) 11162306a36Sopenharmony_ci stw r7, SS_SPRG+28(r3) 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci mfspr r4, SPRN_DBAT0U 11462306a36Sopenharmony_ci mfspr r5, SPRN_DBAT0L 11562306a36Sopenharmony_ci mfspr r6, SPRN_DBAT1U 11662306a36Sopenharmony_ci mfspr r7, SPRN_DBAT1L 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci stw r4, SS_DBAT+0x00(r3) 11962306a36Sopenharmony_ci stw r5, SS_DBAT+0x04(r3) 12062306a36Sopenharmony_ci stw r6, SS_DBAT+0x08(r3) 12162306a36Sopenharmony_ci stw r7, SS_DBAT+0x0c(r3) 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci mfspr r4, SPRN_DBAT2U 12462306a36Sopenharmony_ci mfspr r5, SPRN_DBAT2L 12562306a36Sopenharmony_ci mfspr r6, SPRN_DBAT3U 12662306a36Sopenharmony_ci mfspr r7, SPRN_DBAT3L 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci stw r4, SS_DBAT+0x10(r3) 12962306a36Sopenharmony_ci stw r5, SS_DBAT+0x14(r3) 13062306a36Sopenharmony_ci stw r6, SS_DBAT+0x18(r3) 13162306a36Sopenharmony_ci stw r7, SS_DBAT+0x1c(r3) 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci mfspr r4, SPRN_DBAT4U 13462306a36Sopenharmony_ci mfspr r5, SPRN_DBAT4L 13562306a36Sopenharmony_ci mfspr r6, SPRN_DBAT5U 13662306a36Sopenharmony_ci mfspr r7, SPRN_DBAT5L 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci stw r4, SS_DBAT+0x20(r3) 13962306a36Sopenharmony_ci stw r5, SS_DBAT+0x24(r3) 14062306a36Sopenharmony_ci stw r6, SS_DBAT+0x28(r3) 14162306a36Sopenharmony_ci stw r7, SS_DBAT+0x2c(r3) 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci mfspr r4, SPRN_DBAT6U 14462306a36Sopenharmony_ci mfspr r5, SPRN_DBAT6L 14562306a36Sopenharmony_ci mfspr r6, SPRN_DBAT7U 14662306a36Sopenharmony_ci mfspr r7, SPRN_DBAT7L 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci stw r4, SS_DBAT+0x30(r3) 14962306a36Sopenharmony_ci stw r5, SS_DBAT+0x34(r3) 15062306a36Sopenharmony_ci stw r6, SS_DBAT+0x38(r3) 15162306a36Sopenharmony_ci stw r7, SS_DBAT+0x3c(r3) 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci mfspr r4, SPRN_IBAT0U 15462306a36Sopenharmony_ci mfspr r5, SPRN_IBAT0L 15562306a36Sopenharmony_ci mfspr r6, SPRN_IBAT1U 15662306a36Sopenharmony_ci mfspr r7, SPRN_IBAT1L 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci stw r4, SS_IBAT+0x00(r3) 15962306a36Sopenharmony_ci stw r5, SS_IBAT+0x04(r3) 16062306a36Sopenharmony_ci stw r6, SS_IBAT+0x08(r3) 16162306a36Sopenharmony_ci stw r7, SS_IBAT+0x0c(r3) 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci mfspr r4, SPRN_IBAT2U 16462306a36Sopenharmony_ci mfspr r5, SPRN_IBAT2L 16562306a36Sopenharmony_ci mfspr r6, SPRN_IBAT3U 16662306a36Sopenharmony_ci mfspr r7, SPRN_IBAT3L 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci stw r4, SS_IBAT+0x10(r3) 16962306a36Sopenharmony_ci stw r5, SS_IBAT+0x14(r3) 17062306a36Sopenharmony_ci stw r6, SS_IBAT+0x18(r3) 17162306a36Sopenharmony_ci stw r7, SS_IBAT+0x1c(r3) 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci mfspr r4, SPRN_IBAT4U 17462306a36Sopenharmony_ci mfspr r5, SPRN_IBAT4L 17562306a36Sopenharmony_ci mfspr r6, SPRN_IBAT5U 17662306a36Sopenharmony_ci mfspr r7, SPRN_IBAT5L 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci stw r4, SS_IBAT+0x20(r3) 17962306a36Sopenharmony_ci stw r5, SS_IBAT+0x24(r3) 18062306a36Sopenharmony_ci stw r6, SS_IBAT+0x28(r3) 18162306a36Sopenharmony_ci stw r7, SS_IBAT+0x2c(r3) 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci mfspr r4, SPRN_IBAT6U 18462306a36Sopenharmony_ci mfspr r5, SPRN_IBAT6L 18562306a36Sopenharmony_ci mfspr r6, SPRN_IBAT7U 18662306a36Sopenharmony_ci mfspr r7, SPRN_IBAT7L 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci stw r4, SS_IBAT+0x30(r3) 18962306a36Sopenharmony_ci stw r5, SS_IBAT+0x34(r3) 19062306a36Sopenharmony_ci stw r6, SS_IBAT+0x38(r3) 19162306a36Sopenharmony_ci stw r7, SS_IBAT+0x3c(r3) 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci mfmsr r4 19462306a36Sopenharmony_ci mflr r5 19562306a36Sopenharmony_ci mfcr r6 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci stw r4, SS_MSR(r3) 19862306a36Sopenharmony_ci stw r5, SS_LR(r3) 19962306a36Sopenharmony_ci stw r6, SS_CR(r3) 20062306a36Sopenharmony_ci stw r1, SS_SP(r3) 20162306a36Sopenharmony_ci stw r2, SS_R2(r3) 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci1: mftbu r4 20462306a36Sopenharmony_ci mftb r5 20562306a36Sopenharmony_ci mftbu r6 20662306a36Sopenharmony_ci cmpw r4, r6 20762306a36Sopenharmony_ci bne 1b 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci stw r4, SS_TB+0(r3) 21062306a36Sopenharmony_ci stw r5, SS_TB+4(r3) 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci stmw r12, SS_GPREG(r3) 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci li r4, 0 21562306a36Sopenharmony_ci addi r6, r3, SS_SR-4 21662306a36Sopenharmony_ci1: mfsrin r5, r4 21762306a36Sopenharmony_ci stwu r5, 4(r6) 21862306a36Sopenharmony_ci addis r4, r4, 0x1000 21962306a36Sopenharmony_ci cmpwi r4, 0 22062306a36Sopenharmony_ci bne 1b 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci /* Disable machine checks and critical exceptions */ 22362306a36Sopenharmony_ci mfmsr r4 22462306a36Sopenharmony_ci rlwinm r4, r4, 0, ~MSR_CE 22562306a36Sopenharmony_ci rlwinm r4, r4, 0, ~MSR_ME 22662306a36Sopenharmony_ci mtmsr r4 22762306a36Sopenharmony_ci isync 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci#define TMP_VIRT_IMMR 0xf0000000 23062306a36Sopenharmony_ci#define DEFAULT_IMMR_VALUE 0xff400000 23162306a36Sopenharmony_ci#define IMMRBAR_BASE 0x0000 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci lis r4, immrbase@ha 23462306a36Sopenharmony_ci lwz r4, immrbase@l(r4) 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci /* Use DBAT0 to address the current IMMR space */ 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci ori r4, r4, 0x002a 23962306a36Sopenharmony_ci mtspr SPRN_DBAT0L, r4 24062306a36Sopenharmony_ci lis r8, TMP_VIRT_IMMR@h 24162306a36Sopenharmony_ci ori r4, r8, 0x001e /* 1 MByte accessible from Kernel Space only */ 24262306a36Sopenharmony_ci mtspr SPRN_DBAT0U, r4 24362306a36Sopenharmony_ci isync 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci /* Use DBAT1 to address the original IMMR space */ 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci lis r4, DEFAULT_IMMR_VALUE@h 24862306a36Sopenharmony_ci ori r4, r4, 0x002a 24962306a36Sopenharmony_ci mtspr SPRN_DBAT1L, r4 25062306a36Sopenharmony_ci lis r9, (TMP_VIRT_IMMR + 0x01000000)@h 25162306a36Sopenharmony_ci ori r4, r9, 0x001e /* 1 MByte accessible from Kernel Space only */ 25262306a36Sopenharmony_ci mtspr SPRN_DBAT1U, r4 25362306a36Sopenharmony_ci isync 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci /* Use DBAT2 to address the beginning of RAM. This isn't done 25662306a36Sopenharmony_ci * using the normal virtual mapping, because with page debugging 25762306a36Sopenharmony_ci * enabled it will be read-only. 25862306a36Sopenharmony_ci */ 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci li r4, 0x0002 26162306a36Sopenharmony_ci mtspr SPRN_DBAT2L, r4 26262306a36Sopenharmony_ci lis r4, KERNELBASE@h 26362306a36Sopenharmony_ci ori r4, r4, 0x001e /* 1 MByte accessible from Kernel Space only */ 26462306a36Sopenharmony_ci mtspr SPRN_DBAT2U, r4 26562306a36Sopenharmony_ci isync 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci /* Flush the cache with our BAT, as there will be TLB misses 26862306a36Sopenharmony_ci * otherwise if page debugging is enabled, and these misses 26962306a36Sopenharmony_ci * will disturb the PLRU algorithm. 27062306a36Sopenharmony_ci */ 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci bl __flush_disable_L1 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci /* Keep the i-cache enabled, so the hack below for low-boot 27562306a36Sopenharmony_ci * flash will work. 27662306a36Sopenharmony_ci */ 27762306a36Sopenharmony_ci mfspr r3, SPRN_HID0 27862306a36Sopenharmony_ci ori r3, r3, HID0_ICE 27962306a36Sopenharmony_ci mtspr SPRN_HID0, r3 28062306a36Sopenharmony_ci isync 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci lis r6, 0xf515 28362306a36Sopenharmony_ci ori r6, r6, 0x3ae5 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci lis r7, mpc83xx_deep_resume@h 28662306a36Sopenharmony_ci ori r7, r7, mpc83xx_deep_resume@l 28762306a36Sopenharmony_ci tophys(r7, r7) 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci lis r5, KERNELBASE@h 29062306a36Sopenharmony_ci stw r6, 0(r5) 29162306a36Sopenharmony_ci stw r7, 4(r5) 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci /* Reset BARs */ 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci li r4, 0 29662306a36Sopenharmony_ci stw r4, 0x0024(r8) 29762306a36Sopenharmony_ci stw r4, 0x002c(r8) 29862306a36Sopenharmony_ci stw r4, 0x0034(r8) 29962306a36Sopenharmony_ci stw r4, 0x003c(r8) 30062306a36Sopenharmony_ci stw r4, 0x0064(r8) 30162306a36Sopenharmony_ci stw r4, 0x006c(r8) 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci /* Rev 1 of the 8313 has problems with wakeup events that are 30462306a36Sopenharmony_ci * pending during the transition to deep sleep state (such as if 30562306a36Sopenharmony_ci * the PCI host sets the state to D3 and then D0 in rapid 30662306a36Sopenharmony_ci * succession). This check shrinks the race window somewhat. 30762306a36Sopenharmony_ci * 30862306a36Sopenharmony_ci * See erratum PCI23, though the problem is not limited 30962306a36Sopenharmony_ci * to PCI. 31062306a36Sopenharmony_ci */ 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci lwz r3, 0x0b04(r8) 31362306a36Sopenharmony_ci andi. r3, r3, 1 31462306a36Sopenharmony_ci bne- mpc83xx_deep_resume 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci /* Move IMMR back to the default location, following the 31762306a36Sopenharmony_ci * procedure specified in the MPC8313 manual. 31862306a36Sopenharmony_ci */ 31962306a36Sopenharmony_ci lwz r4, IMMRBAR_BASE(r8) 32062306a36Sopenharmony_ci isync 32162306a36Sopenharmony_ci lis r4, DEFAULT_IMMR_VALUE@h 32262306a36Sopenharmony_ci stw r4, IMMRBAR_BASE(r8) 32362306a36Sopenharmony_ci lis r4, KERNELBASE@h 32462306a36Sopenharmony_ci lwz r4, 0(r4) 32562306a36Sopenharmony_ci isync 32662306a36Sopenharmony_ci lwz r4, IMMRBAR_BASE(r9) 32762306a36Sopenharmony_ci mr r8, r9 32862306a36Sopenharmony_ci isync 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci /* Check the Reset Configuration Word to see whether flash needs 33162306a36Sopenharmony_ci * to be mapped at a low address or a high address. 33262306a36Sopenharmony_ci */ 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci lwz r4, 0x0904(r8) 33562306a36Sopenharmony_ci andis. r4, r4, 0x0400 33662306a36Sopenharmony_ci li r4, 0 33762306a36Sopenharmony_ci beq boot_low 33862306a36Sopenharmony_ci lis r4, 0xff80 33962306a36Sopenharmony_ciboot_low: 34062306a36Sopenharmony_ci stw r4, 0x0020(r8) 34162306a36Sopenharmony_ci lis r7, 0x8000 34262306a36Sopenharmony_ci ori r7, r7, 0x0016 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci mfspr r5, SPRN_HID0 34562306a36Sopenharmony_ci rlwinm r5, r5, 0, ~(HID0_DOZE | HID0_NAP) 34662306a36Sopenharmony_ci oris r5, r5, HID0_SLEEP@h 34762306a36Sopenharmony_ci mtspr SPRN_HID0, r5 34862306a36Sopenharmony_ci isync 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci mfmsr r5 35162306a36Sopenharmony_ci oris r5, r5, MSR_POW@h 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci /* Enable the flash mapping at the appropriate address. This 35462306a36Sopenharmony_ci * mapping will override the RAM mapping if booting low, so there's 35562306a36Sopenharmony_ci * no need to disable the latter. This must be done inside the same 35662306a36Sopenharmony_ci * cache line as setting MSR_POW, so that no instruction fetches 35762306a36Sopenharmony_ci * from RAM happen after the flash mapping is turned on. 35862306a36Sopenharmony_ci */ 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci .align 5 36162306a36Sopenharmony_ci stw r7, 0x0024(r8) 36262306a36Sopenharmony_ci sync 36362306a36Sopenharmony_ci isync 36462306a36Sopenharmony_ci mtmsr r5 36562306a36Sopenharmony_ci isync 36662306a36Sopenharmony_ci1: b 1b 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_cimpc83xx_deep_resume: 36962306a36Sopenharmony_ci lis r4, 1f@h 37062306a36Sopenharmony_ci ori r4, r4, 1f@l 37162306a36Sopenharmony_ci tophys(r4, r4) 37262306a36Sopenharmony_ci mtsrr0 r4 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci mfmsr r4 37562306a36Sopenharmony_ci rlwinm r4, r4, 0, ~(MSR_IR | MSR_DR) 37662306a36Sopenharmony_ci mtsrr1 r4 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci rfi 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci1: tlbia 38162306a36Sopenharmony_ci bl __inval_enable_L1 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci lis r3, mpc83xx_sleep_save_area@h 38462306a36Sopenharmony_ci ori r3, r3, mpc83xx_sleep_save_area@l 38562306a36Sopenharmony_ci tophys(r3, r3) 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci lwz r5, SS_MEMSAVE+0(r3) 38862306a36Sopenharmony_ci lwz r6, SS_MEMSAVE+4(r3) 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci stw r5, 0(0) 39162306a36Sopenharmony_ci stw r6, 4(0) 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci lwz r5, SS_HID+0(r3) 39462306a36Sopenharmony_ci lwz r6, SS_HID+4(r3) 39562306a36Sopenharmony_ci lwz r7, SS_HID+8(r3) 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci mtspr SPRN_HID0, r5 39862306a36Sopenharmony_ci mtspr SPRN_HID1, r6 39962306a36Sopenharmony_ci mtspr SPRN_HID2, r7 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ci lwz r4, SS_IABR+0(r3) 40262306a36Sopenharmony_ci lwz r5, SS_IABR+4(r3) 40362306a36Sopenharmony_ci lwz r6, SS_IBCR(r3) 40462306a36Sopenharmony_ci lwz r7, SS_DABR+0(r3) 40562306a36Sopenharmony_ci lwz r8, SS_DABR+4(r3) 40662306a36Sopenharmony_ci lwz r9, SS_DBCR(r3) 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci mtspr SPRN_IABR, r4 40962306a36Sopenharmony_ci mtspr SPRN_IABR2, r5 41062306a36Sopenharmony_ci mtspr SPRN_IBCR, r6 41162306a36Sopenharmony_ci mtspr SPRN_DABR, r7 41262306a36Sopenharmony_ci mtspr SPRN_DABR2, r8 41362306a36Sopenharmony_ci mtspr SPRN_DBCR, r9 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci li r4, 0 41662306a36Sopenharmony_ci addi r6, r3, SS_SR-4 41762306a36Sopenharmony_ci1: lwzu r5, 4(r6) 41862306a36Sopenharmony_ci mtsrin r5, r4 41962306a36Sopenharmony_ci addis r4, r4, 0x1000 42062306a36Sopenharmony_ci cmpwi r4, 0 42162306a36Sopenharmony_ci bne 1b 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci lwz r4, SS_DBAT+0x00(r3) 42462306a36Sopenharmony_ci lwz r5, SS_DBAT+0x04(r3) 42562306a36Sopenharmony_ci lwz r6, SS_DBAT+0x08(r3) 42662306a36Sopenharmony_ci lwz r7, SS_DBAT+0x0c(r3) 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci mtspr SPRN_DBAT0U, r4 42962306a36Sopenharmony_ci mtspr SPRN_DBAT0L, r5 43062306a36Sopenharmony_ci mtspr SPRN_DBAT1U, r6 43162306a36Sopenharmony_ci mtspr SPRN_DBAT1L, r7 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_ci lwz r4, SS_DBAT+0x10(r3) 43462306a36Sopenharmony_ci lwz r5, SS_DBAT+0x14(r3) 43562306a36Sopenharmony_ci lwz r6, SS_DBAT+0x18(r3) 43662306a36Sopenharmony_ci lwz r7, SS_DBAT+0x1c(r3) 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci mtspr SPRN_DBAT2U, r4 43962306a36Sopenharmony_ci mtspr SPRN_DBAT2L, r5 44062306a36Sopenharmony_ci mtspr SPRN_DBAT3U, r6 44162306a36Sopenharmony_ci mtspr SPRN_DBAT3L, r7 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci lwz r4, SS_DBAT+0x20(r3) 44462306a36Sopenharmony_ci lwz r5, SS_DBAT+0x24(r3) 44562306a36Sopenharmony_ci lwz r6, SS_DBAT+0x28(r3) 44662306a36Sopenharmony_ci lwz r7, SS_DBAT+0x2c(r3) 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci mtspr SPRN_DBAT4U, r4 44962306a36Sopenharmony_ci mtspr SPRN_DBAT4L, r5 45062306a36Sopenharmony_ci mtspr SPRN_DBAT5U, r6 45162306a36Sopenharmony_ci mtspr SPRN_DBAT5L, r7 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_ci lwz r4, SS_DBAT+0x30(r3) 45462306a36Sopenharmony_ci lwz r5, SS_DBAT+0x34(r3) 45562306a36Sopenharmony_ci lwz r6, SS_DBAT+0x38(r3) 45662306a36Sopenharmony_ci lwz r7, SS_DBAT+0x3c(r3) 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ci mtspr SPRN_DBAT6U, r4 45962306a36Sopenharmony_ci mtspr SPRN_DBAT6L, r5 46062306a36Sopenharmony_ci mtspr SPRN_DBAT7U, r6 46162306a36Sopenharmony_ci mtspr SPRN_DBAT7L, r7 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci lwz r4, SS_IBAT+0x00(r3) 46462306a36Sopenharmony_ci lwz r5, SS_IBAT+0x04(r3) 46562306a36Sopenharmony_ci lwz r6, SS_IBAT+0x08(r3) 46662306a36Sopenharmony_ci lwz r7, SS_IBAT+0x0c(r3) 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ci mtspr SPRN_IBAT0U, r4 46962306a36Sopenharmony_ci mtspr SPRN_IBAT0L, r5 47062306a36Sopenharmony_ci mtspr SPRN_IBAT1U, r6 47162306a36Sopenharmony_ci mtspr SPRN_IBAT1L, r7 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_ci lwz r4, SS_IBAT+0x10(r3) 47462306a36Sopenharmony_ci lwz r5, SS_IBAT+0x14(r3) 47562306a36Sopenharmony_ci lwz r6, SS_IBAT+0x18(r3) 47662306a36Sopenharmony_ci lwz r7, SS_IBAT+0x1c(r3) 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci mtspr SPRN_IBAT2U, r4 47962306a36Sopenharmony_ci mtspr SPRN_IBAT2L, r5 48062306a36Sopenharmony_ci mtspr SPRN_IBAT3U, r6 48162306a36Sopenharmony_ci mtspr SPRN_IBAT3L, r7 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ci lwz r4, SS_IBAT+0x20(r3) 48462306a36Sopenharmony_ci lwz r5, SS_IBAT+0x24(r3) 48562306a36Sopenharmony_ci lwz r6, SS_IBAT+0x28(r3) 48662306a36Sopenharmony_ci lwz r7, SS_IBAT+0x2c(r3) 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_ci mtspr SPRN_IBAT4U, r4 48962306a36Sopenharmony_ci mtspr SPRN_IBAT4L, r5 49062306a36Sopenharmony_ci mtspr SPRN_IBAT5U, r6 49162306a36Sopenharmony_ci mtspr SPRN_IBAT5L, r7 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci lwz r4, SS_IBAT+0x30(r3) 49462306a36Sopenharmony_ci lwz r5, SS_IBAT+0x34(r3) 49562306a36Sopenharmony_ci lwz r6, SS_IBAT+0x38(r3) 49662306a36Sopenharmony_ci lwz r7, SS_IBAT+0x3c(r3) 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ci mtspr SPRN_IBAT6U, r4 49962306a36Sopenharmony_ci mtspr SPRN_IBAT6L, r5 50062306a36Sopenharmony_ci mtspr SPRN_IBAT7U, r6 50162306a36Sopenharmony_ci mtspr SPRN_IBAT7L, r7 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_ci lwz r4, SS_SPRG+16(r3) 50462306a36Sopenharmony_ci lwz r5, SS_SPRG+20(r3) 50562306a36Sopenharmony_ci lwz r6, SS_SPRG+24(r3) 50662306a36Sopenharmony_ci lwz r7, SS_SPRG+28(r3) 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci mtspr SPRN_SPRG4, r4 50962306a36Sopenharmony_ci mtspr SPRN_SPRG5, r5 51062306a36Sopenharmony_ci mtspr SPRN_SPRG6, r6 51162306a36Sopenharmony_ci mtspr SPRN_SPRG7, r7 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ci lwz r4, SS_SPRG+0(r3) 51462306a36Sopenharmony_ci lwz r5, SS_SPRG+4(r3) 51562306a36Sopenharmony_ci lwz r6, SS_SPRG+8(r3) 51662306a36Sopenharmony_ci lwz r7, SS_SPRG+12(r3) 51762306a36Sopenharmony_ci lwz r8, SS_SDR1(r3) 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci mtspr SPRN_SPRG0, r4 52062306a36Sopenharmony_ci mtspr SPRN_SPRG1, r5 52162306a36Sopenharmony_ci mtspr SPRN_SPRG2, r6 52262306a36Sopenharmony_ci mtspr SPRN_SPRG3, r7 52362306a36Sopenharmony_ci mtsdr1 r8 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci lwz r4, SS_MSR(r3) 52662306a36Sopenharmony_ci lwz r5, SS_LR(r3) 52762306a36Sopenharmony_ci lwz r6, SS_CR(r3) 52862306a36Sopenharmony_ci lwz r1, SS_SP(r3) 52962306a36Sopenharmony_ci lwz r2, SS_R2(r3) 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_ci mtsrr1 r4 53262306a36Sopenharmony_ci mtsrr0 r5 53362306a36Sopenharmony_ci mtcr r6 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci li r4, 0 53662306a36Sopenharmony_ci mtspr SPRN_TBWL, r4 53762306a36Sopenharmony_ci 53862306a36Sopenharmony_ci lwz r4, SS_TB+0(r3) 53962306a36Sopenharmony_ci lwz r5, SS_TB+4(r3) 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci mtspr SPRN_TBWU, r4 54262306a36Sopenharmony_ci mtspr SPRN_TBWL, r5 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ci lmw r12, SS_GPREG(r3) 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_ci /* Kick decrementer */ 54762306a36Sopenharmony_ci li r0, 1 54862306a36Sopenharmony_ci mtdec r0 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_ci rfi 55162306a36Sopenharmony_ci_ASM_NOKPROBE_SYMBOL(mpc83xx_deep_resume) 552