hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/* SPDX-License-Identifier: GPL-2.0 */
#include <asm/reg.h>
#include <asm/ppc_asm.h>
#include <asm/processor.h>
 
 
.text
 
_GLOBAL(mpc52xx_deep_sleep)
mpc52xx_deep_sleep: /* args r3-r6: SRAM, SDRAM regs, CDM regs, INTR regs */
 
   /* enable interrupts */
   mfmsr    r7
   ori    r7, r7, 0x8000 /* EE */
   mtmsr    r7
   sync; isync;
 
   li    r10, 0 /* flag that irq handler sets */
 
   /* enable tmr7 (or any other) interrupt */
   lwz    r8, 0x14(r6) /* intr->main_mask */
   ori    r8, r8, 0x1
   xori    r8, r8, 0x1
   stw    r8, 0x14(r6)
   sync
 
   /* emulate tmr7 interrupt */
   li    r8, 0x1
   stw    r8, 0x40(r6) /* intr->main_emulate */
   sync
 
   /* wait for it to happen */
1:
   cmpi    cr0, r10, 1
   bne    cr0, 1b
 
   /* lock icache */
   mfspr    r10, SPRN_HID0
   ori    r10, r10, 0x2000
   sync; isync;
   mtspr    SPRN_HID0, r10
   sync; isync;
 
 
   mflr    r9 /* save LR */
 
   /* jump to sram */
   mtlr    r3
   blrl
 
   mtlr    r9 /* restore LR */
 
   /* unlock icache */
   mfspr    r10, SPRN_HID0
   ori    r10, r10, 0x2000
   xori    r10, r10, 0x2000
   sync; isync;
   mtspr    SPRN_HID0, r10
   sync; isync;
 
 
   /* return to C code */
   blr
 
 
_GLOBAL(mpc52xx_ds_sram)
mpc52xx_ds_sram:
   /* put SDRAM into self-refresh */
   lwz    r8, 0x4(r4)    /* sdram->ctrl */
 
   oris    r8, r8, 0x8000 /* mode_en */
   stw    r8, 0x4(r4)
   sync
 
   ori    r8, r8, 0x0002 /* soft_pre */
   stw    r8, 0x4(r4)
   sync
   xori    r8, r8, 0x0002
 
   xoris    r8, r8, 0x8000 /* !mode_en */
   stw    r8, 0x4(r4)
   sync
 
   oris    r8, r8, 0x5000
   xoris    r8, r8, 0x4000 /* ref_en !cke */
   stw    r8, 0x4(r4)
   sync
 
   /* disable SDRAM clock */
   lwz    r8, 0x14(r5) /* cdm->clkenable */
   ori    r8, r8, 0x0008
   xori    r8, r8, 0x0008
   stw    r8, 0x14(r5)
   sync
 
 
   /* put mpc5200 to sleep */
   mfmsr    r10
   oris    r10, r10, 0x0004    /* POW = 1 */
   sync; isync;
   mtmsr    r10
   sync; isync;
 
 
   /* enable clock */
   lwz    r8, 0x14(r5)
   ori    r8, r8, 0x0008
   stw    r8, 0x14(r5)
   sync
 
   /* get ram out of self-refresh */
   lwz    r8, 0x4(r4)
   oris    r8, r8, 0x5000 /* cke ref_en */
   stw    r8, 0x4(r4)
   sync
 
   blr
_GLOBAL(mpc52xx_ds_sram_size)
mpc52xx_ds_sram_size:
   .long $-mpc52xx_ds_sram
 
 
/* ### interrupt handler for wakeup from deep-sleep ### */
_GLOBAL(mpc52xx_ds_cached)
mpc52xx_ds_cached:
   mtspr    SPRN_SPRG0, r7
   mtspr    SPRN_SPRG1, r8
 
   /* disable emulated interrupt */
   mfspr    r7, 311 /* MBAR */
   addi    r7, r7, 0x540    /* intr->main_emul */
   li    r8, 0
   stw    r8, 0(r7)
   sync
   dcbf    0, r7
 
   /* acknowledge wakeup, so CCS releases power pown */
   mfspr    r7, 311    /* MBAR */
   addi    r7, r7, 0x524    /* intr->enc_status */
   lwz    r8, 0(r7)
   ori    r8, r8, 0x0400
   stw    r8, 0(r7)
   sync
   dcbf    0, r7
 
   /* flag - we handled the interrupt */
   li    r10, 1
 
   mfspr    r8, SPRN_SPRG1
   mfspr    r7, SPRN_SPRG0
 
   rfi
_GLOBAL(mpc52xx_ds_cached_size)
mpc52xx_ds_cached_size:
   .long $-mpc52xx_ds_cached