~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/mips/alchemy/common/sleeper.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0-or-later */
  2 /*
  3  * Copyright 2002 Embedded Edge, LLC
  4  * Author: dan@embeddededge.com
  5  *
  6  * Sleep helper for Au1xxx sleep mode.
  7  */
  8 
  9 #include <asm/asm.h>
 10 #include <asm/mipsregs.h>
 11 #include <asm/regdef.h>
 12 #include <asm/stackframe.h>
 13 
 14         .extern __flush_cache_all
 15 
 16         .text
 17         .set noreorder
 18         .set noat
 19         .align  5
 20 
 21 
 22 /* preparatory stuff */
 23 .macro  SETUP_SLEEP
 24         subu    sp, PT_SIZE
 25         sw      $1, PT_R1(sp)
 26         sw      $2, PT_R2(sp)
 27         sw      $3, PT_R3(sp)
 28         sw      $4, PT_R4(sp)
 29         sw      $5, PT_R5(sp)
 30         sw      $6, PT_R6(sp)
 31         sw      $7, PT_R7(sp)
 32         sw      $16, PT_R16(sp)
 33         sw      $17, PT_R17(sp)
 34         sw      $18, PT_R18(sp)
 35         sw      $19, PT_R19(sp)
 36         sw      $20, PT_R20(sp)
 37         sw      $21, PT_R21(sp)
 38         sw      $22, PT_R22(sp)
 39         sw      $23, PT_R23(sp)
 40         sw      $26, PT_R26(sp)
 41         sw      $27, PT_R27(sp)
 42         sw      $28, PT_R28(sp)
 43         sw      $30, PT_R30(sp)
 44         sw      $31, PT_R31(sp)
 45         mfc0    k0, CP0_STATUS
 46         sw      k0, 0x20(sp)
 47         mfc0    k0, CP0_CONTEXT
 48         sw      k0, 0x1c(sp)
 49         mfc0    k0, CP0_PAGEMASK
 50         sw      k0, 0x18(sp)
 51         mfc0    k0, CP0_CONFIG
 52         sw      k0, 0x14(sp)
 53 
 54         /* flush caches to make sure context is in memory */
 55         la      t1, __flush_cache_all
 56         lw      t0, 0(t1)
 57         jalr    t0
 58          nop
 59 
 60         /* Now set up the scratch registers so the boot rom will
 61          * return to this point upon wakeup.
 62          * sys_scratch0 : SP
 63          * sys_scratch1 : RA
 64          */
 65         lui     t3, 0xb190              /* sys_xxx */
 66         sw      sp, 0x0018(t3)
 67         la      k0, alchemy_sleep_wakeup        /* resume path */
 68         sw      k0, 0x001c(t3)
 69 .endm
 70 
 71 .macro  DO_SLEEP
 72         /* put power supply and processor to sleep */
 73         sw      zero, 0x0078(t3)        /* sys_slppwr */
 74         sync
 75         sw      zero, 0x007c(t3)        /* sys_sleep */
 76         sync
 77         nop
 78         nop
 79         nop
 80         nop
 81         nop
 82         nop
 83         nop
 84         nop
 85 .endm
 86 
 87 /* sleep code for Au1000/Au1100/Au1500 memory controller type */
 88 LEAF(alchemy_sleep_au1000)
 89 
 90         SETUP_SLEEP
 91 
 92         /* cache following instructions, as memory gets put to sleep */
 93         la      t0, 1f
 94         .set    arch=r4000
 95         cache   0x14, 0(t0)
 96         cache   0x14, 32(t0)
 97         cache   0x14, 64(t0)
 98         cache   0x14, 96(t0)
 99         .set    mips0
