Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/arch/powerpc/platforms/83xx/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 10 kB image not shown  

Quelle  suspend-asm.S   Sprache: Sparc

 
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Enter and leave deep sleep state on MPC83xx
 *
 * Copyright (c) 2006-2008 Freescale Semiconductor, Inc.
 * Author: Scott Wood <scottwood@freescale.com>
 */


#include <asm/page.h>
#include <asm/ppc_asm.h>
#include <asm/reg.h>
#include <asm/asm-offsets.h>

#define SS_MEMSAVE 0x00 /* First 8 bytes of RAM */
#define SS_HID  0x08 /* 3 HIDs */
#define SS_IABR  0x14 /* 2 IABRs */
#define SS_IBCR  0x1c
#define SS_DABR  0x20 /* 2 DABRs */
#define SS_DBCR  0x28
#define SS_SP  0x2c
#define SS_SR  0x30 /* 16 segment registers */
#define SS_R2  0x70
#define SS_MSR  0x74
#define SS_SDR1  0x78
#define SS_LR  0x7c
#define SS_SPRG  0x80 /* 8 SPRGs */
#define SS_DBAT  0xa0 /* 8 DBATs */
#define SS_IBAT  0xe0 /* 8 IBATs */
#define SS_TB  0x120
#define SS_CR  0x128
#define SS_GPREG 0x12c /* r12-r31 */
#define STATE_SAVE_SIZE 0x17c

 .section .data
 .align 5

mpc83xx_sleep_save_area:
 .space STATE_SAVE_SIZE
immrbase:
 .long 0

 .section .text
 .align 5

 /* r3 = physical address of IMMR */
