1
2
3
4
5
6 #include <asm/asm.h>
7 #include <asm/regdef.h>
8 #include <asm/mipsregs.h>
9 #include <asm/bmips.h>
10
11 #include "pm.h"
12
13 .text
14 .set noreorder
15 .align 5
16 .global s3_reentry
17
18
19
20
21
22 LEAF(brcm_pm_do_s3)
23
24
25 la t0, gp_regs
26 sw ra, 0(t0)
27 sw s0, 4(t0)
28 sw s1, 8(t0)
29 sw s2, 12(t0)
30 sw s3, 16(t0)
31 sw s4, 20(t0)
32 sw s5, 24(t0)
33 sw s6, 28(t0)
34 sw s7, 32(t0)
35 sw gp, 36(t0)
36 sw sp, 40(t0)
37 sw fp, 44(t0)
38
39
40 mfc0 t1, CP0_STATUS
41 sw t1, 48(t0)
42
43
44 addiu t1, a1, -1
45 not t1
46 and t0, t1
47
48
49 addiu t2, t0, 64
50 and t2, t1
51
52 1: cache 0x17, 0(t0)
53 bne t0, t2, 1b
54 addu t0, a1
55
56
57 li t1, PM_WARM_CONFIG
58 sw zero, AON_CTRL_PM_CTRL(a0)
59 lw zero, AON_CTRL_PM_CTRL(a0)
60 sw t1, AON_CTRL_PM_CTRL(a0)
61 lw t1, AON_CTRL_PM_CTRL(a0)
62
63 li t1, (PM_WARM_CONFIG | PM_PWR_DOWN)
64 sw t1, AON_CTRL_PM_CTRL(a0)
65 lw t1, AON_CTRL_PM_CTRL(a0)
66
67
68 mfc0 t0, CP0_STATUS
69
70 li t1, ~(ST0_IM | ST0_IE)
71 and t0, t1
72 ori t0, STATUSF_IP2
73 mtc0 t0, CP0_STATUS
74 nop
75 nop
76 nop
77 ori t0, ST0_IE
78 mtc0 t0, CP0_STATUS
79
80
81 wait
82 nop
83
84 s3_reentry:
85
86
87 li t0, (0x06 << 16)
88 mtc0 t0, $22, 2
89 ssnop
90 ssnop
91 ssnop
92
93
94 li t0, (0x04 << 16)
95 mtc0 t0, $22, 2
96 ssnop
97 ssnop
98 ssnop
99
100 sync
101 nop
102
103
104 mtc0 zero, CP0_WIRED
105 mtc0 zero, CP0_ENTRYHI
106 li k0, PM_DEFAULT_MASK
107 mtc0 k0, CP0_PAGEMASK
108
109 li sp, BMIPS_WARM_RESTART_VEC
110 la k0, plat_wired_tlb_setup
111 jalr k0
112 nop
113
114
115 la t0, gp_regs
116 lw fp, 44(t0)
117 lw sp, 40(t0)
118 lw gp, 36(t0)
119 lw s7, 32(t0)
120 lw s6, 28(t0)
121 lw s5, 24(t0)
122 lw s4, 20(t0)
123 lw s3, 16(t0)
124 lw s2, 12(t0)
125 lw s1, 8(t0)
126 lw s0, 4(t0)
127 lw ra, 0(t0)
128
129
130 lw t1, 48(t0)
131 mtc0 t1, CP0_STATUS
132
133
134 li v0, 0
135 jr ra
136 nop
137
138 END(brcm_pm_do_s3)