100 
101 1:      lui     a0, 0xb400              /* mem_xxx */
102         sw      zero, 0x001c(a0)        /* Precharge */
103         sync
104         sw      zero, 0x0020(a0)        /* Auto Refresh */
105         sync
106         sw      zero, 0x0030(a0)        /* Sleep */
107         sync
108 
109         DO_SLEEP
110 
111 END(alchemy_sleep_au1000)
112 
113 /* sleep code for Au1550/Au1200 memory controller type */
114 LEAF(alchemy_sleep_au1550)
115 
116         SETUP_SLEEP
117 
118         /* cache following instructions, as memory gets put to sleep */
119         la      t0, 1f
120         .set    arch=r4000
121         cache   0x14, 0(t0)
122         cache   0x14, 32(t0)
123         cache   0x14, 64(t0)
124         cache   0x14, 96(t0)
125         .set    mips0
126 
127 1:      lui     a0, 0xb400              /* mem_xxx */
128         sw      zero, 0x08c0(a0)        /* Precharge */
129         sync
130         sw      zero, 0x08d0(a0)        /* Self Refresh */
131         sync
132 
133         /* wait for sdram to enter self-refresh mode */
134         lui     t0, 0x0100
135 2:      lw      t1, 0x0850(a0)          /* mem_sdstat */
136         and     t2, t1, t0
137         beq     t2, zero, 2b
138          nop
139 
140         /* disable SDRAM clocks */
141         lui     t0, 0xcfff
142         ori     t0, t0, 0xffff
143         lw      t1, 0x0840(a0)          /* mem_sdconfiga */
144         and     t1, t0, t1              /* clear CE[1:0] */
145         sw      t1, 0x0840(a0)          /* mem_sdconfiga */
146         sync
147 
148         DO_SLEEP
149 
150 END(alchemy_sleep_au1550)
151 
152 /* sleepcode for Au1300 memory controller type */
153 LEAF(alchemy_sleep_au1300)
154 
155         SETUP_SLEEP
156 
157         /* cache following instructions, as memory gets put to sleep */
158         la      t0, 2f
159         la      t1, 4f
160         subu    t2, t1, t0
161 
162         .set    arch=r4000
163 
164 1:      cache   0x14, 0(t0)
165         subu    t2, t2, 32
166         bgez    t2, 1b
167          addu   t0, t0, 32
168 
169         .set    mips0
170 
171 2:      lui     a0, 0xb400              /* mem_xxx */
172 
173         /* disable all ports in mem_sdportcfga */
174         sw      zero, 0x868(a0)         /* mem_sdportcfga */
175         sync
176 
177         /* disable ODT */
178         li      t0, 0x03010000
179         sw      t0, 0x08d8(a0)          /* mem_sdcmd0 */
180         sw      t0, 0x08dc(a0)          /* mem_sdcmd1 */
181         sync
182 
183         /* precharge */
184         li      t0, 0x23000400
185         sw      t0, 0x08dc(a0)          /* mem_sdcmd1 */
186         sw      t0, 0x08d8(a0)          /* mem_sdcmd0 */
187         sync
188 
189         /* auto refresh */
190         sw      zero, 0x08c8(a0)        /* mem_sdautoref */
191         sync
192 
193         /* block access to the DDR */
194         lw      t0, 0x0848(a0)          /* mem_sdconfigb */
195         li      t1, (1 << 7 | 0x3F)
196         or      t0, t0, t1
197         sw      t0, 0x0848(a0)          /* mem_sdconfigb */
198         sync
199 
200         /* issue the Self Refresh command */
201         li      t0, 0x10000000
202         sw      t0, 0x08dc(a0)          /* mem_sdcmd1 */
203         sw      t0, 0x08d8(a0)          /* mem_sdcmd0 */
204         sync
205 
206         /* wait for sdram to enter self-refresh mode */
207         lui     t0, 0x0300
208 3:      lw      t1, 0x0850(a0)          /* mem_sdstat */
209         and     t2, t1, t0
210         bne     t2, t0, 3b
211          nop
212 
213         /* disable SDRAM clocks */
214         li      t0, ~(3<<28)
215         lw      t1, 0x0840(a0)          /* mem_sdconfiga */
216         and     t1, t1, t0              /* clear CE[1:0] */
217         sw      t1, 0x0840(a0)          /* mem_sdconfiga */
218         sync
219 
220         DO_SLEEP
221 4:
222 
223 END(alchemy_sleep_au1300)
224 
225 
226         /* This is where we return upon wakeup.
227          * Reload all of the registers and return.
228          */
229 LEAF(alchemy_sleep_wakeup)
230         lw      k0, 0x20(sp)
231         mtc0    k0, CP0_STATUS
232         lw      k0, 0x1c(sp)
233         mtc0    k0, CP0_CONTEXT
234         lw      k0, 0x18(sp)
235         mtc0    k0, CP0_PAGEMASK
236         lw      k0, 0x14(sp)
237         mtc0    k0, CP0_CONFIG
238 
239         /* We need to catch the early Alchemy SOCs with
240          * the write-only Config[OD] bit and set it back to one...
241          */
242         jal     au1x00_fixup_config_od
243          nop
244         lw      $1, PT_R1(sp)
245         lw      $2, PT_R2(sp)
246         lw      $3, PT_R3(sp)
247         lw      $4, PT_R4(sp)
248         lw      $5, PT_R5(sp)
249         lw      $6, PT_R6(sp)
250         lw      $7, PT_R7(sp)
251         lw      $16, PT_R16(sp)
252         lw      $17, PT_R17(sp)
253         lw      $18, PT_R18(sp)
254         lw      $19, PT_R19(sp)
255         lw      $20, PT_R20(sp)
256         lw      $21, PT_R21(sp)
257         lw      $22, PT_R22(sp)
258         lw      $23, PT_R23(sp)
259         lw      $26, PT_R26(sp)
260         lw      $27, PT_R27(sp)
261         lw      $28, PT_R28(sp)
262         lw      $30, PT_R30(sp)
263         lw      $31, PT_R31(sp)
264         jr      ra
265          addiu  sp, PT_SIZE
266 END(alchemy_sleep_wakeup)

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php