_GLOBAL(mpc83xx_enter_deep_sleep)
 lis r4, immrbase@ha
 stw r3, immrbase@l(r4)

 /* The first 2 words of memory are used to communicate with the
 * bootloader, to tell it how to resume.
 *
 * The first word is the magic number 0xf5153ae5, and the second
 * is the pointer to mpc83xx_deep_resume.
 *
 * The original content of these two words is saved in SS_MEMSAVE.
 */


 lis r3, mpc83xx_sleep_save_area@h
 ori r3, r3, mpc83xx_sleep_save_area@l

 lis r4, KERNELBASE@h
 lwz r5, 0(r4)
 lwz r6, 4(r4)

 stw r5, SS_MEMSAVE+0(r3)
 stw r6, SS_MEMSAVE+4(r3)

 mfspr r5, SPRN_HID0
 mfspr r6, SPRN_HID1
 /* FIXME: Should this use SPRN_HID2_G2_LE? */
 mfspr r7, SPRN_HID2_750FX

 stw r5, SS_HID+0(r3)
 stw r6, SS_HID+4(r3)
 stw r7, SS_HID+8(r3)

 mfspr r4, SPRN_IABR
 mfspr r5, SPRN_IABR2
 mfspr r6, SPRN_IBCR
 mfspr r7, SPRN_DABR
 mfspr r8, SPRN_DABR2
 mfspr r9, SPRN_DBCR

 stw r4, SS_IABR+0(r3)
 stw r5, SS_IABR+4(r3)
 stw r6, SS_IBCR(r3)
 stw r7, SS_DABR+0(r3)
 stw r8, SS_DABR+4(r3)
 stw r9, SS_DBCR(r3)

 mfspr r4, SPRN_SPRG0
 mfspr r5, SPRN_SPRG1
 mfspr r6, SPRN_SPRG2
 mfspr r7, SPRN_SPRG3
 mfsdr1 r8

 stw r4, SS_SPRG+0(r3)
 stw r5, SS_SPRG+4(r3)
 stw r6, SS_SPRG+8(r3)
 stw r7, SS_SPRG+12(r3)
 stw r8, SS_SDR1(r3)

 mfspr r4, SPRN_SPRG4
 mfspr r5, SPRN_SPRG5
 mfspr r6, SPRN_SPRG6
 mfspr r7, SPRN_SPRG7

 stw r4, SS_SPRG+16(r3)
 stw r5, SS_SPRG+20(r3)
 stw r6, SS_SPRG+24(r3)
 stw r7, SS_SPRG+28(r3)

 mfspr r4, SPRN_DBAT0U
 mfspr r5, SPRN_DBAT0L
 mfspr r6, SPRN_DBAT1U
 mfspr r7, SPRN_DBAT1L

 stw r4, SS_DBAT+0x00(r3)
 stw r5, SS_DBAT+0x04(r3)
 stw r6, SS_DBAT+0x08(r3)
 stw r7, SS_DBAT+0x0c(r3)

 mfspr r4, SPRN_DBAT2U
 mfspr r5, SPRN_DBAT2L
 mfspr r6, SPRN_DBAT3U
 mfspr r7, SPRN_DBAT3L

 stw r4, SS_DBAT+0x10(r3)
 stw r5, SS_DBAT+0x14(r3)
 stw r6, SS_DBAT+0x18(r3)
 stw r7, SS_DBAT+0x1c(r3)

 mfspr r4, SPRN_DBAT4U
 mfspr r5, SPRN_DBAT4L
 mfspr r6, SPRN_DBAT5U
 mfspr r7, SPRN_DBAT5L

 stw r4, SS_DBAT+0x20(r3)
 stw r5, SS_DBAT+0x24(r3)
 stw r6, SS_DBAT+0x28(r3)
 stw r7, SS_DBAT+0x2c(r3)

 mfspr r4, SPRN_DBAT6U
 mfspr r5, SPRN_DBAT6L
 mfspr r6, SPRN_DBAT7U
 mfspr r7, SPRN_DBAT7L

 stw r4, SS_DBAT+0x30(r3)
 stw r5, SS_DBAT+0x34(r3)
 stw r6, SS_DBAT+0x38(r3)
 stw r7, SS_DBAT+0x3c(r3)

 mfspr r4, SPRN_IBAT0U
 mfspr r5, SPRN_IBAT0L
 mfspr r6, SPRN_IBAT1U
 mfspr r7, SPRN_IBAT1L

 stw r4, SS_IBAT+0x00(r3)
 stw r5, SS_IBAT+0x04(r3)
 stw r6, SS_IBAT+0x08(r3)
 stw r7, SS_IBAT+0x0c(r3)

 mfspr r4, SPRN_IBAT2U
 mfspr r5, SPRN_IBAT2L
 mfspr r6, SPRN_IBAT3U
 mfspr r7, SPRN_IBAT3L

 stw r4, SS_IBAT+0x10(r3)
 stw r5, SS_IBAT+0x14(r3)
 stw r6, SS_IBAT+0x18(r3)
 stw r7, SS_IBAT+0x1c(r3)

 mfspr r4, SPRN_IBAT4U
 mfspr r5, SPRN_IBAT4L
 mfspr r6, SPRN_IBAT5U
 mfspr r7, SPRN_IBAT5L

 stw r4, SS_IBAT+0x20(r3)
 stw r5, SS_IBAT+0x24(r3)
 stw r6, SS_IBAT+0x28(r3)
 stw r7, SS_IBAT+0x2c(r3)

 mfspr r4, SPRN_IBAT6U
 mfspr r5, SPRN_IBAT6L
 mfspr r6, SPRN_IBAT7U
 mfspr r7, SPRN_IBAT7L

 stw r4, SS_IBAT+0x30(r3)
 stw r5, SS_IBAT+0x34(r3)
 stw r6, SS_IBAT+0x38(r3)
 stw r7, SS_IBAT+0x3c(r3)

 mfmsr r4
 mflr r5
 mfcr r6

 stw r4, SS_MSR(r3)
 stw r5, SS_LR(r3)
 stw r6, SS_CR(r3)
 stw r1, SS_SP(r3)
 stw r2, SS_R2(r3)

1: mftbu r4
 mftb r5
 mftbu r6
 cmpw r4, r6
 bne 1b

 stw r4, SS_TB+0(r3)
 stw r5, SS_TB+4(r3)

 stmw r12, SS_GPREG(r3)

 li r4, 0
 addi r6, r3, SS_SR-4
