413 lines
10 KiB
ArmAsm
413 lines
10 KiB
ArmAsm
|
/*
|
|||
|
* Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
|
|||
|
*
|
|||
|
* Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
|
|||
|
* the the People's Republic of China and other countries.
|
|||
|
* All Allwinner Technology Co.,Ltd. trademarks are used with permission.
|
|||
|
*
|
|||
|
* DISCLAIMER
|
|||
|
* THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
|
|||
|
* IF YOU NEED TO INTEGRATE THIRD PARTY’S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
|
|||
|
* IN ALLWINNERS’SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
|
|||
|
* ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
|
|||
|
* ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
|
|||
|
* COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
|
|||
|
* YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY’S TECHNOLOGY.
|
|||
|
*
|
|||
|
*
|
|||
|
* THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
|
|||
|
* PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
|
|||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
|
|||
|
* THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
|
|||
|
* OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|||
|
* IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|||
|
* LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
|
|||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
*/
|
|||
|
.section .bss
|
|||
|
.align 2
|
|||
|
.globl g_sleep_context
|
|||
|
.globl g_sleep_flag
|
|||
|
|
|||
|
g_sleep_context:
|
|||
|
.space 768
|
|||
|
|
|||
|
g_sleep_flag:
|
|||
|
.long 0
|
|||
|
|
|||
|
.macro save_csr name index
|
|||
|
csrr t1, \name
|
|||
|
sw t1, \index * 4(t0)
|
|||
|
.endm
|
|||
|
|
|||
|
.macro restore_csr name index
|
|||
|
lw t1, \index * 4(t0)
|
|||
|
csrw \name, t1
|
|||
|
.endm
|
|||
|
|
|||
|
.macro general_reg option base
|
|||
|
la t0, \base
|
|||
|
\option x0, 0*4(t0)
|
|||
|
\option ra, 1*4(t0)
|
|||
|
\option sp, 2*4(t0)
|
|||
|
\option gp, 3*4(t0)
|
|||
|
\option tp, 4*4(t0)
|
|||
|
# \option t0, 5*4(t0)
|
|||
|
\option t1, 6*4(t0)
|
|||
|
\option x7, 7*4(t0)
|
|||
|
\option x8, 8*4(t0)
|
|||
|
\option x9, 9*4(t0)
|
|||
|
\option x10, 10*4(t0)
|
|||
|
\option x11, 11*4(t0)
|
|||
|
\option x12, 12*4(t0)
|
|||
|
\option x13, 13*4(t0)
|
|||
|
\option x14, 14*4(t0)
|
|||
|
\option x15, 15*4(t0)
|
|||
|
\option x16, 16*4(t0)
|
|||
|
\option x17, 17*4(t0)
|
|||
|
\option x18, 18*4(t0)
|
|||
|
\option x19, 19*4(t0)
|
|||
|
\option x20, 20*4(t0)
|
|||
|
\option x21, 21*4(t0)
|
|||
|
\option x22, 22*4(t0)
|
|||
|
\option x23, 23*4(t0)
|
|||
|
\option x24, 24*4(t0)
|
|||
|
\option x25, 25*4(t0)
|
|||
|
\option x26, 26*4(t0)
|
|||
|
\option x27, 27*4(t0)
|
|||
|
\option x28, 28*4(t0)
|
|||
|
\option x29, 29*4(t0)
|
|||
|
\option x30, 30*4(t0)
|
|||
|
\option x31, 31*4(t0)
|
|||
|
addi t0, t0, 32 * 4
|
|||
|
.endm
|
|||
|
|
|||
|
.macro float_reg option base
|
|||
|
\option ft0, 0*8(\base)
|
|||
|
\option ft1, 1*8(\base)
|
|||
|
\option ft2, 2*8(\base)
|
|||
|
\option ft3, 3*8(\base)
|
|||
|
\option ft4, 4*8(\base)
|
|||
|
\option ft5, 5*8(\base)
|
|||
|
\option ft6, 6*8(\base)
|
|||
|
\option ft7, 7*8(\base)
|
|||
|
\option fs0, 8*8(\base)
|
|||
|
\option fs1, 9*8(\base)
|
|||
|
\option fa0, 10*8(\base)
|
|||
|
\option fa1, 11*8(\base)
|
|||
|
\option fa2, 12*8(\base)
|
|||
|
\option fa3, 13*8(\base)
|
|||
|
\option fa4, 14*8(\base)
|
|||
|
\option fa5, 15*8(\base)
|
|||
|
\option fa6, 16*8(\base)
|
|||
|
\option fa7, 17*8(\base)
|
|||
|
\option fs2, 18*8(\base)
|
|||
|
\option fs3, 19*8(\base)
|
|||
|
\option fs4, 20*8(\base)
|
|||
|
\option fs5, 21*8(\base)
|
|||
|
\option fs6, 22*8(\base)
|
|||
|
\option fs7, 23*8(\base)
|
|||
|
\option fs8, 24*8(\base)
|
|||
|
\option fs9, 25*8(\base)
|
|||
|
\option fs10, 26*8(\base)
|
|||
|
\option fs11, 27*8(\base)
|
|||
|
\option ft8, 28*8(\base)
|
|||
|
\option ft9, 29*8(\base)
|
|||
|
\option ft10, 30*8(\base)
|
|||
|
\option ft11, 31*8(\base)
|
|||
|
addi \base, \base, 8*32
|
|||
|
.endm
|
|||
|
|
|||
|
.text
|
|||
|
.align 2
|
|||
|
.globl cpu_suspend
|
|||
|
.type cpu_suspend, %function
|
|||
|
cpu_suspend:
|
|||
|
# save t0, t1 value to stack
|
|||
|
sw t0, -4(sp)
|
|||
|
sw t1, -8(sp)
|
|||
|
# save t0
|
|||
|
la t0, g_sleep_context
|
|||
|
lw t1, -4(sp)
|
|||
|
sw t1, 5 * 4(t0)
|
|||
|
# restore t1
|
|||
|
lw t1, -8(sp)
|
|||
|
|
|||
|
# save register excep t0
|
|||
|
general_reg sw g_sleep_context
|
|||
|
|
|||
|
/* Save M-mode Exception Setting Register */
|
|||
|
save_csr mstatus 0
|
|||
|
save_csr mie 1
|
|||
|
save_csr mtvec 2
|
|||
|
save_csr mtvt 3
|
|||
|
addi t0, t0, 4*4
|
|||
|
/* Save M-mode Exception Handling Register */
|
|||
|
save_csr mscratch 0
|
|||
|
save_csr mepc 1
|
|||
|
save_csr mcause 2
|
|||
|
save_csr mtval 3
|
|||
|
save_csr mip 4
|
|||
|
save_csr mnxti 5
|
|||
|
save_csr mscratchcsw 6
|
|||
|
save_csr mscratchcswl 7
|
|||
|
addi t0, t0, 4*8
|
|||
|
|
|||
|
#ifdef CONFIG_ARCH_RISCV_FPU
|
|||
|
float_reg fsd t0
|
|||
|
|
|||
|
/* save float status register */
|
|||
|
save_csr fflags 0
|
|||
|
save_csr frm 1
|
|||
|
save_csr fcsr 2
|
|||
|
save_csr fxcr 3
|
|||
|
addi t0, t0, 4*4
|
|||
|
#endif
|
|||
|
/* Save M-mode Memory Protect Register */
|
|||
|
save_csr pmpcfg0 0
|
|||
|
save_csr pmpcfg1 1
|
|||
|
save_csr pmpcfg2 2
|
|||
|
save_csr pmpcfg3 3
|
|||
|
save_csr pmpaddr0 4
|
|||
|
save_csr pmpaddr1 5
|
|||
|
save_csr pmpaddr2 6
|
|||
|
save_csr pmpaddr3 7
|
|||
|
save_csr pmpaddr4 8
|
|||
|
save_csr pmpaddr5 9
|
|||
|
save_csr pmpaddr6 10
|
|||
|
save_csr pmpaddr7 11
|
|||
|
save_csr pmpaddr8 12
|
|||
|
save_csr pmpaddr9 13
|
|||
|
save_csr pmpaddr10 14
|
|||
|
save_csr pmpaddr11 15
|
|||
|
save_csr pmpaddr12 16
|
|||
|
save_csr pmpaddr13 17
|
|||
|
save_csr pmpaddr14 18
|
|||
|
save_csr pmpaddr15 19
|
|||
|
addi t0, t0, 4*20
|
|||
|
|
|||
|
/* Save M-mode Perf and Counter Register */
|
|||
|
save_csr mcounteren 0
|
|||
|
save_csr mcountinhibit 1
|
|||
|
save_csr mhpmevent3 2
|
|||
|
save_csr mhpmevent4 3
|
|||
|
save_csr mhpmevent5 4
|
|||
|
save_csr mhpmevent6 5
|
|||
|
save_csr mhpmevent7 6
|
|||
|
save_csr mhpmevent8 7
|
|||
|
save_csr mhpmevent9 8
|
|||
|
save_csr mhpmevent10 9
|
|||
|
save_csr mhpmevent11 10
|
|||
|
save_csr mhpmevent12 11
|
|||
|
save_csr mhpmevent13 12
|
|||
|
save_csr mhpmevent14 13
|
|||
|
save_csr mhpmevent15 14
|
|||
|
save_csr mhpmevent16 15
|
|||
|
save_csr mhpmevent17 16
|
|||
|
save_csr mcycle 17
|
|||
|
save_csr minstret 18
|
|||
|
save_csr mcycleh 19
|
|||
|
save_csr minstreth 20
|
|||
|
save_csr mhpmcounter3 21
|
|||
|
save_csr mhpmcounter4 22
|
|||
|
save_csr mhpmcounter5 23
|
|||
|
save_csr mhpmcounter6 24
|
|||
|
save_csr mhpmcounter7 25
|
|||
|
save_csr mhpmcounter8 26
|
|||
|
save_csr mhpmcounter9 27
|
|||
|
save_csr mhpmcounter10 28
|
|||
|
save_csr mhpmcounter11 29
|
|||
|
save_csr mhpmcounter12 30
|
|||
|
save_csr mhpmcounter13 31
|
|||
|
save_csr mhpmcounter14 32
|
|||
|
save_csr mhpmcounter15 33
|
|||
|
save_csr mhpmcounter16 34
|
|||
|
save_csr mhpmcounter17 35
|
|||
|
save_csr mhpmcounter3h 36
|
|||
|
save_csr mhpmcounter4h 37
|
|||
|
save_csr mhpmcounter5h 38
|
|||
|
save_csr mhpmcounter6h 39
|
|||
|
save_csr mhpmcounter7h 40
|
|||
|
save_csr mhpmcounter8h 41
|
|||
|
save_csr mhpmcounter9h 42
|
|||
|
save_csr mhpmcounter10h 43
|
|||
|
save_csr mhpmcounter11h 44
|
|||
|
save_csr mhpmcounter12h 45
|
|||
|
save_csr mhpmcounter13h 46
|
|||
|
save_csr mhpmcounter14h 47
|
|||
|
save_csr mhpmcounter15h 48
|
|||
|
save_csr mhpmcounter16h 49
|
|||
|
save_csr mhpmcounter17h 50
|
|||
|
addi t0, t0, 4*51
|
|||
|
|
|||
|
/* Save M-mode Control vs Status Register */
|
|||
|
save_csr mxstatus 0
|
|||
|
save_csr mhcr 1
|
|||
|
save_csr mhint 2
|
|||
|
save_csr mraddr 3
|
|||
|
save_csr mexstatus 4
|
|||
|
save_csr mnmicause 5
|
|||
|
save_csr mnmipc 6
|
|||
|
addi t0, t0, 4*7
|
|||
|
/* Save Debug Register */
|
|||
|
# save_csr dcsr 0
|
|||
|
# save_csr dpc 1
|
|||
|
|
|||
|
/* Updata sleep flag */
|
|||
|
la t0, g_sleep_flag
|
|||
|
li t1, 1
|
|||
|
sw t1, 0(t0)
|
|||
|
|
|||
|
/* restore the scene */
|
|||
|
general_reg lw g_sleep_context
|
|||
|
/* restore t0 value */
|
|||
|
lw t0, -4(sp)
|
|||
|
|
|||
|
ret
|
|||
|
|
|||
|
.align 2
|
|||
|
.globl cpu_resume
|
|||
|
.type cpu_resume, %function
|
|||
|
cpu_resume:
|
|||
|
/* restore general register later */
|
|||
|
la t0, g_sleep_context
|
|||
|
addi t0, t0, 4*32
|
|||
|
/* Save M-mode Exception Setting Register */
|
|||
|
restore_csr mstatus 0
|
|||
|
restore_csr mie 1
|
|||
|
restore_csr mtvec 2
|
|||
|
restore_csr mtvt 3
|
|||
|
addi t0, t0, 4*4
|
|||
|
|
|||
|
/* Save M-mode Exception Handling Register */
|
|||
|
restore_csr mscratch 0
|
|||
|
restore_csr mepc 1
|
|||
|
restore_csr mcause 2
|
|||
|
restore_csr mtval 3
|
|||
|
restore_csr mip 4
|
|||
|
# restore_csr mnxti 5
|
|||
|
restore_csr mscratchcsw 6
|
|||
|
restore_csr mscratchcswl 7
|
|||
|
addi t0, t0, 4*8
|
|||
|
|
|||
|
#ifdef CONFIG_ARCH_RISCV_FPU
|
|||
|
float_reg fld t0
|
|||
|
|
|||
|
/* save float status register */
|
|||
|
restore_csr fflags 0
|
|||
|
restore_csr frm 1
|
|||
|
restore_csr fcsr 2
|
|||
|
restore_csr fxcr 3
|
|||
|
addi t0, t0, 4*4
|
|||
|
#endif
|
|||
|
|
|||
|
/* Save M-mode Memory Protect Register */
|
|||
|
restore_csr pmpcfg0 0
|
|||
|
restore_csr pmpcfg1 1
|
|||
|
restore_csr pmpcfg2 2
|
|||
|
restore_csr pmpcfg3 3
|
|||
|
restore_csr pmpaddr0 4
|
|||
|
restore_csr pmpaddr1 5
|
|||
|
restore_csr pmpaddr2 6
|
|||
|
restore_csr pmpaddr3 7
|
|||
|
restore_csr pmpaddr4 8
|
|||
|
restore_csr pmpaddr5 9
|
|||
|
restore_csr pmpaddr6 10
|
|||
|
restore_csr pmpaddr7 11
|
|||
|
restore_csr pmpaddr8 12
|
|||
|
restore_csr pmpaddr9 13
|
|||
|
restore_csr pmpaddr10 14
|
|||
|
restore_csr pmpaddr11 15
|
|||
|
restore_csr pmpaddr12 16
|
|||
|
restore_csr pmpaddr13 17
|
|||
|
restore_csr pmpaddr14 18
|
|||
|
restore_csr pmpaddr15 19
|
|||
|
addi t0, t0, 4*20
|
|||
|
|
|||
|
/* Save M-mode Perf and Counter Register */
|
|||
|
restore_csr mcounteren 0
|
|||
|
restore_csr mcountinhibit 1
|
|||
|
restore_csr mhpmevent3 2
|
|||
|
restore_csr mhpmevent4 3
|
|||
|
restore_csr mhpmevent5 4
|
|||
|
restore_csr mhpmevent6 5
|
|||
|
restore_csr mhpmevent7 6
|
|||
|
restore_csr mhpmevent8 7
|
|||
|
restore_csr mhpmevent9 8
|
|||
|
restore_csr mhpmevent10 9
|
|||
|
restore_csr mhpmevent11 10
|
|||
|
restore_csr mhpmevent12 11
|
|||
|
restore_csr mhpmevent13 12
|
|||
|
restore_csr mhpmevent14 13
|
|||
|
restore_csr mhpmevent15 14
|
|||
|
restore_csr mhpmevent16 15
|
|||
|
restore_csr mhpmevent17 16
|
|||
|
restore_csr mcycle 17
|
|||
|
restore_csr minstret 18
|
|||
|
restore_csr mcycleh 19
|
|||
|
restore_csr minstreth 20
|
|||
|
restore_csr mhpmcounter3 21
|
|||
|
restore_csr mhpmcounter4 22
|
|||
|
restore_csr mhpmcounter5 23
|
|||
|
restore_csr mhpmcounter6 24
|
|||
|
restore_csr mhpmcounter7 25
|
|||
|
restore_csr mhpmcounter8 26
|
|||
|
restore_csr mhpmcounter9 27
|
|||
|
restore_csr mhpmcounter10 28
|
|||
|
restore_csr mhpmcounter11 29
|
|||
|
restore_csr mhpmcounter12 30
|
|||
|
restore_csr mhpmcounter13 31
|
|||
|
restore_csr mhpmcounter14 32
|
|||
|
restore_csr mhpmcounter15 33
|
|||
|
restore_csr mhpmcounter16 34
|
|||
|
restore_csr mhpmcounter17 35
|
|||
|
restore_csr mhpmcounter3h 36
|
|||
|
restore_csr mhpmcounter4h 37
|
|||
|
restore_csr mhpmcounter5h 38
|
|||
|
restore_csr mhpmcounter6h 39
|
|||
|
restore_csr mhpmcounter7h 40
|
|||
|
restore_csr mhpmcounter8h 41
|
|||
|
restore_csr mhpmcounter9h 42
|
|||
|
restore_csr mhpmcounter10h 43
|
|||
|
restore_csr mhpmcounter11h 44
|
|||
|
restore_csr mhpmcounter12h 45
|
|||
|
restore_csr mhpmcounter13h 46
|
|||
|
restore_csr mhpmcounter14h 47
|
|||
|
restore_csr mhpmcounter15h 48
|
|||
|
restore_csr mhpmcounter16h 49
|
|||
|
restore_csr mhpmcounter17h 50
|
|||
|
addi t0, t0, 4*51
|
|||
|
|
|||
|
/* Save M-mode Control vs Status Register */
|
|||
|
restore_csr mxstatus 0
|
|||
|
restore_csr mhcr 1
|
|||
|
restore_csr mhint 2
|
|||
|
restore_csr mraddr 3
|
|||
|
restore_csr mexstatus 4
|
|||
|
restore_csr mnmicause 5
|
|||
|
restore_csr mnmipc 6
|
|||
|
addi t0, t0, 4*7
|
|||
|
|
|||
|
/* Restore Debug Register */
|
|||
|
# restore_csr dcsr 0
|
|||
|
# restore_csr dpc 1
|
|||
|
|
|||
|
/* Updata sleep flag */
|
|||
|
la t0, g_sleep_flag
|
|||
|
sw x0, 0(t0)
|
|||
|
|
|||
|
/* restore general register */
|
|||
|
general_reg lw g_sleep_context
|
|||
|
/* restore t0 register */
|
|||
|
sw t1, -4(sp)
|
|||
|
la t1, g_sleep_context
|
|||
|
lw t0, 5 * 4(t1)
|
|||
|
lw t1, -4(sp)
|
|||
|
|
|||
|
ret
|