/* * Copyright (c) 2018, Renesas Electronics Corporation. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include "rcar_def.h" .global rcar_pwrc_switch_stack .global rcar_pwrc_save_generic_timer .global rcar_pwrc_restore_generic_timer #define OFFSET_SP_X9_X10 (0x00) #define OFFSET_CNTFID0 (0x10) #define OFFSET_CNTPCT_EL0 (0x18) #define OFFSET_TIMER_COUNT (0x20) /* * x0 : jump address, * x1 : stack address, * x2 : arg, * x3 : stack address (temporary) */ func rcar_pwrc_switch_stack /* lr to stack */ stp x29, x30, [sp,#-16] /* change stack pointer */ mov x3, sp mov sp, x1 /* save stack pointer */ sub sp, sp, #16 stp x0, x3, [sp] /* data synchronization barrier */ dsb sy /* jump to code */ mov x1, x0 mov x0, x2 blr x1 /* load stack pointer */ ldp x0, x2, [sp,#0] /* change stack pointer */ mov sp, x2 /* return */ ldp x29, x30, [sp,#-16] ret endfunc rcar_pwrc_switch_stack /* x0 : stack pointer base address */ func rcar_pwrc_save_generic_timer stp x9, x10, [x0, #OFFSET_SP_X9_X10] /* save CNTFID0 and cntpct_el0 */ mov_imm x10, (RCAR_CNTC_BASE + CNTFID_OFF) ldr x9, [x10] mrs x10, cntpct_el0 stp x9, x10, [x0, #OFFSET_CNTFID0] ldp x9, x10, [x0, #OFFSET_SP_X9_X10] ret endfunc rcar_pwrc_save_generic_timer /* x0 : Stack pointer base address */ func rcar_pwrc_restore_generic_timer stp x9, x10, [x0, #OFFSET_SP_X9_X10] /* restore CNTFID0 and cntpct_el0 */ ldr x10, [x0, #OFFSET_CNTFID0] mov_imm x9, (RCAR_CNTC_BASE + CNTFID_OFF) str x10, [x9] ldp x9, x10, [x0, #OFFSET_CNTPCT_EL0] add x9, x9, x10 str x9, [x0, #OFFSET_TIMER_COUNT] ldp x9, x10, [x0, #OFFSET_SP_X9_X10] ret endfunc rcar_pwrc_restore_generic_timer