1: mfsrin r5, r4
 stwu r5, 4(r6)
 addis r4, r4, 0x1000
 cmpwi r4, 0
 bne 1b

 /* Disable machine checks and critical exceptions */
 mfmsr r4
 rlwinm r4, r4, 0, ~MSR_CE
 rlwinm r4, r4, 0, ~MSR_ME
 mtmsr r4
 isync

#define TMP_VIRT_IMMR  0xf0000000
#define DEFAULT_IMMR_VALUE 0xff400000
#define IMMRBAR_BASE  0x0000

 lis r4, immrbase@ha
 lwz r4, immrbase@l(r4)

 /* Use DBAT0 to address the current IMMR space */

 ori r4, r4, 0x002a
 mtspr SPRN_DBAT0L, r4
 lis r8, TMP_VIRT_IMMR@h
 ori r4, r8, 0x001e /* 1 MByte accessible from Kernel Space only */
 mtspr SPRN_DBAT0U, r4
 isync

 /* Use DBAT1 to address the original IMMR space */

 lis r4, DEFAULT_IMMR_VALUE@h
 ori r4, r4, 0x002a
 mtspr SPRN_DBAT1L, r4
 lis r9, (TMP_VIRT_IMMR + 0x01000000)@h
 ori r4, r9, 0x001e /* 1 MByte accessible from Kernel Space only */
 mtspr SPRN_DBAT1U, r4
 isync

 /* Use DBAT2 to address the beginning of RAM.  This isn't done
 * using the normal virtual mapping, because with page debugging
 * enabled it will be read-only.
 */


 li r4, 0x0002
 mtspr SPRN_DBAT2L, r4
 lis r4, KERNELBASE@h
 ori r4, r4, 0x001e /* 1 MByte accessible from Kernel Space only */
 mtspr SPRN_DBAT2U, r4
 isync

 /* Flush the cache with our BAT, as there will be TLB misses
 * otherwise if page debugging is enabled, and these misses
 * will disturb the PLRU algorithm.
 */


 bl __flush_disable_L1

 /* Keep the i-cache enabled, so the hack below for low-boot
 * flash will work.
 */

 mfspr r3, SPRN_HID0
 ori r3, r3, HID0_ICE
 mtspr SPRN_HID0, r3
 isync

 lis r6, 0xf515
 ori r6, r6, 0x3ae5

 lis r7, mpc83xx_deep_resume@h
 ori r7, r7, mpc83xx_deep_resume@l
 tophys(r7, r7)

 lis r5, KERNELBASE@h
 stw r6, 0(r5)
 stw r7, 4(r5)

 /* Reset BARs */

 li r4, 0
 stw r4, 0x0024(r8)
 stw r4, 0x002c(r8)
 stw r4, 0x0034(r8)
 stw r4, 0x003c(r8)
 stw r4, 0x0064(r8)
 stw r4, 0x006c(r8)

 /* Rev 1 of the 8313 has problems with wakeup events that are
 * pending during the transition to deep sleep state (such as if
 * the PCI host sets the state to D3 and then D0 in rapid
 * succession).  This check shrinks the race window somewhat.
 *
 * See erratum PCI23, though the problem is not limited
 * to PCI.
 */


 lwz r3, 0x0b04(r8)
 andi. r3, r3, 1
 bne- mpc83xx_deep_resume

 /* Move IMMR back to the default location, following the
 * procedure specified in the MPC8313 manual.
 */

 lwz r4, IMMRBAR_BASE(r8)
 isync
 lis r4, DEFAULT_IMMR_VALUE@h
 stw r4, IMMRBAR_BASE(r8)
 lis r4, KERNELBASE@h
 lwz r4, 0(r4)
 isync
 lwz r4, IMMRBAR_BASE(r9)
 mr r8, r9
 isync

 /* Check the Reset Configuration Word to see whether flash needs
 * to be mapped at a low address or a high address.
 */


 lwz r4, 0x0904(r8)
 andis. r4, r4, 0x0400
 li r4, 0
 beq boot_low
 lis r4, 0xff80
boot_low:
 stw r4, 0x0020(r8)
 lis r7, 0x8000
 ori r7, r7, 0x0016

 mfspr r5, SPRN_HID0
 rlwinm r5, r5, 0, ~(HID0_DOZE | HID0_NAP)
 oris r5, r5, HID0_SLEEP@h
 mtspr SPRN_HID0, r5
 isync

 mfmsr r5
 oris r5, r5, MSR_POW@h

 /* Enable the flash mapping at the appropriate address.  This
 * mapping will override the RAM mapping if booting low, so there's
 * no need to disable the latter.  This must be done inside the same
 * cache line as setting MSR_POW, so that no instruction fetches
 * from RAM happen after the flash mapping is turned on.
 */


 .align 5
 stw r7, 0x0024(r8)
 sync
 isync
 mtmsr r5
 isync
1: b 1b

mpc83xx_deep_resume:
 lis r4, 1f@h
 ori r4, r4, 1f@l
 tophys(r4, r4)
 mtsrr0 r4

 mfmsr r4
 rlwinm r4, r4, 0, ~(MSR_IR | MSR_DR)
 mtsrr1 r4

 rfi

1: tlbia
 bl __inval_enable_L1

 lis r3, mpc83xx_sleep_save_area@h
 ori r3, r3, mpc83xx_sleep_save_area@l
 tophys(r3, r3)

 lwz r5, SS_MEMSAVE+0(r3)
 lwz r6, SS_MEMSAVE+4(r3)

 stw r5, 0(0)
 stw r6, 4(0)

 lwz r5, SS_HID+0(r3)
 lwz r6, SS_HID+4(r3)
 lwz r7, SS_HID+8(r3)

 mtspr SPRN_HID0, r5
 mtspr SPRN_HID1, r6
 /* FIXME: Should this use SPRN_HID2_G2_LE? */
 mtspr SPRN_HID2_750FX, r7

 lwz r4, SS_IABR+0(r3)
 lwz r5, SS_IABR+4(r3)
 lwz r6, SS_IBCR(r3)
 lwz r7, SS_DABR+0(r3)
 lwz r8, SS_DABR+4(r3)
 lwz r9, SS_DBCR(r3)

 mtspr SPRN_IABR, r4
 mtspr SPRN_IABR2, r5
 mtspr SPRN_IBCR, r6
 mtspr SPRN_DABR, r7
 mtspr SPRN_DABR2, r8
 mtspr SPRN_DBCR, r9

 li r4, 0
 addi r6, r3, SS_SR-4
1: lwzu r5, 4(r6)
 mtsrin r5, r4
 addis r4, r4, 0x1000
 cmpwi r4, 0
 bne 1b

 lwz r4, SS_DBAT+0x00(r3)
 lwz r5, SS_DBAT+0x04(r3)
 lwz r6, SS_DBAT+0x08(r3)
 lwz r7, SS_DBAT+0x0c(r3)

 mtspr SPRN_DBAT0U, r4
 mtspr SPRN_DBAT0L, r5
 mtspr SPRN_DBAT1U, r6
 mtspr SPRN_DBAT1L, r7

 lwz r4, SS_DBAT+0x10(r3)
 lwz r5, SS_DBAT+0x14(r3)
 lwz r6, SS_DBAT+0x18(r3)
 lwz r7, SS_DBAT+0x1c(r3)

 mtspr SPRN_DBAT2U, r4
 mtspr SPRN_DBAT2L, r5
 mtspr SPRN_DBAT3U, r6
 mtspr SPRN_DBAT3L, r7

 lwz r4, SS_DBAT+0x20(r3)
 lwz r5, SS_DBAT+0x24(r3)
 lwz r6, SS_DBAT+0x28(r3)
 lwz r7, SS_DBAT+0x2c(r3)

 mtspr SPRN_DBAT4U, r4
 mtspr SPRN_DBAT4L, r5
 mtspr SPRN_DBAT5U, r6
 mtspr SPRN_DBAT5L, r7

 lwz r4, SS_DBAT+0x30(r3)
 lwz r5, SS_DBAT+0x34(r3)
 lwz r6, SS_DBAT+0x38(r3)
 lwz r7, SS_DBAT+0x3c(r3)

 mtspr SPRN_DBAT6U, r4
 mtspr SPRN_DBAT6L, r5
 mtspr SPRN_DBAT7U, r6
 mtspr SPRN_DBAT7L, r7

 lwz r4, SS_IBAT+0x00(r3)
 lwz r5, SS_IBAT+0x04(r3)
 lwz r6, SS_IBAT+0x08(r3)
 lwz r7, SS_IBAT+0x0c(r3)

 mtspr SPRN_IBAT0U, r4
 mtspr SPRN_IBAT0L, r5
 mtspr SPRN_IBAT1U, r6
 mtspr SPRN_IBAT1L, r7

 lwz r4, SS_IBAT+0x10(r3)
 lwz r5, SS_IBAT+0x14(r3)
 lwz r6, SS_IBAT+0x18(r3)
 lwz r7, SS_IBAT+0x1c(r3)

 mtspr SPRN_IBAT2U, r4
 mtspr SPRN_IBAT2L, r5
 mtspr SPRN_IBAT3U, r6
 mtspr SPRN_IBAT3L, r7

 lwz r4, SS_IBAT+0x20(r3)
 lwz r5, SS_IBAT+0x24(r3)
 lwz r6, SS_IBAT+0x28(r3)
 lwz r7, SS_IBAT+0x2c(r3)

 mtspr SPRN_IBAT4U, r4
 mtspr SPRN_IBAT4L, r5
 mtspr SPRN_IBAT5U, r6
 mtspr SPRN_IBAT5L, r7

 lwz r4, SS_IBAT+0x30(r3)
 lwz r5, SS_IBAT+0x34(r3)
 lwz r6, SS_IBAT+0x38(r3)
 lwz r7, SS_IBAT+0x3c(r3)

 mtspr SPRN_IBAT6U, r4
 mtspr SPRN_IBAT6L, r5
 mtspr SPRN_IBAT7U, r6
 mtspr SPRN_IBAT7L, r7

 lwz r4, SS_SPRG+16(r3)
 lwz r5, SS_SPRG+20(r3)
 lwz r6, SS_SPRG+24(r3)
 lwz r7, SS_SPRG+28(r3)

 mtspr SPRN_SPRG4, r4
 mtspr SPRN_SPRG5, r5
 mtspr SPRN_SPRG6, r6
 mtspr SPRN_SPRG7, r7

 lwz r4, SS_SPRG+0(r3)
 lwz r5, SS_SPRG+4(r3)
 lwz r6, SS_SPRG+8(r3)
 lwz r7, SS_SPRG+12(r3)
 lwz r8, SS_SDR1(r3)

 mtspr SPRN_SPRG0, r4
 mtspr SPRN_SPRG1, r5
 mtspr SPRN_SPRG2, r6
 mtspr SPRN_SPRG3, r7
 mtsdr1 r8

 lwz r4, SS_MSR(r3)
 lwz r5, SS_LR(r3)
 lwz r6, SS_CR(r3)
 lwz r1, SS_SP(r3)
 lwz r2, SS_R2(r3)

 mtsrr1 r4
 mtsrr0 r5
 mtcr r6

 li r4, 0
 mtspr SPRN_TBWL, r4

 lwz r4, SS_TB+0(r3)
 lwz r5, SS_TB+4(r3)

 mtspr SPRN_TBWU, r4
 mtspr SPRN_TBWL, r5

 lmw r12, SS_GPREG(r3)

 /* Kick decrementer */
 li r0, 1
 mtdec r0

 rfi
_ASM_NOKPROBE_SYMBOL(mpc83xx_deep_resume)

Messung V0.5
C=96 H=94 G=94

¤ Dauer der Verarbeitung: 0.2 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.